利用IDA的F5来反VMP2.x的Mutation保护

先说说我对IDA的看法:我怀疑IDA公司有内鬼。
我的目的是用IDA的F5来反编译出经过VMP2.x的mutation保护的代码。
F5的自动化反混淆很好用,可以清掉vmp2.x的90%的变异代码。
但是交互可能是“内鬼”写的,用起来是真的不舒服,各种多管闲事(删了函数又自动创建出来),交互失灵(做了删函数删变量等等操作,graph和f5都没有变化,需要把当前函数删了重新创建才会变化)。

用IDA分析混淆代码时,建议把这个选项取消,以免乱创建函数,影响graph和F5,去变异代码那手动创建函数会好很多
在这里插入图片描述
在这里插入图片描述
IDA还会被一些指令和代码块干扰:

指令1:Call 变异代码段
这种call会直接影响graph图的生成,让graph不能完整地连接变异代码块,而是被“中途截断”
指令2:Ret
Ret指令不管是返回到了变异代码块还是返回到了正常的函数,都会导致graph被截断
(Call指令只在call 变异代码段时会截断,call正常函数不会被截断)
 
 
代码块:栈未平衡的代码块。例如
sub esp,4
jmp xxxx
碰上这种代码块也会被中途截断。
  
 

既然思路有了,那我们就把他们全部等价替换了即可。
具体思路太过复杂,要考虑的情况太多,这里不细讲,有兴趣的可以跟脚本看看(不要瞪代码)
说一下几个注意的点:

1.在识别到call和ret指令时,要尤为关注它们的跳转目的地址
如果是变异代码区段内的地址,说明这是个“假call”(假ret),我们选择步进
如果不是这个区段的地址,说明这是个“真call(真ret)”,我们选择跳过它(修改eip)
 
2.碰上跳转指令(jcc)直接步进过去即可。(这不是个好办法,只是个妥协的办法)
好处:可以无视变异代码的多分支干扰
严重坏处:会破坏原程序逻辑分支,使其run脚本后只能得到一条分支的代码。
用脚本写汇编代码的话,只能是妥协用这个办法。如果能用C写插件,就可以考虑记录eflag,影响eflag的指令,条件跳转指令(je,jnz等等)。对虚假的分支进行清除,保留真实的分支。

(至于什么是“虚”,什么是“实”。其实很简单,就是看和当前跳转指令相关的影响eflag的指令所用的源操作数,如果其全部是“静态”操作数(立即数或者不被当前函数外所影响的局部变量等),就可以认为这个分支必然只有1个走向,可以清除另一个分支走向。相反,如果存在“动态”操作数(例如全局变量,传进来的参数等等),那么这个分支就可能出现2个走向,需要将2个分支全部保留。)
 

脚本里面写了用法(x64dbg脚本,只支持x86代码和不需要重定位的exe)
最后上一下效果图
原程序F5:
在这里插入图片描述
VMP2.X的Mutation保护后,用脚本改一下,再F5:
在这里插入图片描述
有效果,但不显著,看来ida的f5反混淆也有提升的空间。
只能看见调用的函数,但是逻辑分支全部没了,调用API的参数也乱了一些。
用来辅助分析或许还有点用:)

(VMP3.x的mutation我就不管了,没什么强度。)

下载链接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章