[How2DEOBF] #1 朴素的XOR number混淆

来源: 哔哩哔哩 2023-06-24 20:02:48

在对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)

关键词:

你可能会喜欢: