问题与优化方案
感谢 dx 让我认识到了 d810 的强大(雾)
忙活了一天才发现原来如果加默认的控制流平坦化 tm 可以被 d810 直接去掉。。。之所以我之前去不掉是因为没有选择去除 ollvm 的 json 文件
不过原来的混淆器不仅仅提供了控制流混淆,果然,再加上 mov 混淆之后果然 d810 寄了 😋
问题一
在上一篇中,我提到了可以通过识别 pushf 和 popf 这样的不常用汇编指令来识别真实块的开始和结束。这样做有个最大的缺点,那就是如果函数内部用到了这两个指令,那么就会引发错误识别。事实证明,在使用了作者提供的另一个替换 mov 的选项之后也确实出现了在函数内部进行无用的 flag 操作,导致脚本出错
优化方案
由于保护寄存器的过程没有进行 mov,判断函数开头可以通过 popf+pop rax 来进行识别,在实际操作中也有效
问题二
mov 混淆怎么去除呢?
其实也很简单,万变不离其宗,这个混淆器在混淆 mov 的时候还是加了 pushf popf 这两条几乎不会在正常的程序中出现的指令
也就是说,如果不是用于混淆控制流的这样的指令可以被认为是 mov 混淆(当然是在只开了这两个混淆的情况下)
优化方案
既然原来只是个简单的 mov,那很显然直接模拟执行得到原来 mov 的操作数就可以了,最后 patch 成一条单一的 mov 指令(注意 movabs 指令的存在)其余使用 nop 填充即可
正文完