应对字节码模糊处理的有效策略取决于所分析的源代码使用的技巧和目的。以下提供一些建议。
(1)不必完全理解源代码,只需查看组件中是否包含公共方法。哪些方法可以从JavaScript中调用,它们的签名是什么,这些内容应显而易见。可以通过提交各种输入测试上述方法的行为。
(2)如果已经使用无意义的表达式(并非编程语言保留的特殊关键字)代替类、方法和成员变量名称,可以使用许多IDE中内置的重构功能(refactoring functionality)帮助理解代码。通过研究数据的用法,可以给它们分配有意义的名称。IDE中的rename工具可以帮助完成许多工作,在整个代码库中追踪数据的用法并对每一个数据进行重命名。
(3)选择适当的选项,在模糊处理工具中再次对模糊处理后的字节码进行模糊处理,这样即可撤销许多模糊处理。Jode是一种实用的模糊处理工具,它可删除由其他模糊处理工具添加的多余代码路径,并可为数据分配唯一的名称,为理解模糊处理后的名称提供帮助。
5.Java applet:可用示例
下面以一个在Java applet中执行输入确认的购物应用程序为例,简要说明如何反编译浏览器扩展。
在这个示例中,提交用户请求的订购数量的表单如下所示:
以数量2提交该表单时,请提出以下请求:
如以上HTML代码所示,提交表单时,确认脚本会向一个名为CheckQuantity的Java applet传递用户提供的数量和obfpad参数的值。很明显,applet会执行必要的输入确认,并向脚本返回经过模糊处理的数量,然后脚本再将该数量提交给服务器。
由于服务器端应用程序确认订购数量为两件,因此,很明显,quantity参数会以某种形式包含我们请求的值。但是,如果我们尝试在不了解模糊算法的情况下修改该参数,攻击将会失败,因为服务器无法正确解析我们提交的经过模糊处理的值。
在这种情况下,可以使用之前介绍的方法反编译Java applet,以此了解它的工作机制。首先,需要从HTML页面的applet标签中指定的URL下载applet的字节码:
由于可执行文件没有打包成jar文件,因此,不需要解压这个文件,可以直接到下载的.class文件运行Jad:
Jad将经过反编译的源代码输出为jad文件,可以在任意文本编辑器中查看该文件:
如经过反编译的源代码所示,Jad进行了大量的反编译工作,而且该applet的源代码非常简单。使用用户提供的quantity参数和应用程序提供的obfpad参数调用doCheck方法时,applet首先确认该数量是否为介于1到50之间的有效数字。如果数字有效,它会使用URL查询字符串格式创建一个由名/值对组成的字符串,在其中包含经过确认的数量。最后,它使用应用程序提供的obfpad字符串对以上创建的字符串执行XOR操作,对该字符串进行模糊处理。这是一种相当简单而常用的方法,它通过对数据进行基本的模糊处理来防止简单的篡改操作。
关于如何反编译和分析浏览器扩展组件的源代码,我们已经介绍了各种方法。在此示例中,解析applet的最简单方法如下所示:
(1)修改doCheck方法,取消输入确认,以便于将任意字符串作为数量提交给服务器;
(2)添加一个main方法,用于从命令行执行经过修改的组件。该方法将调用经过修改的doCheck方法,并在控制台打印经过模糊处理的结果。
进行这些更改后,源代码如下所示:
经过修改的组件以任意数量(999)提供经过模糊处理的有效字符串。需要注意的是,可以在此处使用非数字输入,探查应用程序中是否存在各种基于输入的漏洞。
最后,需要使用Java SDK自带的javac编译器重新编译源代码,然后从命令行执行经过修改的组件:
现在,经过修改的组件已对我们提交的任意数量(999)进行了必要的模糊处理。要对服务器实施攻击,只需使用有效的输入以正常方式提交订单,使用代理服务器拦截生成的请求,并用经过修改的组件提供的数量替换经过模糊处理的数量。需要注意的是,如果应用程序在每次加载订单时都发布一个新的模糊包(obfuscation pad),需要确保返还给服务器的模糊包与同时提交的用于对数量进行模糊处理的模糊包相匹配。