<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    云自無心水自閑

    天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
    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.tkk7.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.tkk7.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中只能得到其公鑰。
    主站蜘蛛池模板: 一级成人a毛片免费播放| 久久国产亚洲精品无码| 猫咪社区免费资源在线观看| 福利免费在线观看| 亚洲av无码专区国产不乱码| 亚洲美女中文字幕| 日本亚洲视频在线 | 国产精品亚洲а∨无码播放| 免费高清资源黄网站在线观看| 久久国产精品成人片免费| 巨胸喷奶水www永久免费| 色偷偷亚洲第一综合| 亚洲中文字幕无码亚洲成A人片| 亚洲色图国产精品| 国产精品久久久亚洲| 免费人成在线观看视频播放| 免费高清资源黄网站在线观看| 国产乱子精品免费视观看片| 日韩内射激情视频在线播放免费| 一级做a爰片久久免费| 色偷偷噜噜噜亚洲男人| 亚洲欧洲免费无码| 亚洲熟妇无码AV| 国产精品亚洲综合久久| 亚洲一区二区三区高清不卡 | 免费无码一区二区三区| 国产在线一区二区综合免费视频 | 亚洲日本乱码在线观看| 国产亚洲精品无码专区| 国产成人亚洲精品91专区手机| 婷婷亚洲天堂影院| www.91亚洲| 国产成人精品亚洲精品| 亚洲免费观看视频| 亚洲成人在线电影| 78成人精品电影在线播放日韩精品电影一区亚洲| 亚洲国产精品VA在线观看麻豆| 亚洲Av无码精品色午夜| 久久久无码精品亚洲日韩蜜臀浪潮 | 亚洲视频国产精品| 亚洲最大在线视频|