轉(zhuǎn)帖|使用教程|編輯:李顯亮|2020-03-09 10:56:28.107|閱讀 584 次
概述:小編大家整理了大佬們的使用技巧和經(jīng)驗(yàn)與大家分享,希望能夠幫助你解決實(shí)際運(yùn)用中遇到的問題。本文講解反匯編引擎學(xué)習(xí)。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
VMProtect是一種很可靠的工具,可以保護(hù)應(yīng)用程序代碼免受分析和破解,但只有在應(yīng)用程序內(nèi)保護(hù)機(jī)制正確構(gòu)建且沒有可能破壞整個(gè)保護(hù)的嚴(yán)重錯誤的情況下,才能實(shí)現(xiàn)最好的效果。
小編大家整理了大佬們的使用技巧和經(jīng)驗(yàn)與大家分享,希望能夠幫助你解決實(shí)際運(yùn)用中遇到的問題。
第三章:關(guān)于反匯編引擎
①Vmp_AllDisassembly框架詳解
總結(jié):
②Vmp_Disassembly解析Opcode函數(shù)分析
舉例Opcode:0047497B 8B7424 28 mov esi,dword ptr ss:[esp+0x28]
讀取主操作碼或則前綴,因?yàn)镻refix 與 Opcode 共同占用這個(gè)空間。由于 x86/x64 是 CISC 架構(gòu),指令不定長。解碼器解碼的唯一途徑就是按指令編碼的序列進(jìn)行解碼,關(guān)鍵是第 1 字節(jié)是什么? 如:遇到 66h,它就是 prefix,遇到 89h,它就是 Opcode。
GetSize_0函數(shù)
函數(shù)作用:用來區(qū)別讀取字節(jié)長度
三個(gè)比較重要的變量(legacy prefix 的作用)
UPX0:00481DDE ; 546: v529 = 0;
UPX0:00481DDE 094 C6 45 F5 00 mov [ebp+var_B], 0
UPX0:00481DE2 ; 547: v531 = 0;
UPX0:00481DE2 094 C6 45 F7 00 mov [ebp+var_9], 0
UPX0:00481DE6 ; 548: v530 = 0;
UPX0:00481DE6 094 C6 45 F6 00 mov [ebp+var_A], 0
它們在哪里賦值?
v529 賦值的地方:
case 0x66u: // 指令前綴:66H—操作數(shù)大小重載前綴,也可被用作某些指令的強(qiáng)制性前綴.
v529 = 1;
v531 賦值的地方:
case 0x67u: // 指令前綴:67H—地址尺寸重載前綴
v531 = 1;
v530 賦值的地方:
REX前綴是16個(gè)編碼操作碼的集合,包含40H到4FH。這些操作碼在IA-32模式和兼容模式中代表有意義的指令。在64位模式中,相同的操作碼則代表REX前綴,不再當(dāng)做單獨(dú)的指令看待。
根據(jù)switch執(zhí)行不同的流程解析Opcode
通過手冊我們得知8B對應(yīng)的是MOV r32,r/m32(Gv, Ev)
Register_Or_Memory = (v13 & 2) == 2這句代碼是什么意思?
Gv, Ev 表示:
通過上文描述就可以解釋作者為何設(shè)計(jì)成要區(qū)分Register_Or_Memory來區(qū)分先執(zhí)行SetReg跟ModRm。
因?yàn)榧僭O(shè)是Mov Gv,Ev這種類型的:目標(biāo)操作數(shù)是確定Gv,但是源操作數(shù)是Ev是包含不確定性具體要依賴于 ModRM.r/m 我們舉例的很明顯就是MOV r32,r/m32(Gv, Ev),目標(biāo)已知,源帶有未知性
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@ke049m.cn