[How2DEOBF] #1 朴素的XOR number混淆
序
在对java程序进行保护的时候,我们常常使用混淆(obfuscate)。这使得逆向工作者无法直接对目标程序进行反编译,或是难以理解目标程序的代码逻辑。所谓反混淆(deobfuscate)也就是混淆的逆向操作,就是期望将混淆后的目标程序还原成未混淆前的状态,或者至少还原到可以理解的程度。
(资料图)
一般而言,目标程序的混淆是由混淆器自动化进行的,这也就是说人工进行反混淆大抵是费时费力,自讨苦吃,最好的办法是,通过编写相应的反混淆程序,实现反混淆。
这篇专栏将以最简单的XOR number混淆为教程。
预备知识:ASM-tree api,脑子
确定方针
下面展示混淆前后number的对比。
原先简单的number变成了如此庞大的XOR们,如果要直接进行分析显然有些困难。可以发现,这些XOR运算的结果实际上都是固定的,在java虚拟机对这些instructions进行执行之后,最终还是能够得到混淆前的两个小number。
那么,我们不妨模拟虚拟机的执行过程,遍历方法中的instructions,如果发现IXOR,就再查看它的前两个instruction是否是一个固定的integer,若是,则将结果计算出来,把原先的IXOR运算覆盖,我们就完成了反混淆。
实现
这里使用narumii的deobfuscator进行transformer编写(https://github.com/narumii/Deobfuscator/)虽然这个反混淆器已经有了反混淆number的功能,但为了原理的学习,我们将自行编写。
创建一个类,继承Transformer,随后实现transform方法。
我们遍历反混淆器加载好的目标程序的class,对每个class的每个method,寻找是否存在IXOR,然后再按照上述的操作实现就行了。
加载示例程序后运行,进行transform,我们便得到反混淆后的程序。
如此,我们成功实现了一个简单的transformer。
后记
这篇专栏中实现的transformer几乎可以说是最简单的一个了,功能也比较单一,事实上的反混淆工作也远比这困难。不过千里之行始于足下,这算是一个良好的开始。
下载示例程序:https://wwcx.lanzoum.com/b032je36d(ethb)
关键词: