轉(zhuǎn)帖|使用教程|編輯:楊鵬連|2021-07-20 14:20:36.827|閱讀 287 次
概述:由于工作需要,經(jīng)常會接觸一些加過殼的軟件,VMProtect是其中自己比較'欣賞'的一款加殼軟件,Tls回調(diào)函數(shù)分析。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
VMProtect是一種很可靠的工具,可以保護應(yīng)用程序代碼免受分析和破解,但只有在應(yīng)用程序內(nèi)保護機制正確構(gòu)建且沒有可能破壞整個保護的嚴重錯誤的情況下,才能實現(xiàn)最好的效果。
VMProtect通過在具有非標準體系結(jié)構(gòu)的虛擬機上執(zhí)行代碼來保護代碼,這將使分析和破解軟件變得十分困難。除此之外,VMProtect還可以生成和驗證序列號,限制免費升級等等。
VMProtect正版授權(quán)在線訂購享受最低價,僅售801元起!還不趕緊加入你的訂購清單?>>更多詳情可點擊咨詢購買
Tls回調(diào)函數(shù)(上)
繼續(xù)看下程序的Handler是如何計算的,查看VmJMP代碼:
算法教簡單:Handler表中根據(jù)BYTE:[RSI-1]取偏移,循環(huán)右移5位 ,再加上Handler基址。
寄存器狀態(tài)如下:
Handler數(shù)量有0n256個之多,我們此次將Tls回調(diào)函數(shù)作為分析目標,先走一小步,只看那些會用到的,沒用到的先不管它。
首先需要確定Tls回調(diào)函數(shù)的結(jié)束地址,在啟動中斷在Tls時,查看調(diào)用棧(下圖),Tls回調(diào)執(zhí)行完畢后,會返回到00007FFDBB969A1D這個地址,可以在這個地址下斷,用于標識Tls回調(diào)函數(shù)已經(jīng)執(zhí)行完畢。
寫腳本如下:
vardel $handlerTable vardel $handlerCount vardel $handlerBaseAddress vardel $vmJmp vardel $tlsEnd var $handlerTable, VMP_UserDebugger.exe:0 + 19065C var $handlerCount, 0x100 var $handlerBaseAddress, VMP_UserDebugger.exe:0 - 54F80000 var $vmJmp, VMP_UserDebugger.exe:0 + 18C8F2 var $tlsEnd, ntdll.dll:0 + 19A1D clearlog vmtraceclear vminit $handlerTable bd bp $tlsEnd bp $vmJmp SetBreakpointSilent $tlsEnd SetBreakpointSilent $vmJmp .begin: be $tlsEnd be $vmJmp g bd $vmJmp bd $tlsEnd .loop: cmp cip, $tlsEnd jz .leave cmp cip, $vmJmp jz .trace log "Unexpected breakpoit: {p:rip}" jmp .leave .trace: vmtracestart "vm_{p:rcx}", 1 cmp $result, 1 jnz .begin ticnd "cip == $vmJmp || cip == $tlsEnd" vmtracestop jmp .loop .leave: bd $tlsEnd bd $vmJmp ret調(diào)試啟動程序,中斷在Tls回調(diào)函數(shù)起始處,執(zhí)行上文腳本,各個handler的trace文件會以名字vm_[handler地址].trace64保存至X64DBG所在文件夾下(可調(diào)用vmclear刪除),跟蹤文件見附件trace.zip。
看幾個有代表性的Handler:
從上面兩個Handler可以判斷出棧應(yīng)是2字節(jié)對齊的。
我們注意到會有多個Handler實現(xiàn)同一個功能。
重新調(diào)試執(zhí)行程序,修改腳本,使用已分析的Handler翻譯程序(vmdump):
vardel $handlerTable vardel $handlerCount vardel $handlerBaseAddress vardel $vmJmp vardel $tlsEnd var $handlerTable, VMP_UserDebugger.exe:0 + 19065C var $handlerCount, 0x100 var $handlerBaseAddress, VMP_UserDebugger.exe:0 - 54F80000 var $vmJmp, VMP_UserDebugger.exe:0 + 18C8F2 var $tlsEnd, ntdll.dll:0 + 19A1D clearlog vmtraceclear vminit $handlerTable bd bp $tlsEnd bp $vmJmp SetBreakpointSilent $tlsEnd SetBreakpointSilent $vmJmp .begin: g .loop: cmp cip, $tlsEnd jz .leave cmp cip, $vmJmp jz .dump log "Unexpected breakpoit: {p:rip}" jmp .leave .dump: vmdump rcx, rsi, rbx jmp .begin .leave: bd $tlsEnd bd $vmJmp ret得到偽代碼如下(見附件vm_tls.txt):
[Anakin] VmPOP V_98 [Anakin] VmPUSH FFFFFFFF9F5A5C32 [Anakin] VmADD [Anakin] VmPOP V_40 [Anakin] VmPOP V_B8 [Anakin] VmPOP V_28 [Anakin] VmPOP V_18 [Anakin] VmPOP V_00 [Anakin] VmPOP V_78 [Anakin] VmPOP V_A0 [Anakin] VmPOP V_90 [Anakin] VmPOP V_40 [Anakin] VmPOP V_20 [Anakin] VmPOP V_68 [Anakin] VmPOP V_50 [Anakin] VmPOP V_58 [Anakin] VmPOP V_30 [Anakin] VmPOP V_B0 [Anakin] VmPOP V_38 [Anakin] VmPOP V_48 [Anakin] VmPOP V_70 [Anakin] VmPOP V_88 [Anakin] VmPOP V_10 [Anakin] VmPOP V_A8 [Anakin] VmPUSH 0000000064765E24 [Anakin] VmPUSHB8 00 [Anakin] VmPUSH 000000014018B3E7 [Anakin] VmPUSH V_98 [Anakin] VmADD [Anakin] VmPOP V_08 [Anakin] VmREADB [Anakin] VmSBP [Anakin] VmREADB [Anakin] VmNOTANDB [Anakin] VmPOP V_60 [Anakin] VmADDB [Anakin] VmPOP V_10 ... ... ...3W多行的匯編代碼已然被翻譯為300多行的偽代碼,是一個較大的進步,后面我們需要進一步分析這些偽代碼,進而把Tls回調(diào)的執(zhí)行搞清楚。
如果您對該加密/解密軟件感興趣,歡迎加入vmpQQ交流群:740060302
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: