提取经过Jar2Exe编译加密的源代码

来源:互联网 发布:农村淘宝合伙人官网 编辑:程序博客网 时间:2024/05/01 15:19

注意:本教程仅供学习交流之用,请勿用于非法用途。对于本教程带来的所有后果,作者均不承担任何法律责任。

出处:http://blog.csdn.net/ravinow/article/details/51123839

背景:Jar2Exe是一款优秀的Java源码加密软件,它能够将jar包加密为本地能够执行的exe文件,并能够附带Java语言运行时(JRE),从而免除了客户机器需要安装JRE等繁琐的步骤。本文介绍了如何从Jar2Exe编译的exe文件中提取原始的类文件。


Jar2Exe一共有三种加密方式:

1. 明文:如下图所示,在编译时如不勾选 “隐藏类文件” 或“加密并隐藏类文件”的话,Jar2Exe会将Jar包以 明文 存储在Exe程序中,这是第一种方式,也是最容易被提取的一种方式。

2. 隐藏:如勾选“隐藏类文件”,Jar包会被经过简单的加密之后存储在Exe程序中的资源中,对于破解而言也只是简单难度。

3. 加密:如勾选“加密并隐藏类文件”,Jar包会被加密,并且所有文件名都会被哈希,之后存储在Exe程序的资源中。这是最常见的一种加密,也是相对最麻烦的一种提取方式。相信读者最关心的就是如何从这种加密的Exe文件中提取出jar包来。



对于第一种明文的编译方式,提取的方法非常简单。只需要用压缩软件打开要破解的Exe文件,即可看到所有class文件,相信这个方法读者应该都很清楚,不用我多说了。


对于第二、三种 隐藏和加密的方式,要提取出完成的jar包,需要用到Ollydbg调试被加密的Exe程序,在解密代码刚执行完的地方下断点中断,从内存中dump出jar包,再还原原本的文件名。其中过程比较繁琐,我会在下一篇教程中再写出步骤和放出工具来。


本篇教程会先介绍一个更加简单的方法来提取出Jar2Exe加密的类文件。该方法的思路如下:

首先构建一个Java代理(JavaAgent),JavaAgent是JDK1.5之后出现的一个功能,目的是让程序员可以更加灵活的监控Java虚拟机的运行。但它的功能实在太强大,甚至可以让你修改一个类的定义。而我们要做的就是编写一个JavaAgent,并监控ClassLoader,在它要加载一个类的时候,dump出这个类来并写入一个jar文件中就可以了。这个JavaAgent是很general的,可以用在不同的jar上面。本文后面会提供一个该JavaAgent的实现。


然后你就可以通过设置java有关的的环境变量来激活该JavaAgent。接着运行Jar2Exe编译的Exe程序。尽可能多的测试程序中的功能,点击不同的按钮,让更多的类文件被加载到内存中,这样它们就会被dump出来。或者只测试你关心的部分,比如某个模块或登录授权。最后结束程序,就可以在dump出来的jar包中找到需要的类文件。


可以看出,这种方法非常的简单易行。但同时也有一些缺点:比如如果一个类没有被加载过的话是提取不出来的。这也就导致了导出的源代码会因为缺少一些类而无法被重新编译。只能观察和学习反编译的源代码,或自行补全。另外原Jar包中的资源文件(例如文本文件、声音、图片)是没有办法提取出来的。(但也不是完全没有办法,后面我们会讲如何再提取这些资源文件)。而使用ollydbg调试并导出原始的Jar包并不存在这些问题,能够提取出所有的类文件以及资源文件,就算它们没有被加载。这种方法会在下一篇中介绍。


我们先来介绍上面提到的使用JavaAgent从内存中提取Jar2exe加密的类文件的步骤


1.     打开命令行并进入要破解的程序所在目录


2.     将e2j-agent-1.6.jar文件放在同一目录下,该JavaAgent下载地址:http://sshwind.com/e2j-agent-1.6.jar ,或从我的Github空间下载:https://github.com/ravinow/e2j


3.     在命令行输入以下命令设置JavaAgent的加载:

set JAVA_TOOL_OPTIONS=-javaagent:e2j-agent-1.6.jar

成功不会有任何输出。该命令是让java程序在加载一个类时会自动调用JavaAgent。

4.     执行你要破解的程序:

然后尽量测试每一项功能,使它加载全部的类。

5.     结束程序,然后在当前目录下会多出一个e2j-dump.jar,这就是提取出的类文件包。

6.     到这已经成功了,如果需要它能够直接被运行的话还需要往里自行补充MANIFEST.MF文件。


如上所说,该方法简单易行,但可能无法提取出所有类文件及资源文件。更加有效的方法会在下一篇介绍,如果对内容有任何疑问或谈合作事宜欢迎联系QQ:627083940,转载请保留作者联系方式及原文链接。


另附资源文件的提取方法:

Java毕竟是一种在虚拟机中运行的语言,所有的操作都需要JRE的支持。所以我们可以修改JRE中的有关加载资源的API的代码,在加载资源的同时把它们dump出来。原理类似上面JavaAgent的实现。效果也同JavaAgent一样,在程序运行时必须让资源文件被加载到内存中才能dump出来。


具体步骤是:

1、 打开JDK安装目录下的src.zip,这里有大部分Java API的源文件。

2、 找到java/lang/class.java,修改getResource和getResourceAsStream方法,使它们在返回结果前dump出要读取的资源文件。如果需要的话一并修改其它涉及到加载资源文件的类和方法。

3、编译修改过的源文件,并将编译出来的class文件复制进JRE安装目录下的lib/rt.jar包中,覆盖原文件。(注意:编辑的JDK源文件版本必须与现有JRE版本相匹配,不然会出现问题)

4、运行目标程序,尽可能多的测试功能,让资源文件被加载。这样你就能在目录下找到dump出来的资源文件了。

0 0
原创粉丝点击