- 浏览: 1523933 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (516)
- Java (49)
- Java/Struts 2.0 (25)
- Java/Spring、Spring MVC (11)
- Java/Quartz (3)
- Java/Lucene (6)
- Java/Hibernate (19)
- Java/openJPA (7)
- Java/DWR (7)
- Java/Security、Spring Security/OAuth2 (6)
- Java/Threading (9)
- Java/XML (22)
- java/design pattern (4)
- Android (2)
- JavaScript (46)
- jquery (3)
- DB/MySQL (23)
- DB/Oracle (16)
- PHP (25)
- CSS (20)
- Linux (38)
- C/C++、DLL、Makefile、VC++ (31)
- 正则 (9)
- Eclipse (4)
- 安全、网络等概念 (25)
- 集群 (7)
- 网页 (5)
- 视频\音频 (1)
- HTML (6)
- 计算机数学/算法 (3)
- Virtualbox (1)
- LDAP (2)
- 数据挖掘 (6)
- 工具破解 (1)
- 其他 (13)
- Mail (1)
- 药材 (3)
- 游戏 (2)
- hadoop (13)
- 压力测试 (3)
- 设计模式 (3)
- java/Swing (2)
- 缓存/Memcache (0)
- 缓存/Redis (1)
- OSGI (2)
- OSGI/Gemini (0)
- 文档写作 (0)
- java/Servlet (3)
- MQ/RabbitMQ (2)
- MQ/RocketMQ (0)
- MQ/Kafka (1)
- maven (0)
- SYS/linux (1)
- cache/redis (1)
- DB/Mongodb (2)
- nginx (1)
- postman (1)
- 操作系统/ubuntu (1)
- golang (1)
- dubbo (1)
- 技术管理岗位 (0)
- mybatis-plus (0)
最新评论
-
pgx89112:
大神,请赐我一份这个示例的项目代码吧,万分感谢,1530259 ...
spring的rabbitmq配置 -
string2020:
不使用增强器 怎么弄?
OpenJPA的增强器 -
孟江波:
学习了,楼主,能否提供一份源代码啊,学习一下,十分感谢!!!4 ...
spring的rabbitmq配置 -
eachgray:
...
spring-data-redis配置事务 -
qljoeli:
学习了,楼主,能否提供一份源代码啊,学习一下,十分感谢!!!1 ...
spring的rabbitmq配置
最近几天开发公司的项目,发现重启成了一个很大的问题,服务器端JS、Freemarker脚本、Java类,随便修改点东西就需要重启服务,在公司一般2分钟能起一次,在家里起一次得20分钟(连得公司数据库)
突然想起很久以前看的Java Rebel这个获了Jolt大奖的东东,遂去官网下载了最新版,果然不错
可惜只有30天的Trial,毛爷爷说的自己动手、丰衣足食,那么就破吧。。。
虽然标题写的是2.x,但不表示真的是所有的2.x版本都能破解,至少到我这里2.1.1-nightly还是可以的
因为我这个人总是喜欢用最新版的,而网上大家提供的都是之前的老版本
加之觉得授人以鱼不如授人以渔,干脆把破解过程写下来,这样大家以后总是可以用到破解的最新版,不是很爽?
废话少说,下面就开始吧
首先,自然是去官网上下载最新的JRebel的代码
然后自然是在本机的服务上试试看效果,比如用的是否舒服啦之类的,使用方法这里就不介绍了,网上大把的文章
第三步是找个反编译工具把整个jar包都反编译过来,我用的是http://java.decompiler.free.fr/
,图形化界面,还算方便。
不过这里需要注意一点,反编译的产物由于被混淆过,所以会有类似a.java和A.java的产物,如果在Windows下面,由于不区分大小写,这两个文件会互相覆盖,因此最好是找台Linux的机器来做这个事情会比较方便点
第四步就要用到第二步的东东了,如果我们平时使用下载的evaluation版本启动项目时,会出现一行字“You are running JRebel evaluation license”,拿着这段字在所有的源码包里查找,虽然是混淆,但是字符串是不会变的
我找到了一个叫jZ.java的类,你找到的可能与我的名字不同,这是混淆器弄的
第五步自然就是看懂这个类及其周边类了,如果你比较懒不想看,可以跳过这步,直接按照我下面的办法来做就行
这个类的代码我就不贴了,最终结果就是,根据这个类及其周边类的代码,我总结出了第六步代码
第六步,将下面这段充满try/catch的恶心的代码复制到本地执行,执行时保证jrebel.jar在CLASSPATH中
package com.baidu.jrebel.crack; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Map; import com.zeroturnaround.licensing.UserLicense; /** * * LicenseParser * * @author GuoLin * */ public class LicenseParser { private UserLicense userLicense; private Map<String, Object> licenseMap; /** * 从一个classpath中的license文件中加载数据. * @param filename 在classpath中的文件名 */ public LicenseParser(String filename) { userLicense = getLicense(filename); licenseMap = buildMap(userLicense.getLicense()); } /** * 修改licenseMap的值. * @param key 键 * @param value 值 */ public void set(String key, Object value) { licenseMap.put(key, value); } /** * 移除licenseMap的键值对. * @param key 键 */ public void remove(String key) { licenseMap.remove(key); } /** * 将License存储到新的文件中. * @param newFilename 新文件名 */ public void store(String newFilename) { // 将Map中的值写入UserLicense对象 ByteArrayOutputStream byteArrayOutputStream = null; try { byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = null; try { objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(licenseMap); userLicense.setLicense(byteArrayOutputStream.toByteArray()); } catch (Exception ex) { throw new RuntimeException(ex); } finally { try { objectOutputStream.close(); } catch (IOException ex) { throw new RuntimeException(ex); } } } finally { if (byteArrayOutputStream != null) { try { byteArrayOutputStream.close(); } catch (IOException ex) { throw new RuntimeException(ex); } } } // 保存UserLicense的值到文件 ObjectOutputStream objectOutputStream = null; try { objectOutputStream = new ObjectOutputStream(new BufferedOutputStream( new FileOutputStream(newFilename))); objectOutputStream.writeObject(userLicense); } catch (Exception ex) { throw new RuntimeException(ex); } finally { if (objectOutputStream != null) { try { objectOutputStream.close(); } catch (Exception ex) { throw new RuntimeException(ex); } } } } public String toString() { return licenseMap.toString(); } /** * 从文件中进行反序列化到UserLicense类. * @param filename 文件名,CLASSPATH下 * @return 反序列化完成的UserLicense对象 * @throws Exception */ private static UserLicense getLicense(String filename) { ObjectInputStream licenseFileObjectInputStream = null; try { licenseFileObjectInputStream = new ObjectInputStream(ClassLoader .getSystemClassLoader().getResourceAsStream(filename)); return (UserLicense) licenseFileObjectInputStream.readObject(); } catch (Exception ex) { throw new RuntimeException(ex); } finally { if (licenseFileObjectInputStream != null) { try { licenseFileObjectInputStream.close(); } catch (IOException ex) { throw new RuntimeException(ex); } } } } /** * 根据license的字节码获取最终的Map. * @param licenseBytes 字节码流 * @return 由字节码流反序列化后的Map */ @SuppressWarnings("unchecked") private static Map<String, Object> buildMap(byte[] licenseBytes) { ObjectInputStream localObjectInputStream = null; try { localObjectInputStream = new ObjectInputStream( new ByteArrayInputStream(licenseBytes)); return (Map<String, Object>) localObjectInputStream.readObject(); } catch (Exception ex) { throw new RuntimeException(ex); } finally { if (localObjectInputStream != null) { try { localObjectInputStream.close(); } catch (IOException ex) { throw new RuntimeException(ex); } } } } public static void main(String[] args) throws Exception { LicenseParser parser = new LicenseParser("jrebel.lic"); // 显示内容 System.out.println(parser.toString()); // 修改各类属性,参考反编译后的代码中搜索"Seats"结果所在文件的逻辑 Calendar cal = new GregorianCalendar(2020, 01, 01); parser.set("validUntil", cal.getTime()); // 过期时间 parser.set("Seats", "Unlimited"); parser.set("Organization", "IIT Xiaoheiwu"); parser.set("Comment", "Congratulations! I have bean cracked!"); parser.set("commercial", "true"); parser.remove("limited"); // 显示内容 System.out.println(parser.toString()); parser.store("D:/jrebel.lic"); } }
以上代码主要是有了一个将license文件加载->修改->保存的过程,如果想知道为什么要修改那些参数,请回到第五步,这里就不多说了
如果执行正常,那么最终会在D:/上生成一个jrebel.lic文件,这个就是我们新的License文件
到这里还没完,因为虽然我们生成了一个新的License文件,但是代码中会对这个文件做签名验证,那么我们下一步需要去掉这个签名
在第四步所指的类中,找到类似这样的代码(可以根据"Product"字符串进行查找):
if (AClass.aMethod(localUserLicense)) { x = 1; } ... if ((!("JavaRebel".equals(localMap.get("Product")))) && (!("JRebel".equals(localMap.get("Product"))))) { x = 0; }
注意这段中的几个有黄底的地方,x表示一个变量,这个变量用于标识License的种类,AClass.aMethod是调用AClass这个类上 的一个静态方法(类名和方法名由于被混淆会不同,例如我的是eY.a(localUserLicense)),这个if语句实际是表示签名是否通过,如果 通过就x=1否则x默认为0,0表示非法License
明白了以上这些,现在很简单了,在同包下找到AClass类(对于我来说是eY,对于你来说可能是任何值,这也是上面一段之所以要说明一下的原因),找到aMethod方法(可能有很多同名方法,找到参数、返回值都匹配的方法),方法描述大致如下
public static boolean aMethod(UserLicense paramUserLicense) throws Exception
本来是只需要简单的将这个方法中的所有代码删除并大方的写上return true;就万事大吉的,但我反编译出来的类中有两个同名的aMethod方法(参数相同),编译不过去了,只好再深一步
在这个方法中主要是调用了另一个类(暂时称为BClass),遂找到BClass类,发现这个类太适合伪造了——没有同名public方法,所有public方法只有一个需要返回boolean值,其他均无需返回值
大方的将其所有private方法删除,将其所有private成员变量删除,将所有的public方法的内容全部删除,需要返回boolean的方法直接return true;
于是代码改造完成,接下来编译BClass类:
javac com/zeroturnaround/javarebel/BClass.java -cp ../jrebel.jar
再用WinRAR之类的东东将我们本次产物BClass.class文件和第六步生成的jrebel.lic文件复制到jar包中对应的位置中覆盖原有的文件
大功告成!重启Tomcat试试吧,哈哈哈
评论
http://fallenlord.blogbus.com/logs/51703120.html
如果是转载,还是注明一下出处吧
另外破解版的东西用在商业用途上,这是不可取的,在JE这样严肃的技术论坛里是不应该宣扬的做法
真的听毛爷爷的话,就应该自己动手解决开发效率问题,有兴趣,可以关注我七月份的文章,将就这一块适当地进行展开探讨(之所以说“适当”是因为热加载在JVM上是不给予实现的,JAVA官方的规范和论坛里已经明确回应过,所以我们得另想办法)
发表评论
-
HttpRequestClient
2018-11-21 17:45 588http请求工具 public class WebCon ... -
Spring boot 环境下配置CKEditor添加google map
2017-07-05 14:39 1253本文档基于已经搭建好基础ckeditor的环境上。如:ht ... -
post json
2015-12-30 12:35 535方法一: public static String doP ... -
maven打包成可执行的jar包(package a runnable jar)
2015-04-23 22:01 2213第一步:利用maven-jar-plugin生成当前工程的 ... -
自定义ObjectMapper
2015-03-02 16:57 7761d import java.io.IOExcept ... -
JsonObjectMapper
2015-02-05 10:41 1391import com.fasterxml.jackson. ... -
HttpServletRequestWrapper
2014-10-12 08:15 589请求提交后替换HTML字符 import javax.s ... -
配置javamelody
2014-09-12 14:03 1269参考后面地址修改整理。http://my.oschina.n ... -
getTrace()
2014-08-06 09:14 557/** * 将e.printStackTrace() ... -
获取java对象在内存的地址
2014-07-28 14:59 2862引用stackflow的文章:http://stackove ... -
JMeter入门:Java Request实例
2014-05-08 15:41 2346转自:http://softtest.chin ... -
解决在IE下下载时文件名乱码
2014-01-09 11:24 1052String agent = request.getHead ... -
第一节:编译自定义的Hadoop核心包,去除用户权限检查
2013-11-30 11:59 1060本文参考eclipse连接远程hadoop集群开发时0700 ... -
第二节:win 7下编译eclispe hadoop plugin
2013-11-29 19:12 830本文参照后面地址的Linux编译方式:http: ... -
使用log4j为Tomcat输出日志
2013-11-01 16:42 10339转自:http://hi.baidu.com/y ... -
xStream开发HTTP的XML内容
2013-07-03 09:58 10511、编写自定义XPPDriver代码: package ... -
HttpURLConnection or URLConnection post xml content to web server
2013-05-31 01:56 2054客户端示例1: package client; ... -
java nio学习笔记
2013-03-21 21:41 0直接缓冲区被用于与通道和固有I/O例程交互。它们 ... -
Jsch使用
2012-12-10 17:07 2540Jsch shell模式下的代码示例: 参考: ... -
Exe4j破解_Exe4j注册码
2012-12-06 17:35 33550exe4j是个很好的打包利器,官方下载地址:http://ww ...
相关推荐
亲测可用 时间到2017 Oct.31. 将破解包解压后放在C:\Users\Administrator下即可,原先的.jrebel文件夹注意备份。 如果是离线PC,到期了可以调整系统日期继续使用。 如果是联网PC,建议使用其他联网方式验证。
JRebel 7.x + SpringBoot 1.5.2.RELEASE BUG 启动报错解决方案-附件资源
Tomcat 7.x -->JDK 配置jvm参数: -noverify -javaagent:D:\myeclipse\jar\jrebel6.5.0\jrebel.jar -Drebel.dirs=${project_loc}\WEB-INF\classes -Drebel.spring_plugin=true -Drebel.struts2-plugin=true -...
jrebel官网下载update-site.zip包时超级慢,还可能下载不下来,经过多次努力终于成功了,分享给大家,希望能有帮助。本包安装完后,Jrebel agent是2020.1.1,算是最新版了,支持springboot2.X
jrebel6.4.3破解版 解压后将jarbel 以及jrebel6下的jar分别覆盖替换eclipse\plugins\org.zeroturnaround.eclipse.embedder_6.X.X.RELEASE下的jrebel和jrebel6的jar ,将lic也复制放在这两个文件夹下,与jar一起
Tomcat 7.x -->JDK 配置jvm参数: -noverify -javaagent:D:\myeclipse\jar\jrebel6.5.0\jrebel.jar -Drebel.dirs=${project_loc}\WEB-INF\classes -Drebel.spring_plugin=true -Drebel.struts2-plugin=true -...
2. **配置IDE**:在IDE中配置JRebel,指定你的项目路径和JVM参数。通常需要在IDE的运行配置中添加JRebel的启动参数,例如`-javaagent:path/to/jrebel.jar`,这里的`path/to/jrebel.jar`是JRebel代理的路径。 3. **...
需要Maven 3.0或更高版本(对于Maven 2.x项目,请使用JRebel Maven插件版本1.1.5)。 有关更多信息,请参阅以下JRebel文档: ://manuals.zeroturnaround.com/jrebel/standalone/maven.html 用法 将以下代码段添加...
《SpringBoot2.x基础教程详解》 在Java开发领域,SpringBoot已经成为构建高效、简洁的Web应用的首选框架。SpringBoot2.x版本以其强大的功能、自动化配置和开箱即用的特点,深受开发者喜爱。本教程将围绕...
2、在myeclipse中配置 输入jetty:run -X 输入-noverify -javaagent:D:/java/spring/jrebel.jar 3、在pom.xml中加入下面信息 <plugin> <groupId>org.zeroturnaround</groupId> <artifactId>javarebel-...
set JAVA_OPTS=%JAVA_OPTS% -noverify -javaagent:F:\jrebel-3.0-M1\jrebel.jar -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\...
2. **jrebel.lic**:这是许可证文件,用于验证JRebel的使用合法性。没有这个文件,JRebel可能会在试用期结束后停止工作,或者限制某些高级功能。用户需要将此文件放置在正确的位置,通常是JRebel安装目录下,或者...
这表明JRebel 6.3.1版本已经在IntelliJ IDEA的2017.2 x64位版本上进行了测试,并且可以正常运行。x64指代的是64位操作系统,这样的兼容性确保了在更广泛的硬件环境下插件的稳定性。 **离线安装插件:** 离线安装...
在 srpingboot2.x.x 和MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 编程规范参考《阿里巴巴Java开发手册》 借鉴mybaties plus部分思想 特性: - **无侵入**:只做增强不做改变,引入它不会对...
在 srpingboot2.x.x 和MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 编程规范参考《阿里巴巴Java开发手册》 借鉴 mybaties plus 部分思想 特性: 无侵入:只做增强不做改变,引入它不会对现有...
- 在启动应用服务器时,指定Spring Loaded的系统属性,例如`-XX:MaxPermSize=256m -javaagent:path/to/springloaded-x.x.x.jar`。 - 配置Eclipse项目,使其使用Spring Loaded进行编译和运行。 5. **DCEVM集成** ...
Tomcat 6.0.29是6.x系列的一个稳定版本,发布于2010年,主要为了解决前一版本的已知问题并提升性能。64位版本是为了适应内存需求大、处理能力更强的64位操作系统,如Windows Server 2008 R2等,可以更好地利用硬件...
日志位于 target/tomcat7x/logs 楼宇分布 要构建仅包含可部署工件的 Tomcat 发行版 tarball: mvn clean verify mvn -P dist 如果您需要自定义分发,另请参阅 src/main/assembly/distribution.xml。 使用 JRebel ...
3. Key Promoter X:当您使用IDEA时,它将显示快捷键操作后面的悬停层,以帮助您加快工作效率并建立记忆功效。 4. Markdown Navigator:提供对 Markdown 文件的全面支持,在编辑器内提供渲染预览和文件系统导航等...