java黑客代码 黑客必备的代码( 八 )


图1隔离Java程序示意图对Class文件进行加密为了防止Class文件被直接反编译,许多开发人员将一些要害的Class文件进行加密,例如对注册码、序列号治理相关的类等 。在使用这些被加密的类之前,程序首先需要对这些类进行解密,而后再将这些类装载到JVM当中 。这些类的解密可以由硬件完成 , 也可以使用软件完成 。
在实现时,开发人员往往通过自定义ClassLoader类来完成加密类的装载(注重由于安全性的原因 , Applet不能够支持自定义的ClassLoader) 。自定义的ClassLoader首先找到加密的类,而后进行解密,最后将解密后的类装载到JVM当中 。在这种保护方式中,自定义的ClassLoader是非常要害的类 。由于它本身不是被加密的,因此它可能成为黑客最先攻击的目标 。假如相关的解密密钥和算法被攻克,那么被加密的类也很轻易被解密 。这种保护方式示意图见图2 。
图2 对Class文件进行加密示意图转换成本地代码将程序转换成本地代码也是一种防止反编译的有效方法 。因为本地代码往往难以被反编译 。开发人员可以选择将整个应用程序转换成本地代码,也可以选择要害模块转换 。假如仅仅转换要害部分模块,Java程序在使用这些模块时,需要使用JNI技术进行调用 。
当然 , 在使用这种技术保护Java程序的同时,也牺牲了Java的跨平台特性 。对于不同的平台,我们需要维护不同版本的本地代码,这将加重软件支持和维护的工作 。不过对于一些要害的模块,有时这种方案往往是必要的 。
为了保证这些本地代码不被修改和替代,通常需要对这些代码进行数字签名 。在使用这些本地代码之前,往往需要对这些本地代码进行认证,确保这些代码没有被黑客更改 。假如签名检查通过,则调用相关JNI方法 。这种保护方式示意图见图3 。
代码混淆 图3 转换成本地代码示意图代码混淆是对Class文件进行重新组织和处理 , 使得处理后的代码与处理前代码完成相同的功能(语义) 。但是混淆后的代码很难被反编译,即反编译后得出的代码是非常难懂、晦涩的,因此反编译人员很难得出程序的真正语义 。从理论上来说,黑客假如有足够的时间,被混淆的代码仍然可能被破解 , 甚至目前有些人正在研制反混淆的工具 。但是从实际情况来看,由于混淆技术的多元化发展,混淆理论的成熟,经过混淆的Java代码还是能够很好地防止反编译 。下面我们会具体介绍混淆技术,因为混淆是一种保护Java程序的重要技术 。图4是代码混淆的示意图 。
图4 代码混淆示意图几种技术的总结以上几种技术都有不同的应用环境,各自都有自己的弱点 , 表1是相关特点的比较 。
混淆技术介绍表1 不同保护技术比较表 到目前为止,对于Java程序的保护,混淆技术还是最基本的保护方法 。Java混淆工具也非常多,包括商业的、免费的、开放源代码的 。Sun公司也提供了自己的混淆工具 。它们大多都是对Class文件进行混淆处理,也有少量工具首先对源代码进行处理,然后再对Class进行处理,这样加大了混淆处理的力度 。目前,商业上比较成功的混淆工具包括JProof公司的1stBarrier系列、Eastridge公司的JShrink和
4thpass.com
的SourceGuard等 。主要的混淆技术按照混淆目标可以进行如下分类,它们分别为符号混淆(Lexical Obfuscation)、数据混淆(Data Obfuscation)、控制混淆(Control Obfuscation)、预防性混淆(Prevent Transformation) 。
符号混淆在Class中存在许多与程序执行本身无关的信息,例如方法名称、变量名称,这些符号的名称往往带有一定的含义 。例如某个方法名为getKeyLength(),那么这个方法很可能就是用来返回Key的长度 。符号混淆就是将这些信息打乱,把这些信息变成无任何意义的表示,例如将所有的变量从vairant_001开始编号;对于所有的方法从method_001开始编号 。这将对反编译带来一定的困难 。对于私有函数、局部变量,通常可以改变它们的符号,而不影响程序的运行 。但是对于一些接口名称、公有函数、成员变量,假如有其它外部模块需要引用这些符号,我们往往需要保留这些名称 , 否则外部模块找不到这些名称的方法和变量 。因此 , 多数的混淆工具对于符号混淆,都提供了丰富的选项,让用户选择是否、如何进行符号混淆 。

推荐阅读