云自无心水自闲

天平山上白云泉,云自无心水自闲。何必奔冲山下去,更添波浪向人间!
posts - 288, comments - 524, trackbacks - 0, articles - 6
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

JRebal(原名JavaRebel)破解小记

Posted on 2009-10-15 20:09 云自无心水自闲 阅读(11287) 评论(16)  编辑  收藏 所属分类: Java心得体会

JavaRebel是一个工具,主要是用于热加载,比如说在Tomcat之类的应用服务器中,更新了class或者某些资源文件,使用了JRebel之后,就不需要重新启动应用服务器。这对于开发的人来说,是特别方便的。当然Java也提供了HotSpot的JVM,但是如果你修改的类中有方法名称变动的话,HotSpot就无能为力了,必须要重要启动应用服务器。
这里有一点先声明一下,本文只是破解仅限于学习和研究使用,勿用于其他用途。
第一步当然是下载JRebel
下载地址:http://www.zeroturnaround.com/jrebel/download/
下载下来的是一个Zip压缩包,打开之后会发现一个jrebel.jar,这就是其最重要的运行包了。其他都是一些文档和插件。
第二步,是进行反编译。
我推荐一个工具:http://java.decompiler.free.fr/,分成Eclipse插件和单独的运行程序两种,我下载的是单独的运行程序,只有一个绿色的exe文件,点击后直接运行。
看了一下,最显眼的自然是UserLicense类了。

 1package com.zeroturnaround.licensing;
 2
 3import java.io.Serializable;
 4import java.util.Map;
 5
 6public class UserLicense
 7  implements Serializable
 8{
 9  static final long serialVersionUID = 1L;
10  private byte[] signature;
11  private byte[] license;
12  private Map dataMap;
13
14  public byte[] getSignature()
15  {
16    return this.signature;
17  }

18
19  public void setSignature(byte[] paramArrayOfByte) {
20    this.signature = paramArrayOfByte;
21  }

22
23  public byte[] getLicense() {
24    return this.license;
25  }

26
27  public void setLicense(byte[] paramArrayOfByte) {
28    this.license = paramArrayOfByte;
29  }

30}

31

 

然后就找到了调用getLicense方法的jS类(名字很奇怪,因为是混淆过的原因,jS类反编译后的源码附在最后面了)
这个类中很明确地显示了License的获取方法。
首先是:jreble.lic文件,用winrar打开jrebel.jar就看到这个文件了。
从源码来看,UserLicense是用ObjectInputStream通过ReadObject得到了。
然后,属性license里面其实是一个Map,用ObjectInputStream从ByteArrayInputSteam中通过ReadObject得到。于是写了下面这样的测试代码

 1package temp.jrebel;
 2
 3import java.io.BufferedInputStream;
 4import java.io.BufferedOutputStream;
 5import java.io.ByteArrayInputStream;
 6import java.io.ByteArrayOutputStream;
 7import java.io.File;
 8import java.io.FileInputStream;
 9import java.io.FileOutputStream;
10import java.io.IOException;
11import java.io.ObjectInputStream;
12import java.io.ObjectOutputStream;
13import java.util.Calendar;
14import java.util.GregorianCalendar;
15import java.util.Iterator;
16import java.util.Map;
17import junit.framework.Assert;
18import org.junit.Test;
19import com.zeroturnaround.licensing.UserLicense;
20
21public class ParseLicense {
22    @Test
23    public void parseLicenseFile() {
24        Object localObject1 = null;
25        try {
26            System.out.println("start to get lic file.");
27            File localFile2 = new File("d:\\temp\\jrebel.lic");
28            Assert.assertNotNull(localFile2);
29           
30            System.out.println("start to get objectInputStream.");
31            localObject1 = new ObjectInputStream(new BufferedInputStream(
32                    new FileInputStream(localFile2)));
33            Assert.assertNotNull(localObject1);
34           
35            System.out.println("start to get userLicense.");
36            UserLicense localUserLicense1 = (UserLicense)((ObjectInputStream)localObject1).readObject();
37            Assert.assertNotNull(localUserLicense1);
38           
39            System.out.println("start to get ObjectInputStream2.");
40            ObjectInputStream localObjectInputStream = new ObjectInputStream(new ByteArrayInputStream(localUserLicense1.getLicense()));
41            Assert.assertNotNull(localObjectInputStream);
42           
43            System.out.println("start to get localMap.");
44            Map localMap = (Map)localObjectInputStream.readObject();
45            Assert.assertNotNull(localMap);
46           
47            System.out.println("start tot output value.");
48            for ( Iterator<?> iter = localMap.keySet().iterator(); iter.hasNext(); ) {
49                String key = (String)iter.next();
50                System.out.println("key: " + key + ", value: " + localMap.get(key));
51            }

52
53        }
 catch (Exception e) {
54            e.printStackTrace();
55            Assert.fail("faile to parse license. ");
56        }
 finally {
57            if (localObject1 != null{
58                try {
59                    ((ObjectInputStream) localObject1).close();
60                }
 catch (IOException localIOException12) {
61                }

62            }

63        }

64
65    }

66}

67
68


Concole中果然如我所愿地,把Map里的值都打印出来了。到了这一步,剩下的就简单了,把Map里面的validateUntil属性的日期换一下,重新生成一个License文件就行了。
把上面的代码修改一下,很容易地就生成了新的License文件。
原来License里面的试用期只有一个月,比如,我是2009-10-15下载的,那么这个jrebel.lic文件里的validateUntil日期就是11月14日,现在我把他改成了明年元旦。

 

  1package temp.jrebel;
  2
  3import java.io.BufferedInputStream;
  4import java.io.BufferedOutputStream;
  5import java.io.ByteArrayInputStream;
  6import java.io.ByteArrayOutputStream;
  7import java.io.File;
  8import java.io.FileInputStream;
  9import java.io.FileOutputStream;
 10import java.io.IOException;
 11import java.io.ObjectInputStream;
 12import java.io.ObjectOutputStream;
 13import java.util.Calendar;
 14import java.util.GregorianCalendar;
 15import java.util.Iterator;
 16import java.util.Map;
 17import junit.framework.Assert;
 18import org.junit.Test;
 19import com.zeroturnaround.licensing.UserLicense;
 20
 21public class ParseLicense {
 22    @Test
 23    public void parseLicenseFile() {
 24        Object localObject1 = null;
 25        try {
 26            System.out.println("start to get lic file.");
 27            File localFile2 = new File("d:\\temp\\jrebel.lic");
 28            Assert.assertNotNull(localFile2);
 29           
 30            System.out.println("start to get objectInputStream.");
 31            localObject1 = new ObjectInputStream(new BufferedInputStream(
 32                    new FileInputStream(localFile2)));
 33            Assert.assertNotNull(localObject1);
 34           
 35            System.out.println("start to get userLicense.");
 36            UserLicense localUserLicense1 = (UserLicense)((ObjectInputStream)localObject1).readObject();
 37            Assert.assertNotNull(localUserLicense1);
 38           
 39            System.out.println("start to get ObjectInputStream2.");
 40            ObjectInputStream localObjectInputStream = new ObjectInputStream(new ByteArrayInputStream(localUserLicense1.getLicense()));
 41            Assert.assertNotNull(localObjectInputStream);
 42           
 43            System.out.println("start to get localMap.");
 44            Map localMap = (Map)localObjectInputStream.readObject();
 45            Assert.assertNotNull(localMap);
 46           
 47            System.out.println("start tot output value.");
 48            for ( Iterator<?> iter = localMap.keySet().iterator(); iter.hasNext(); ) {
 49                String key = (String)iter.next();
 50                System.out.println("key: " + key + ", value: " + localMap.get(key));
 51            }

 52
 53           
 54            System.out.println("start to change date.");
 55            Calendar cal = new GregorianCalendar(20100101);
 56            localMap.put("validUntil", cal.getTime());
 57
 58            System.out.println("start to set a new date to license.");
 59            ByteArrayOutputStream out1 = new ByteArrayOutputStream();
 60            ObjectOutputStream out2 = new ObjectOutputStream(out1);
 61            out2.writeObject(localMap);
 62            out1.toByteArray();
 63            localUserLicense1.setLicense(out1.toByteArray());
 64            out1.close();
 65            out2.close();
 66
 67           
 68            System.out.println("start to get ObjectInputStream2.");
 69            localObjectInputStream = new ObjectInputStream(new ByteArrayInputStream(localUserLicense1.getLicense()));
 70            Assert.assertNotNull(localObjectInputStream);
 71           
 72            System.out.println("start to get localMap.");
 73            localMap = (Map)localObjectInputStream.readObject();
 74            Assert.assertNotNull(localMap);
 75           
 76            for ( Iterator<?> iter = localMap.keySet().iterator(); iter.hasNext(); ) {
 77                String key = (String)iter.next();
 78                System.out.println("key: " + key + ", value: " + localMap.get(key));
 79            }

 80
 81           
 82            String newLicenseFile = "d:\\temp\\new.lic";
 83            ObjectOutputStream out3 = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(newLicenseFile)));
 84            out3.writeObject(localUserLicense1);
 85            out3.close();
 86
 87        }
 catch (Exception e) {
 88            e.printStackTrace();
 89            Assert.fail("faile to parse license. ");
 90        }
 finally {
 91            if (localObject1 != null{
 92                try {
 93                    ((ObjectInputStream) localObject1).close();
 94                }
 catch (IOException localIOException12) {
 95                }

 96            }

 97        }

 98
 99    }

100}

101
102 
103

 

 

这是我用反编译工具反编译出来的部分源码:

/*     */ package com.zeroturnaround.javarebel;
/*     */ public class jS
/*     */   implements dn


/* 405 */     if (localUserLicense != null) {
/*     */       try {
/* 407 */         if (eO.a(localUserLicense)) {
/* 408 */           jdField_a_of_type_Int = 1;
/*     */         }
/* 410 */         ObjectInputStream localObjectInputStream = new ObjectInputStream(new ByteArrayInputStream(localUserLicense.getLicense()));
/* 411 */         localMap = (Map)localObjectInputStream.readObject();
/* 412 */         localObjectInputStream.close();
/*     */
/* 414 */         if ((!("JavaRebel".equals(localMap.get("Product")))) && (!("JRebel".equals(localMap.get("Product"))))) {
/* 415 */           jdField_a_of_type_Int = 0;
/*     */         }
/* 417 */         iH.log("License information: " + localMap);
/*     */
/* 420 */         boolean bool1 = Boolean.valueOf((String)localMap.get("commercial")).booleanValue();
/* 421 */         if ((jdField_a_of_type_Int == 1) && (bool1)) {
/* 422 */           jdField_a_of_type_Int = 3;
/*     */         }
/*     */
/* 425 */         localObject = (String)localMap.get("limited");
/*     */
/* 427 */         if ((localObject != null) && (jdField_a_of_type_Int == 1)) {
/* 428 */           if (((String)localObject).equals("true")) {
/* 429 */             jdField_a_of_type_Int = 2;
/* 430 */             jn.a("License: evaluation");
/*     */           }
/* 432 */           else if (((String)localObject).equals("scala")) {
/* 433 */             jdField_a_of_type_Int = 2;
/* 434 */             jdField_b_of_type_Int |= 1;
/* 435 */             jn.a("License: scala");
/*     */           }
/* 437 */           else if (((String)localObject).equals("liverebel")) {
/* 438 */             jdField_a_of_type_Int = 2;
/* 439 */             jdField_b_of_type_Int |= 2;
/* 440 */             jn.a("License: liverebel");
/*     */           }
/*     */         }
/* 443 */         if (jdField_a_of_type_Int == 1) {
/* 444 */           localDate2 = (Date)localMap.get("validUntil");
/* 445 */           localDate3 = (Date)localMap.get("validFrom");
/*     */         }
/* 447 */         else if (jdField_a_of_type_Int == 2) {
/* 448 */           localDate2 = (Date)localMap.get("limitedUntil");
/* 449 */           localDate3 = (Date)localMap.get("limitedFrom");
/*     */         }
/*     */
/* 452 */         if (c.contains(localMap.get("uid")))
/* 453 */           jdField_a_of_type_Int = 0;
/*     */       }
/*     */       catch (Exception localException1)
/*     */       {
/* 457 */         iH.log("Exception checking the JRebel License");
/* 458 */         localException1.printStackTrace();
/* 459 */         iH.error(localException1);
/*     */       }
/*     */     }
/*     */
/* 463 */     iH.echo();
/* 464 */     iH.echo("#############################################################");
/* 465 */     iH.echo();
/* 466 */     iH.echo(" JRebel " + str1 + " (" + ((jdField_a_of_type_JavaLangClass == null) ? (jS.jdField_a_of_type_JavaLangClass = a("com.zeroturnaround.javarebel.java4.Install")) : jdField_a_of_type_JavaLangClass).getPackage().getImplementationTitle() + ")");
/* 467 */     iH.echo(" (c) Copyright ZeroTurnaround, Ltd, 2007-2009. All rights reserved.");
/* 468 */     iH.echo();
/*     */
/* 470 */     if (gA.c()) {
/*     */       try {
/* 472 */         NumberFormat localNumberFormat = NumberFormat.getNumberInstance();
/* 473 */         localNumberFormat.setMinimumFractionDigits(0);
/* 474 */         localNumberFormat.setMaximumFractionDigits(1);
/*     */
/* 476 */         String str3 = localNumberFormat.format(cU.a() * 96.0D / 3600.0D);
/* 477 */         localObject = localNumberFormat.format(cU.a() * 195.0D / 3600.0D);
/*     */
/* 479 */         String str4 = localNumberFormat.format(cU.b() * 96.0D / 3600.0D);
/* 480 */         String str5 = localNumberFormat.format(cU.b() * 195.0D / 3600.0D);
/*     */
/* 482 */         String str6 = "" + (cU.c() + 1);
/* 483 */         String str7 = "" + (cU.c() + 1);
/*     */
/* 485 */         iH.echo(" A rough estimate: Over the last " + str6 + " days JRebel ");
/* 486 */         iH.echo(" prevented the need for at least " + cU.a() + " redeploys/restarts.");
/* 487 */         iH.echo(" Using industry standard build and redeploy times, ");
/* 488 */         iH.echo(" JRebel saved you between " + str3 + " and " + ((String)localObject) + " hours.");
/*     */
/* 490 */         if (cU.c() > 60) {
/* 491 */           iH.echo(" Over the last " + str7 + " days JRebel saved you");
/* 492 */           iH.echo(" between " + str4 + " and " + str5 + " hours.");
/*     */         }
/*     */
/* 495 */         iH.echo();
/*     */       }
/*     */       catch (Exception localException2) {
/* 498 */         iH.error(localException2);
/*     */       }
/*     */     }
/*     */
/* 502 */     if (jdField_a_of_type_Int == 3) {
/* 503 */       jdField_a_of_type_Boolean = true;
/*     */
/* 505 */       str2 = (String)localMap.get("Seats");
/*     */
/* 507 */       bool2 = ("1".equals(str2)) && (((localMap.get("Organization") == null) || ("".equals(localMap.get("Organization"))) || (((String)localMap.get("Organization")).equalsIgnoreCase("personal"))));
/*     */
/* 511 */       localObject = new StringBuffer(" This product is licensed to ");
/* 512 */       if ((bool2) && (localMap.get("Name") != null) && (!("".equals(localMap.get("Name"))))) {
/* 513 */         ((StringBuffer)localObject).append(localMap.get("Name"));
/*     */
/* 515 */         if ((localMap.get("Organization") != null) && (!("".equals(localMap.get("Organization"))))) {
/* 516 */           ((StringBuffer)localObject).append(" (");
/* 517 */           ((StringBuffer)localObject).append(localMap.get("Organization"));
/* 518 */           ((StringBuffer)localObject).append(") ");
/*     */         }
/* 520 */         jn.a("License: personal");
/*     */       }
/*     */       else {
/* 523 */         ((StringBuffer)localObject).append(localMap.get("Organization"));
/* 524 */         jn.a("License: corporate");
/*     */       }
/*     */
/* 527 */       iH.echo(((StringBuffer)localObject).toString());
/*     */
/* 529 */       if ("Unlimited".equals(str2)) {
/* 530 */         iH.echo(" for unlimited number of developer seats on site.");
/*     */       }
/* 532 */       else if ((str2 != null) && (!(bool2))) {
/* 533 */         iH.echo(" for up to " + str2 + " developer seats on site. ");
/*     */       }
/* 535 */       else if (bool2) {
/* 536 */         iH.echo(" for personal use only. ");
/*     */       }
/*     */
/* 539 */       if ((localMap.get("Comment") != null) && (!("".equals(localMap.get("Comment"))))) {
/* 540 */         iH.echo(" " + localMap.get("Comment"));
/*     */       }
/*     */
/* 543 */       if (localDate2 != null) {
/* 544 */         a(localDate1, localDate2);
/*     */       }
/*     */
/* 547 */       iH.echo();
/* 548 */       iH.echo("#############################################################");
/* 549 */       iH.echo();
/*     */     }
/* 551 */     else if (jdField_a_of_type_Int == 2) {
/* 552 */       if (((jdField_b_of_type_Int & 0x2) == 0) && ((((localDate2 != null) && (localDate1.after(localDate2))) || ((localDate3 != null) && (localDate1.before(localDate3))))))
/*     */       {
/* 555 */         iH.echo(" YOUR JREBEL LIMITED LICENSE HAS EXPIRED!");
/*     */       }
/*     */       else {
/* 558 */         jdField_a_of_type_Boolean = true;
/*     */       }
/*     */
/* 561 */       if ((jdField_b_of_type_Int & 0x2) == 0) {
/* 562 */         str2 = (String)localMap.get("Seats");
/*     */
/* 564 */         bool2 = "1".equals(str2);
/*     */
/* 566 */         localObject = new StringBuffer(" This product is licensed to ");
/* 567 */         if ((bool2) && (localMap.get("Name") != null) && (!("".equals(localMap.get("Name"))))) {
/* 568 */           ((StringBuffer)localObject).append(localMap.get("Name"));
/*     */
/* 570 */           if ((localMap.get("Organization") != null) && (!("".equals(localMap.get("Organization"))))) {
/* 571 */             ((StringBuffer)localObject).append(" (");
/* 572 */             ((StringBuffer)localObject).append(localMap.get("Organization"));
/* 573 */             ((StringBuffer)localObject).append(") ");
/*     */           }
/*     */         }
/*     */         else {
/* 577 */           ((StringBuffer)localObject).append(localMap.get("Organization"));
/*     */         }
/*     */
/* 580 */         iH.echo(((StringBuffer)localObject).toString());
/*     */
/* 582 */         if (localDate2 != null) {
/* 583 */           iH.echo(" until " + SimpleDateFormat.getDateInstance(1, Locale.ENGLISH).format(localDate2));
/*     */         }
/*     */
/* 586 */         if ("Unlimited".equals(str2)) {
/* 587 */           iH.echo(" for unlimited number of developer seats on site.");
/*     */         }
/* 589 */         else if ((str2 != null) && (!("1".equals(str2)))) {
/* 590 */           iH.echo(" for up to " + str2 + " developer seats on site. ");
/*     */         }
/*     */
/* 593 */         if ((localMap.get("Comment") != null) && (!("".equals(localMap.get("Comment"))))) {
/* 594 */           iH.echo(" With the following restrictions: ");
/* 595 */           iH.echo(" " + ((String)localMap.get("Comment")));
/*     */         }
/*     */
/* 598 */         if (localDate2 != null) {
/* 599 */           a(localDate1, localDate2);
/*     */         }
/*     */       }
/*     */
/* 603 */       if (localMap.get("Organization") != null) {
/* 604 */         str2 = (String)localMap.get("Organization");
/* 605 */         if (str2.indexOf("[Open-Source]") != -1) {
/* 606 */           jn.a("Giveaway: OSS");
/*     */         }
/*     */
/*     */       }
/*     */
/* 613 */       iH.echo();
/* 614 */       iH.echo("#############################################################");
/* 615 */       iH.echo();
/*     */     }
/* 617 */     else if (jdField_a_of_type_Int == 1) {
/* 618 */       if ((localDate2 == null) || (localDate1.after(localDate2))) {
/* 619 */         iH.echo(" YOUR JREBEL EVALUATION LICENSE HAS EXPIRED!");
/*     */       }
/* 621 */       else if ((localDate3 == null) || (localDate1.before(localDate3))) {
/* 622 */         iH.echo(" YOUR JREBEL EVALUATION COULD NOT HAVE STARTED YET!");
/*     */       }
/*     */       else {
/* 625 */         jdField_a_of_type_Boolean = true;
/*     */
/* 627 */         long l1 = localDate2.getTime() - localDate1.getTime();
/* 628 */         long l2 = l1 / 86400000L;
/*     */
/* 630 */         iH.echo(" You are running JRebel evaluation license.");
/* 631 */         iH.echo(" You have " + (l2 + 1L) + " days until the license expires. ");
/* 632 */         iH.echo();
/* 633 */         iH.echo(" You will see this notification until you obtain a ");
/* 634 */         iH.echo(" full license for your installation. ");
/*     */       }
/* 636 */       iH.echo("                                                          ");
/* 637 */       iH.echo(" Visit www.jrebel.com for instructions on obtaining    ");
/* 638 */       iH.echo(" a full license. If you wish to continue your evaluation  ");
/* 639 */       iH.echo(" please e-mail to support@zeroturnaround.com.             ");
/* 640 */       iH.echo("                                                          ");
/* 641 */       iH.echo(" If you think you should not see this message contact     ");
/* 642 */       iH.echo(" support@zeroturnaround.com or check that you have your   ");
/* 643 */       iH.echo(" license file in the same directory as the JAR file.      ");
/* 644 */       iH.echo("                                                          ");
/* 645 */       iH.echo("#############################################################");
/* 646 */       iH.echo();
/*     */
/* 649 */       eO.a(localUserLicense);
/*     */     }
/*     */     else {
/* 652 */       iH.echo(" YOU DO NOT HAVE A VALID JREBEL LICENSE!               ");
/* 653 */       iH.echo("                                                          ");
/* 654 */       iH.echo(" Visit www.jrebel.com for instructions on obtaining    ");
/* 655 */       iH.echo(" a full or evaluation license.                            ");
/* 656 */       iH.echo("                                                          ");
/* 657 */       iH.echo(" If you think you should not see this message contact     ");
/* 658 */       iH.echo(" support@zeroturnaround.com or check that you have your   ");
/* 659 */       iH.echo(" license file in the same directory as the JAR file.      ");
/* 660 */       iH.echo("                                                          ");
/* 661 */       iH.echo("#############################################################");
/* 662 */       iH.echo();
/*     */     }
/*     */
/* 665 */     if (!(jdField_a_of_type_Boolean)) {
/* 666 */       System.exit(1);
/*     */     }

 




评论

# re: JRebal(原名JavaRebel)破解小记  回复  更多评论   

2009-10-16 00:10 by rox
写得很仔细,谢谢了!

# re: JRebal(原名JavaRebel)破解小记  回复  更多评论   

2009-10-16 08:31 by mathfox
感谢啊,我正想破解呢。看来不用麻烦 了。

# re: JRebal(原名JavaRebel)破解小记  回复  更多评论   

2009-10-16 08:58 by charlie's logic
JRebel的作者应该用groovy写注册算法,然后编译成class,然后混淆一下。
这样就难破解了。

# re: JRebal(原名JavaRebel)破解小记  回复  更多评论   

2009-10-16 08:59 by charlie's logic
上个回复不太准确,应该是

然后编译成class,然后反编译,然后再混淆一下

# re: JRebal(原名JavaRebel)破解小记  回复  更多评论   

2009-10-16 10:11 by guest
试了一下,好像不行。

JRebel 2.1a (200910071200)
(c) Copyright ZeroTurnaround, Ltd, 2007-2009. All rights reserved.

A rough estimate: Over the last 1 days JRebel
prevented the need for at least 0 redeploys/restarts.
Using industry standard build and redeploy times,
JRebel saved you between 0 and 0 hours.

YOU DO NOT HAVE A VALID JREBEL LICENSE!

Visit www.jrebel.com for instructions on obtaining
a full or evaluation license.

If you think you should not see this message contact
support@zeroturnaround.com or check that you have your
license file in the same directory as the JAR file.

# re: JRebal(原名JavaRebel)破解小记  回复  更多评论   

2009-10-16 12:08 by GUEST
不行啊!

# re: JRebal(原名JavaRebel)破解小记[未登录]  回复  更多评论   

2009-10-16 14:04 by sean
楼主破解成功了吗?我试了不行啊。错误和楼上一样提示无效的LICENSE

# re: JRebal(原名JavaRebel)破解小记  回复  更多评论   

2009-10-16 14:40 by BeanSoft
我记得好像是里面还有一个数字证书的验证过程 防止许可内容被篡改 所以我一直用我申请的那个免费许可 也没升级 下载:
http://www.blogjava.net/beansoft/archive/2008/11/24/242373.html

JavaRebel的XXX

# re: JRebal(原名JavaRebel)破解小记  回复  更多评论   

2009-10-16 17:51 by Asran
楼主能发现这些真的不错,但按照上面的方法,还是不能破解。情况和楼上说的一样。

我发现了比较奇怪的问题,我去替换jrebel.jar里边的jrebel.lic前,把原来还有28天试用期的jrebel.jar备份为jrebel.jar.bak.

替换新生成的jrebel.lic,测试不成功,我有把原来的jrebel.jar.bak改为了jrebel.jar, 结果原来的这个jrebel.jar也不好用了。

从新解压一份,运行,还是28天试用期。。。

可能Jrebel的作者在除jar包的内容外还做了其它的验证措施。
我下的版本是:jrebel-2.1a

# re: JRebal(原名JavaRebel)破解小记  回复  更多评论   

2009-10-18 20:28 by 淘宝皇冠大全
不得呢???、

# re: JRebal(原名JavaRebel)破解小记  回复  更多评论   

2009-10-19 08:33 by 云自无心水自闲
是我的问题,在userlicense类里面有一个signature,显然是用于进行校验的。我看了看源代码,在另外一个类里有使用RSADigestSigner进行校验的步骤。

# re: JRebal(原名JavaRebel)破解小记  回复  更多评论   

2009-10-19 10:28 by guest
e0.java调用了bF.java,有RSADigestSigner校验。

# re: JRebal(原名JavaRebel)破解小记  回复  更多评论   

2009-10-19 18:07 by BeanSoft
如果把那个校验器破解了 估计就 OK 了 呵呵 楼主加油!

俺的破解版可以下载了

http://www.blogjava.net/beansoft/archive/2009/10/20/298906.html

不过真的很佩服 JRebel 的 Team 能用开源软件二次开发做出这么有创意的东东

# re: JRebal(原名JavaRebel)破解小记[未登录]  回复  更多评论   

2009-10-29 13:14 by 冷血
我是下了个2.0的破解版.然后用里面的无期限的lic文件.
再改最新版本的class文件的字节码实现的破解.
不过最关键的还是那个lic文件的制作,完全不会,貌似是RSA加密的啊.

# re: JRebal(原名JavaRebel)破解小记[未登录]  回复  更多评论   

2009-10-29 13:15 by 冷血
JRebel 2.1a (200910071200)
(c) Copyright ZeroTurnaround, Ltd, 2007-2009. All rights reserved.

A rough estimate: Over the last 30 days JRebel
prevented the need for at least 67 redeploys/restarts.
Using industry standard build and redeploy times,
JRebel saved you between 1.8 and 3.6 hours.

This product is licensed to Unlimited
For FUN! Unlimited! Enjoy!

# re: JRebal(原名JavaRebel)破解小记  回复  更多评论   

2009-10-30 11:45 by usherlight
@冷血
关键是我们没有办法得到jrebel的私钥,我们在jrebel.jar中只能得到其公钥。