目录
1.4、字节码模糊处理
简介:
为避免攻击者可反编译字节码以恢复其源代码,开发者开发出各种技巧来对字节码进行模糊处理。经过模糊处理的字节码更难以反编译, 或者反编译后得到的是可能造成误导或无效的源代码(看上去非常难以理解),不投入大量精力将无法进行重新编译。
模糊处理技巧:
1、用没有意义的表达式
(如a、b、c)代替有意义的类、方法和成员变量名称。迫使阅读反编译代码的攻击者只有通过研究表达式的使用方法才能确定它们的用述, 因此他们很难明白这些表达式的作用
2、模糊处理工具用new和int之类的保留关键字代替项目名称
虽然这种字节码是非法的, 但大多数虚拟机(VM)允许使用这种非法代码,并正常执行它们。尽管反编译器能够处理非法字节码, 但这样得到的源代码比前一种方法生成的源代码更加难以阅读。如果不投入大量精力对非法命名的数据项统一进行重命名, 就不能重新编译源代码
3、许多模糊处理工具删除字节码中不必要的调试和元信息, 包括源文件名和行号(使栈追踪缺乏信息)、局部变量名称(使调试更麻烦)和内部类信息(使反射无法正常进行)
4、增加多余的代码
可能看起来有用的方式建立并处理各种数据但它们与应用程序的功能实际使用的数据并无关系
5、使用跳转指令
对整个代码的执行路径进行令人费解的修改, 致使攻击者在阅读反编译得到的源代码时无法判别执行代码的逻辑顺序
6、引入非法的编程结构
如无法到达的语句和缺少return语句的代码路径。大多数VM允许在字节码中出现这种结构, 但如果不更正非法代码, 就无法重新编译反编码得到的源代码。
应对模糊处理的策略
1、不必完全理解源代码
只需查看组件中是否包含公共方法。哪些方法可以从JavaScript中调用, 它们的签名是什么, 这些内容应显而易见。可以通过提交各种输入测试上述方法的行为。
2、重构功能
如果已经使用无意义的表达式(并非编程语言保留的特殊关键字)代替类、方法和成员变量名称, 可以使用许多IDE中内置的重构功能帮助理解代码。通过研究数据的用法, 可以给它们分配有意义的名称。IDE中的rename工具可以帮助完成许多工作, 在整个代码库中追踪数据的用法并对每一个数据进行重命名
3、选择适当的选项
在模糊处理工具中再次对模糊处理后的字节码进行模糊处理, 这样即可撤销许多模糊处理。Jode是一种实用的模糊处理工具, 它可删除由其他模糊处理工具添加的多余代码路径, 并可为数据分配唯一的名称, 为理解模糊处理后的名称提供帮助
1.5、Java applet
示例:
购物
vaiue=……(处理过的字符串)
……
提交时请求:
POST /shop/……
……
iphone=……(处理过的字符串,函数名可能不一样)
分析:
1、提交表单时, 确认脚本会向一个名为CheckQuantity的Java applet传递用户提供的数量和obfpad参数的值。applet会执行必要的输入确认, 并向脚本返回经过模糊处理的数量、然后脚本再将该数量提交给服务器。
2、服务器端应用程序确认订购数量,quantity参数会以某种形式包含我们请求的值。如果尝试在不了解模糊算法的情况下修改该参数,因为服务器无法正确解析我们提交的经过模糊处理的值,将会失败
过程:
先使用反编译Java applet,了解它的工作机制
1、从HTML页面的applet标签中指定的URL下载applet的字节码
/scripts/CheckQuantity.class
2、由于可执行文件没有打包成jar文件,不需要解压这个文件,直接到下载的class文件运行jad
目录>jad CheckQuantity.class
3、Jad将经过反编译的源代码输出为jad文件,可以在任意文本编辑器中查看该文件
注:Jad程序以.jad扩展名保存其反编译的源代码。修改并重新编译源代码,需要用Java扩展名重命名每个源文件
Jad进行了大址的反编译工作,使用用户提供的quantity参数和应用程序提供的obfpad参数调用doCheck方法时,applet首先确认输入数量是否有效(即满足输入条件), 它会使用URL查询字符串格式创建一个由名/值对组成的字符串, 在其中包含经过确认的数量。最后, 它使用应用程序提供的obfpad字符串对以上创建的字符串执行XOR操作, 对该字符串进行模糊处理来防止简单的篡改操作
利用:
反编译和分析浏览器扩展组件的源代码
1、删除相关函数,取消输人确认
2、添加一个main方法, 用于从命令行执行经过修改的组件,将调用经过修改的函数方法, 并在控制台打印经过模糊处理的结果
3、使用非数字输入, 探查应是否存在各种基于输入的漏洞
4、Jad程序以.jad扩展名保存其反编译的源代码。修改并重新编译源代码,需要用Java扩展名重命名每个源文件
5、需要使用JavaSDK自带的javac编译器项新编译源代码
目录>javac CheckQuantity.java
目录>java CheckQuantity
恶意提交:
要对服务器实施攻击, 只需使用有效的输人以正常方式提交订单, 使用代理服务器拦截生成的请求, 并用经过修改的组件提供的数量替换经过模糊处理的数量
如果应用程序在每次加载订单时都发布一个新的模糊包, 需要确保返还给服务器的校糊包与同时提交的用于对数量进行模糊处理的换糊包相匹配。