最近做OLLVM控制流扁平化还原的一些体会

首先,OLLVM-FLA的理论就不多加赘述,主要描述一些还原中遇到的问题。

对于O0优化,通过主分发器和预分发器,可以查找出相关块的地址,进而用符号执行模拟运行结果(网上关于这方面的文章已经详尽),目前主要有arm32(纯32位指令或带thumb指令的armv7)以及armv8的64位程序,或是X86的elf或PE(x86貌似32和64还原区别不大),解包目前主流的app应用,大部分还是armv7(个人觉得还原起来最麻烦的也是此种类型) 。

针对O3优化,网上的资料只找到安全客的一篇文章,文章内的代码有些缺陷,无法直接拿来运行。

这里记录一下O3优化下armv7的还原思路描述。

1、根据指令特征识别 相关块,主分发器需要手动指定,没有预分发器。

2、需要保存寄存器状态,根据程序实际的寄存器使用情况存储寄存器的状态,使条件状态可以保存,符号执行逻辑正确

3、patch指令时根据thumb的操作码,无条件跳转可以+-2048字节,而条件跳转只能+-256字节,可能需要找中间跳板才能patch成功,若是两个相关块是相连的状态,则前者不需要patch,itt指令有足够的空间进行patch

4、有些块在符号执行时检测不到flow中的块,此时需要判断其后是否为nop掉的块还是相关块,相关块则不执行patch,nop则进行b跳转patch。

对上述4点进行改进后,就可以对armV7下的fla混淆进行还原大部分逻辑了。

上一篇:linux diff/patch打补丁


下一篇:Hybrid接口