基于Block的控制流平坦化还原 (二)

问题与优化方案

 

感谢 dx 让我认识到了 d810 的强大(雾)

忙活了一天才发现原来如果加默认的控制流平坦化 tm 可以被 d810 直接去掉。。。之所以我之前去不掉是因为没有选择去除 ollvm 的 json 文件

不过原来的混淆器不仅仅提供了控制流混淆,果然,再加上 mov 混淆之后果然 d810 寄了 😋

问题一

在上一篇中,我提到了可以通过识别 pushf 和 popf 这样的不常用汇编指令来识别真实块的开始和结束。这样做有个最大的缺点,那就是如果函数内部用到了这两个指令,那么就会引发错误识别。事实证明,在使用了作者提供的另一个替换 mov 的选项之后也确实出现了在函数内部进行无用的 flag 操作,导致脚本出错

优化方案

由于保护寄存器的过程没有进行 mov,判断函数开头可以通过 popf+pop rax 来进行识别,在实际操作中也有效

问题二

基于 Block 的控制流平坦化还原 (二)

mov 混淆怎么去除呢?

其实也很简单,万变不离其宗,这个混淆器在混淆 mov 的时候还是加了 pushf popf 这两条几乎不会在正常的程序中出现的指令

也就是说,如果不是用于混淆控制流的这样的指令可以被认为是 mov 混淆(当然是在只开了这两个混淆的情况下)

优化方案

既然原来只是个简单的 mov,那很显然直接模拟执行得到原来 mov 的操作数就可以了,最后 patch 成一条单一的 mov 指令(注意 movabs 指令的存在)其余使用 nop 填充即可

正文完
 0
评论(没有评论)