- 浏览: 124455 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
102111:
这个问题怎么解决的?我也遇到了同样的问题。SB boss要在同 ...
最近这个项目 用到Tomcat7,郁闷!!! -
暗蓝幽谷:
不是什么高阶之类,标题党
高阶Java-Java注解 Java annotation 使用详解【转载的】 -
暗蓝幽谷:
《Think in Java 第四版》里面多东西,而且是最基础 ...
高阶Java-Java注解 Java annotation 使用详解【转载的】 -
bcw104:
32位机最大数据集文件2G
MongoDb can't map file memory - mongo requires 64 bit build for larger datasets -
javaOpen:
taoge2121 写道怎么使用啊?
跟使用 ExtJS 分页 ...
ExtJS 分页扩展
原文地址:http://www.blogjava.net/usherlight/archive/2009/10/15/298449.html
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(2010, 01, 01);
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);
/* */ }
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(2010, 01, 01);
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);
/* */ }
发表评论
-
JGroups 简介、适用场合、配置、程序例子Demo等完全使用指南
2010-05-14 09:24 2520JGroups 简介、适用场合、配置、程序例子Demo等完全使 ... -
Lombok 消除Java的冗长
2010-05-06 12:12 1337【转至】http://www.blogjava.net/men ... -
Swing Jtable 学习
2010-04-28 20:53 1565一.创建表格控件的各种方式:1) 调用无参构造函数. ... -
高阶Java-Java注解 Java annotation 使用详解【转载的】
2010-04-16 22:22 8572来越的开源框架都提供了“元数据”支持了。为了不outdate ... -
log4j配置祥解
2010-04-09 11:03 760[转] http://www.blogjava.net/kit ... -
Java Concurrency(java 并发)
2010-04-04 15:31 1341【转】http://www.blogjava.net/vinc ... -
Jbpm4常见概念
2010-03-25 09:55 803[color=green][size=medium] [ ... -
全文检索
2010-03-25 09:53 1343【转】http://luyucs.blog.163 ... -
在eclipse项目中使用maven管理依赖
2010-01-10 21:20 3279概览: 如何导入maven项目 ... -
perf4j 全局性能
2009-10-21 16:47 958http://perf4j.codehaus.org/devg ... -
java泛型
2009-09-27 13:08 906在已发布的Java1.4中在核心代码库中增加了许多新的API( ... -
JPA
2009-02-09 10:49 19631.JPA概述 JPA(Java Pe ... -
EJB3.0开发指南之多对多和一对一
2009-02-09 10:47 1987学生和老师就是多对多的关系。一个学生有多个老师,一个老师教多个 ... -
java笔试题
2009-02-01 10:29 39241。 java.lang.String类是fina ... -
多表联结查询怎样得到重复f01Id数据的最后一条记录
2007-11-23 11:30 1724select a.f01Id,a.costCenter,a. ... -
java中的rmi技术
2007-10-05 15:56 1604java远程方法调用
相关推荐
qt本草(原名华佗)的Repo,用中文调试大型语言模型.zip本草(原名华佗)的Repo,用中文调试大型语言模型.zip本草(原名华佗)的Repo,用中文调试大型语言模型.zip本草(原名华佗)的Repo,用中文调试大型语言模型....
作者:小生我怕怕 [1].以官方0.95版本为蓝本进行汉化调整,前期抢鲜版出现不少BUG,现在修正啦 [2].绝对无捆绑任何病毒、木马、后门等程序。卡巴报病毒,是误报在加壳上,本身并无毒! [3].MSVCR70.DLL、rtl70.bpl...
本人vs2010中文版安装使用,完美支持和破解,大家放心使用。 VA_X_10.6.1837.0,通常被翻译成VC编程助手,全名是Visual Assist X,及VS的助手,支持的VS平台的全部语言,包括html和xtml等,由于VS本身没有对C++的...
Delphi,原名为Borland Delphi,是一种基于Object Pascal语言的集成开发环境,以其高效、快速的编译能力和对Windows API的深度支持而闻名。这款小记账本充分体现了Delphi在开发桌面应用程序方面的优势,它简洁、实用...
BudWk原名NutzWk,从V6 版本起更名为BudWk。 BudWk(原名 NutzWk) 是有多年历史的Java Web开源开发框架,其6.x 是Java 微服务分布式 + 前后端完全分离版本,采用nutzboot(nutz核心)、dubbo、redis、zookeeper、shiro...
EverEdit 3.3.3 3935 32位绿色破解版 verEdit不是一个高级程序员的工具,但它是一个小巧并且强大的文本编辑器,也许这就是我选择EverEdit的原因。工具适合就好,不需要那么强大。就好像你要环游世界不需要把你的房子...
附件精灵破解版 附件精灵2 用来批量下载论坛附件,减轻工作量,尤其可以突破限制,随意下载需要论坛币的附件 这年头成批量下载论坛 RAR 附件的日子已经不常见了,但是仍然有滴~~~有的论坛有防盗链,用迅雷或是...
Everest ultimate是一个测试软硬件系统信息的工具,它可以详细的显示出PC每一个方面的信息。支持上千 种(3400+)主板,支持上百种(360+)显卡,支持对并口/串口/USB这些PNP设备的检测,支持对各式各样的处 ...
Tecnomatix Plant Simulation 9 for win32 原名em_plant,面向对象的物流、生产线仿真建模软件。
Offset Explorer(原名Kafka Tool)是一款用于管理和使用Apache Kafka集群的图形用户界面(GUI)应用程序。它为用户提供了直观的UI界面,方便快速查看Kafka集群中的对象以及集群主题中存储的消息。 - 最新版本的...
Everest ultimate(原名AIDA32),是一个测试软硬件系统信息的工具,它可以详细的显示出PC每一个方面的信息。支持上千种(3400+)主板,支持上百种(360+)显卡,支持对并口/串口/USB这些PNP设备的检测,支持对各式各样的...
AIDA64原名EVEREST,是专业测试硬件信息和系统信息的好工具,它针对系统硬件能查探的信息远比CPU-Z等专业硬件检测软件丰富,还支持硬件性能测试,可以得出内存读写速度、CPU超频速度、硬盘读写速度等信息。...
将该EXE文件复制到DR.COM安装目录下即可,联网时直接双击该程序,原名为ishare_user.exe的启动文件可以直接删除 注:因为程序是个人私自修改,会被一些杀毒软件归为不信任程序,第一次使用的时候我的诺顿就阻止了...
ZIP 压缩包密码破解工具,原名 Turbo ZIP Cracker,官方自1.4版起更改了软件名。它支持解密由WinZIP、PKZIP以及其它兼容ZIP格式的软件(比如WinRAR等)加密的ZIP压缩包和ZIP自解压的EXE文件,软件支持双重模式破解:...
EDAHelper(原名protel99se鼠标增强工具) 第二版(2.0)说明: 本软件是部分EDA软件的鼠标增强工具,将EDAHelper.exe和 Hook.dll同时放到任意目录,运行EDAHelper.exe就行,现在已不再 自动运行EDA软件,支持protel...
Offset Explorer(原名Kafka Tool)是一款用于管理和使用Apache Kafka集群的图形用户界面(GUI)应用程序。它为用户提供了直观的UI界面,方便快速查看Kafka集群中的对象以及集群主题中存储的消息。 - 最新版本的...
一款非常方便好用的查壳软件,并且可以脱掉部分壳,非专业汉化,如有不当之处请多多包含。
Total Commander,简称TC,原名Windows Commander,功能强大的全能文件管理器。TC是一个会显著提高文件操作效率的工具,而文件操作是应用计算机最基本的功夫,也是伴随一生的操作。因此花一点时间学习,而会受益一世...
开源3D地图,原名为“FunCat”,是一种基于Flex技术和E都市理念的Web地图解决方案。Flex是Adobe开发的一种用于构建富互联网应用程序(RIA)的框架,它基于ActionScript编程语言和MXML标记语言,能够创建交互性强、...
CMAK(原名Kafka Manager) Kafka Manager 是一个用于管理和监控 Apache Kafka 集群的工具。它提供了一个直观的 Web 界面,方便用户进行以下操作: 集群管理:查看和管理 Kafka 集群的拓扑结构,包括 brokers、topics...