针对Java易遭受逆向工程攻击的原因今天我将向大家介绍目前市场上关于防止Java免受逆向工程攻击的集中措施同时指出这几种措施在防范逆向工程攻击的时候存在的不足之处
首先是板载措施它并不足以防止逆向工程大多数虚拟机都包含一些使逆向工程复杂化的功能Java允许用户在JAR存档中提供的每个类上设置一个数字证书以确保原始文件没有被更改虽然这样做并无害处但该功能相当容易清除并且仅针对静态补丁方法提供保护而静态补丁只是攻击场景中的一小部分而且这种方法并不能针对运行时应用于内存的补丁提供保护
Java还通过虚拟机执行字节码验证器该验证器在执行通过的字节码之前对其进行自动分析这可以防止执行奇怪的代码也使字节码注入变得更加困难
然而尽管这些措施给攻击者造成了困难但对于充分保护知识产权还远远不够
其次是Java封装技术开发人员通常用以防止class文件静态分析和字节码反汇编的一种方法是封装这种方法通过应用加密/解密完整文件来防止对类文件的分析通过封装开发人员将受保护文件的原始加载器更换为处理加密/解密的自定义加载器加密使用将class文件从标准Java class格式更改为仅密钥所有者可读格式的算法来防止对这些文件的分析然而class文件的字节码在一个内存位置中仍保持可读在系统加载器尝试加载该类之前的时刻通常可从该位置访问字节码如果黑客能够找到那个内存位置就可以访问原始状态的该类
最后防止黑客攻击该内存位置需要第二种技术称为混淆混淆可产生一个更加复杂难于理解并且与原始代码具有相同行为方式的代码版本有几种不同类型的混淆方法可用于指令集程序员可以通过替换二进制代码中的所有字符串来混淆代码这样就更加难以找到一个好的切入点来开始逆向工程攻击他们可以通过插入指向垃圾代码的跳转并返回来迷惑攻击者或混淆源代码或字节码
开发人员也可以选择使用名为ConstCode转换的技术来混淆常量例如密钥有时在应用程序中存储为一组字节如果黑客确定了这些字节的位置他们就可以访问这些字节为混淆一个常量(如密钥)ConstCode算法将常量转换为可产生同一常量的多个不同的命令
例如为了在源代码段中隐藏常量cst=x可以将该常量简单地分为几个算术运算如加减等等A = xABCDF;B=x;C=xE现在让我们使用这三个变量重新计算出常量x我们的原始常量为cst = C/B + A – x – A + = x如果应用程序仅使用该例程来计算常量攻击者就必须理解其中的含义而不是简单地获取该常量