解包Jar2exe加密的java源代码

目录
一直以来都不曾发现Java程序也可以打包成exe,直到遇见了Jar2exe, 于是对它产生了一点兴趣,各种资料知识点刷了一遍后,对它的原理有个一个初步的了解。原理很简单,Jar2exe实际上就是通过C++代码创建jvm,通过jni接口调用Java代码。其提供了多个设置,比如加密并且隐藏class file,本文主要分析Java代码的加密部分,还原出源代码,具体细节运行机制以后再分析。
1 下载Jar2exe并打包一个样本
去官网下载并安装,随便找一个可以运行的jar程序,然后打包并勾选(Encrypt and hide class files)选项,一直下一步就好了。其提供了几天的免费试用,对于我们来说时间足够了。

2 猜测运行机制
先做一个大胆的猜测,jar2exe调用的是jni接口,那么程序的运行是离不开jre的,为啥?因为java是解释性语言呗,需要jvm虚拟机才能运行。从而可以知道,jar包并没有转换成C++代码,应该还是jar包,被藏在了某个地方,藏在哪里呢?先用火绒剑分析以下,通过火绒剑,并没有发现临时文件,是不是说明jar包就在样本文件的资源中,拿PE工具看一下,果然有一个资源文件,看前面字节C613,并不能确定就是jar包,也有可能是经过了加密,先假设就是加密过后的jar包。

3 OD调试程序,dump解密后的数据
- 如果猜的没错,样本应该是先获取资源数据,然后采用解密函数解密。所有先对LockResource()下断点,可以看到成功断下来了。快捷键alt+f9执行到用户代码区。对eax寄存器数据窗口跟随,看到了资源区的数据了。

- 对C61EF996数据下硬件访问断点,我们要定位到解密函数,按F9,断在了解密函数部分。eax=0049DA0,指向资源数据,取了第一个字节到al,循环了四次。

- 这个时候F8跟下去(忘了说,jar的头标记是504B(PK))。观察运算过程,运行到mov byte ptr ds:[ecx],al; 发现al中的C6解密为50,重复一次1E解密为4B。。。一切都简单了,数据窗口跟随地址,解密后的数据都在这里。

- 用lordpe将解密后的数据dump出来,用zip打开,可以看到所有的class文件

4 总结
-
所以说嘛,解释性语言,无论怎么加密,最终还是要经过jvm执行。
-
根据博主的不断重复调试,猜测应该是xor256stream加密算法,网上的资料比较少,只能看源码理解了。