利用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我就不管了,沒什麼強度。)

下載鏈接

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