手動脫殼VMP

我的在學習脫VMP加殼的過程當中總結的一個步驟。按照這個步驟,包括VMP1.6—2.0在內應該有70%-80%能脫殼。脫不了的也別問我,我也剛開始學習。我還想找人問呢。
    想要脫VMP的殼,首要工做固然是要找一個強OD啦!至因而什麼版本的OD本身多試驗幾個,網上大把大把的,通常來講只要加載了你想脫的VMP加殼程序不關閉均可以。
    其次就是StrongOD.dll這個插件了,如今用的比較多的就是海風月影,一樣網上也是大把大把的。下載回來後複製到你的OD程序所在的文件夾裏面的plugin裏。StrongOD的設置選項搞不懂就所有打鉤。
    接下來要作的工做就是搞清楚咱們要脫殼的程序編程的語言了,能夠用PEID或者fastscanner查看,若是在這裏看不到也能夠在OD載入之後經過裏面的字符串判斷了。例如VB的程序會出現MSVB----/VC的會出現MSVC---等等。這些都是程序運行所須要的windows連接文件。
    作完這些預備工做接下來固然是用OD載入文件啦。文件載入後在反彙編窗口CTRL+G搜索VirtualProtect(注意V跟P要大寫,至於爲何要搜索這個別問我)。通常來講搜索的結果會出現如下的相似:
    7C801AE3    E8 75FFFFFF     call kernel32.VirtualProtectEx
  咱們在這裏下F2斷點。而後F9運行到咱們下的這個斷點。接下來咱們就要注意觀察堆棧窗口了。通常來講當咱們F9運行到咱們上面下的斷點的時候在堆棧窗口會出現如下相似:
0012F66C   00401000  |Address = TradeCen.00401000
0012F670   000280D1  |Size = 280D1 (164049.)
0012F674   00000004  |NewProtect = PAGE_READWRITE
0012F678   0012FF98  \pOldProtect = 0012FF98
    咱們要注意觀察的就是在接下來咱們F9運行的時候,ADDRESS和NEWPROTECT這兩行的變化。按F9-速度別太快,直到NewProtect項變爲PAGE_READONLY,這時候程序就釋放完畢了。
0012F66C   0042A000  |Address = TradeCen.0042A000
0012F670   000069DE  |Size = 69DE (27102.)
0012F674   00000002  |NewProtect = PAGE_READONLY
0012F678   0012FF98  \pOldProtect = 0012FF98
    如今能夠取消剛纔咱們下的斷點了。接下來就是找OEP了。找OEP的時候我我的的一個經驗就是OEP通常就在接近上面的ADDRESS地址的附近。例如上面的地址是0042A000,我通常就在這個基礎上減到420000搜索程序的特徵段,固然咱們也能夠直接跳到401000開始搜索。雖然咱們搜索的範圍比較大,可是由於咱們搜索的是命令序列,因此工做量還不是很大。
     廢話很少說,CTRL+G--上面的地址,而後CTRL+S 查找命令序列。命令序列的內容就是咱們用查到的編程語言的特徵段。咱們能夠在特徵段裏面選擇兩三句固定不變的命令查找。例如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
   咱們能夠只搜索前三條命令。找到符合前三條命令的,咱們在對照接下來的命令。只要命令相符那這個地址八九不離十就是OEP了。若是在ADDRESS地址附近找不到OEP,那就只好用笨辦法,從401000開始找吧。
    找到OEP地址後,咱們在OEP處點鼠標右鍵《此處爲新EIP》。接下來就能夠dump啦。一般選擇OD的dump插件脫殼要好點,用loadpe脫殼後要麼程序不運行要麼乾脆沒脫。用OD的dump插件脫殼的時候,脫殼窗口下面的(重建輸入表)項前面的勾必定要去掉,這個也是前輩總結的經驗。
    到此脫殼就結束了。能夠試驗一下脫殼後的程序了。能運行說明它在70-80%的範圍,不能運行的話那也是我還在學習的內容,你們共同探討!
    如下是主要幾種編程語言的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編程

相關文章
相關標籤/搜索