想要脫VMP的殼,首要工作當(dāng)然是要找一個(gè)強(qiáng)OD啦!至于是什么版本的OD自己多試驗(yàn)幾個(gè),網(wǎng)上大把大把的,一般來說只要加載了你想脫的VMP加殼程序不關(guān)閉都可以。 其次就是StrongOD.dll這個(gè)插件了,現(xiàn)在用的比較多的就是海風(fēng)月影,同樣網(wǎng)上也是大把大把的。下載回來后復(fù)制到你的OD程序所在的文件夾里面的plugin里。StrongOD的設(shè)置選項(xiàng)搞不懂就全部打鉤。 接下來要做的工作就是搞清楚我們要脫殼的程序編程的語言了,可以用PEID或者fastscanner查看,如果在這里看不到也可以在OD載入以后通過里面的字符串判斷了。例如VB的程序會(huì)出現(xiàn)MSVB----/VC的會(huì)出現(xiàn)MSVC---等等。這些都是程序運(yùn)行所需要的windows鏈接文件。 做完這些預(yù)備工作接下來當(dāng)然是用OD載入文件啦。文件載入后在反匯編窗口CTRL+G搜索VirtualProtect(注意V跟P要大寫,至于為什么要搜索這個(gè)別問我)。一般來說搜索的結(jié)果會(huì)出現(xiàn)以下的類似: 7C801AE3 E8 75FFFFFF call kernel32.VirtualProtectEx
我們在這里下F2斷點(diǎn)。然后F9運(yùn)行到我們下的這個(gè)斷點(diǎn)。接下來我們就要注意觀察堆棧窗口了。一般來說當(dāng)我們F9運(yùn)行到我們上面下的斷點(diǎn)的時(shí)候在堆棧窗口會(huì)出現(xiàn)以下類似: 0012F66C 00401000 |Address = TradeCen.00401000 0012F670 000280D1 |Size = 280D1 (164049.) 0012F674 00000004 |NewProtect = PAGE_READWRITE 0012F678 0012FF98 \pOldProtect = 0012FF98 我們要注意觀察的就是在接下來我們F9運(yùn)行的時(shí)候,ADDRESS和NEWPROTECT這兩行的變化。按F9-速度別太快,直到NewProtect項(xiàng)變?yōu)?span style="color: rgb(0, 0, 255); line-height: 28px;">PAGE_READONLY,這時(shí)候程序就釋放完畢了。 0012F66C 0042A000 |Address = TradeCen.0042A000 0012F670 000069DE |Size = 69DE (27102.) 0012F674 00000002 |NewProtect = PAGE_READONLY 0012F678 0012FF98 \pOldProtect = 0012FF98 現(xiàn)在可以取消剛才我們下的斷點(diǎn)了。接下來就是找OEP了。 找OEP的時(shí)候我個(gè)人的一個(gè)經(jīng)驗(yàn)就是OEP一般就在接近上面的ADDRESS地址的附近。 例如上面的地址是0042A000,我一般就在這個(gè)基礎(chǔ)上減到420000搜索程序的特征段,當(dāng)然我們也可以直接跳到401000開始搜索。雖然我們搜索的范圍比較大,但是因?yàn)槲覀兯阉鞯氖敲钚蛄校怨ぷ髁窟€不是很大。 廢話不多說,CTRL+G--上面的地址,然后CTRL+S 查找命令序列。命令序列的內(nèi)容就是我們用查到的編程語言的特征段。我們可以在特征段里面選擇兩三句固定不變的命令查找。 例如VC++6.0的特征段是 0046C07B U> 55 push ebp 0046C07C 8BEC mov ebp,esp 0046C07E 6A FF push -1 0046C080 68 18064C00 push UltraSna.004C0618 0046C085 68 F8364700 push UltraSna.004736F8 0046C08A 64:A1 00000000 mov eax,dword ptr fs:[0] 0046C090 50 push eax 0046C091 64:8925 00000000 mov dword ptr fs:[0],esp 0046C098 83EC 58 sub esp,58 0046C09B 53 push ebx 0046C09C 56 push esi 0046C09D 57 push edi
我們可以只搜索前三條命令。找到符合前三條命令的,我們在對照接下來的命令。只要命令相符那這個(gè)地址八九不離十就是OEP了。如果在ADDRESS地址附近找不到OEP,那就只好用笨辦法,從401000開始找吧。 找到OEP地址后,我們在OEP處點(diǎn)鼠標(biāo)右鍵《此處為新EIP》。接下來就可以dump啦。通常選擇OD的dump插件脫殼要好點(diǎn),用loadpe脫殼后要么程序不運(yùn)行要么干脆沒脫。 用OD的dump插件脫殼的時(shí)候,脫殼窗口下面的(重建輸入表)項(xiàng)前面的勾一定要去掉,這個(gè)也是前輩總結(jié)的經(jīng)驗(yàn)。 到此脫殼就結(jié)束了??梢栽囼?yàn)一下脫殼后的程序了。能運(yùn)行說明它在70-80%的范圍,不能運(yùn)行的話那也是我還在學(xué)習(xí)的內(nèi)容,大家共同探討! 以下是主要幾種編程語言的OEP特征段: Borland C++ 0040163C B> /EB 10 jmp short Borland_.0040164E 0040163E |66:623A bound di,dword ptr ds:[edx] 00401641 |43 inc ebx 00401642 |2B2B sub ebp,dword ptr ds:[ebx] 00401644 |48 dec eax 00401645 |4F dec edi 00401646 |4F dec edi 00401647 |4B dec ebx 00401648 |90 nop 00401649 -|E9 98E04E00 jmp SHELL32.008EF6E6 0040164E \A1 8BE04E00 mov eax,dword ptr ds:[4EE08B] 00401653 C1E0 02 shl eax,2 00401656 A3 8FE04E00 mov dword ptr ds:[4EE08F],eax 0040165B 52 push edx 0040165C 6A 00 push 0 0040165E E8 DFBC0E00 call <jmp.&KERNEL32.GetModuleHandleA> ********************************************************************************** Delphi 00458650 D> 55 push ebp 00458651 8BEC mov ebp,esp 00458653 83C4 F0 add esp,-10 00458656 B8 70844500 mov eax,Delphi.00458470 0045865B E8 00D6FAFF call Delphi.00405C60 00458660 A1 58A14500 mov eax,dword ptr ds:[45A158] 00458665 8B00 mov eax,dword ptr ds:[eax] 00458667 E8 E0E1FFFF call Delphi.0045684C 0045866C A1 58A14500 mov eax,dword ptr ds:[45A158] 00458671 8B00 mov eax,dword ptr ds:[eax] 00458673 BA B0864500 mov edx,Delphi.004586B0 00458678 E8 DFDDFFFF call Delphi.0045645C 0045867D 8B0D 48A24500 mov ecx,dword ptr ds:[45A248] ; Delphi.0045BC00 00458683 A1 58A14500 mov eax,dword ptr ds:[45A158] 00458688 8B00 mov eax,dword ptr ds:[eax] 0045868A 8B15 EC7D4500 mov edx,dword ptr ds:[457DEC] ; Delphi.00457E38 00458690 E8 CFE1FFFF call Delphi.00456864 00458695 A1 58A14500 mov eax,dword ptr ds:[45A158] 0045869A 8B00 mov eax,dword ptr ds:[eax] 0045869C E8 43E2FFFF call Delphi.004568E4
********************************************************************************** Visual C++ 6.0 0046C07B U> 55 push ebp 0046C07C 8BEC mov ebp,esp 0046C07E 6A FF push -1 0046C080 68 18064C00 push UltraSna.004C0618 0046C085 68 F8364700 push UltraSna.004736F8 0046C08A 64:A1 00000000 mov eax,dword ptr fs:[0] 0046C090 50 push eax 0046C091 64:8925 00000000 mov dword ptr fs:[0],esp 0046C098 83EC 58 sub esp,58 0046C09B 53 push ebx 0046C09C 56 push esi 0046C09D 57 push edi 0046C09E 8965 E8 mov dword ptr ss:[ebp-18],esp 0046C0A1 FF15 74824A00 call dword ptr ds:[<&KERNEL32.GetVersion>] ; kernel32.GetVersion 0046C0A7 33D2 xor edx,edx 0046C0A9 8AD4 mov dl,ah 0046C0AB 8915 403F4F00 mov dword ptr ds:[4F3F40],edx 0046C0B1 8BC8 mov ecx,eax 0046C0B3 81E1 FF000000 and ecx,0FF 0046C0B9 890D 3C3F4F00 mov dword ptr ds:[4F3F3C],ecx
********************************************************************************** Visual C++ 7.0 0100739D > $ 6A 70 push 0x70 0100739F . 68 98180001 push NOTEPAD.01001898 010073A4 . E8 BF010000 call NOTEPAD.01007568 010073A9 . 33DB xor ebx,ebx
********************************************************************************** 匯編 00401000 匯> 6A 00 push 0 00401002 E8 C50A0000 call <jmp.&KERNEL32.GetModuleHandleA> 00401007 A3 0C354000 mov dword ptr ds:[40350C],eax 0040100C E8 B50A0000 call <jmp.&KERNEL32.GetCommandLineA> 00401011 A3 10354000 mov dword ptr ds:[403510],eax 00401016 6A 0A push 0A 00401018 FF35 10354000 push dword ptr ds:[403510] 0040101E 6A 00 push 0 00401020 FF35 0C354000 push dword ptr ds:[40350C] 00401026 E8 06000000 call 匯編.00401031 0040102B 50 push eax 0040102C E8 8F0A0000 call <jmp.&KERNEL32.ExitProcess> 00401031 55 push ebp 00401032 8BEC mov ebp,esp 00401034 83C4 B0 add esp,-50 00401037 C745 D0 30000000 mov dword ptr ss:[ebp-30],30 0040103E C745 D4 0B000000 mov dword ptr ss:[ebp-2C],0B 00401045 C745 D8 37114000 mov dword ptr ss:[ebp-28],匯編.00401137 ********************************************************************************** VB 0040116C V>/$ 68 147C4000 push VB.00407C14 00401171 |. E8 F0FFFFFF call <jmp.&MSVBVM60.#100> 00401176 |. 0000 add byte ptr ds:[eax],al 00401178 |. 0000 add byte ptr ds:[eax],al 0040117A |. 0000 add byte ptr ds:[eax],al 0040117C |. 3000 xor byte ptr ds:[eax],al
|