云自無心水自閑

          天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
          posts - 288, comments - 524, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          JRebal(原名JavaRebel)破解小記

          Posted on 2009-10-15 20:09 云自無心水自閑 閱讀(11315) 評論(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.aygfsteel.com/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.aygfsteel.com/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中只能得到其公鑰。
          主站蜘蛛池模板: 咸丰县| 禄丰县| 甘南县| 称多县| 府谷县| 阳西县| 孝义市| 双牌县| 塘沽区| 固镇县| 上蔡县| 家居| 桐庐县| 清新县| 金川县| 玛纳斯县| 慈溪市| 大庆市| 溧水县| 阳曲县| 大名县| 左贡县| 金堂县| 兴山县| 宿迁市| 手游| 静宁县| 天门市| 阿拉善盟| 梁河县| 曲阜市| 永清县| 祁东县| 红桥区| 徐州市| 周口市| 岑巩县| 丽江市| 西乡县| 安新县| 饶阳县|