代码保护(二) 通过Java反编译工具测试加密效果
上节介绍了当下几款代码保护工具,本节介绍反编译工具对加密的软件进行**。
反编译工具:jd-gui
打包工具:exe4j
脱壳工具:PEID
调试工具:OllyICE
一、未加密状态
测试过程:
1.运行发布的clock.exe文件
2.在C盘AppData\Local\Temp\目录下搜索jar并拷贝到新建文件夹
3.在jd-gui中打开可将.class字节文件反编译得出程序代码
二、测试常用加密软件
1、使用DRMsoft-EXEResPacker加密
(1)进行加密:
(2)得到加密文件并运行
(3)无法正常打开C盘AppData\Local\Temp\目录,双击后闪退
(4)使用PEID查壳工具检测加密外壳 ,未发现程序外壳,提示程序编码语言为:Borland Delphi 6.0 - 7.0 [Overlay],(检索得知:可能是作者自己写的壳。PE头在加密情况下,提取工具提取不到)。
(5)使用OllyDBG载入程序寻找关键(算法)的调用,修改有关汇编语言达到软件**的目的
(6)但最终失败没能找到明显的函数调用,以及在搜索中也没能找到常用的字符串使用。最终未能**成功。本软件可以用来进行加密。
2、使用EXECryptor加密
(1)加密程序Clock.exe
(2)设定参数执行文件后出现如下错误,检索未果
(3)查阅帮助文档得EXECryptor未提供支持Java的API
(5)此软件不能对java项目加密
3、使用VProject加密
(1)发现该软件不支持Java文件加密
三、总结及解决方案
由于Java语言面向对象和编译成中间字节码执行的特点,导致在使用Javac编译成class文件后,在编译的过程,不像C/C++或C#那样在编译时能进行加密或混淆,而是直接对其进行符号化、标记化的编译处理,其中间码与机器码之间存在特定的对应关系就可以根据class文件借助反编译工具反向解析出原来的Java文件。所以上述的非针对Java语言的加密软件在加密Java编码的exe文件后出现了不少错误。
之前在寻找加密软件的过程中,未能意识到Java 的语言的特性,导致收集来的不少软件都不能完成对Java可执行文件的加密。进一步了解,得知常用的Java反盗版解决方案有如下几种:
1.绑定***
在***生成器中使用私钥将用户返回的信息(硬盘***,用户名)进行加密得到相应的注册***;在***合法性判断函数中使用私钥将用户输入的注册***解密;在运行时,对TEMP文件夹下做相应的保护处理,由此达到防止盗版的目的。
2.代码混淆
代码混淆是把代码打乱,并掺入一些随机或特殊的字符,让代码的可读性大大降低,进而使得**的时长变长,其本质是打乱代码的顺序、将各类符号(如类名、方法名、属性名)进行随机或乱命名,使其无意义,降低代码的可阅读性、可理解性。
常用的Java代码混淆器有:ProGuard、RetroGuard、JavaGuard等;以ProGuard为例,在eclipse中可以整合ant,在编译生成.class文件时进行混淆。
3. ExcelsiorJET
ExcelsiorJET是一款通过提前(Ahead-Of-Time(AOT))编译技术增强的Java虚拟机,也含有当前大多数J2SE VM环境中的使用JIT编译技术。AOT编译器能够将Java代码转化为传统的Windows可执行文件(EXE、DLL和NT服务)或Linux二进制文件(可执行文件或共享库),他们如同由C++、FORTRAN或COBOL编写的程序一样,可以直接在硬件上运行。
java代码保护的解决方案:
①.在编译生成.class文件时,使用混淆器增加反编译**难度;
②.在生成jar转化exe文件时使用Excelsior JET转换为二进制exe文件
③.对exe可执行文件进行加壳加密保护。