用Ollydbg手脫Petite V2.2加殼的DLL

看雪資料發表於2004-12-27

【作者宣告】:只是感興趣,沒有其他目的。失誤之處敬請諸位大俠賜教!
             
【除錯環境】:WinXP、Ollydbg V1.10、LordPE、ImportREC、ReloX

【例項下載】:點選下載
             
――――――――――――――――――――――――――――――――― 
【脫殼過程】:
          
 
Petite也加密了重定位表,寫這篇簡單的筆記只是再次推薦一下用ReloX來修復重定位表。
―――――――――――――――――――――――――――――――――
一、EP和OEP
             

設定Ollydbg忽略所有的異常選項,載入Petite加殼的EdrLib.dll。
 
003D7042     B8 00703D00       mov eax,EdrLib.003D7000
//進入Ollydbg後暫停在這
003D7047     68 0E493D00       push EdrLib.003D490E
003D704C     64:FF35 00000000  push dword ptr fs:[0]
003D7053     64:8925 00000000  mov dword ptr fs:[0],esp

Petite加殼程式的OEP非常好找,在EP處下斷:HE EIP

如果不想脫殼後修改基址,可以在適當的時機Dump。
下斷:BP GetProcAddress
中斷後取消斷點,Alt+F9返回

003D4AC4     FF95 94070000     call dword ptr ss:[ebp+794]; kernel32.GetProcAddress
003D4ACA     85C0              test eax,eax               ; kernel32.lstrlenW
//返回這裡
003D4ACC     74 7F             je short EdrLib.003D4B4D
//下面的迴圈是處理輸入表的

Ctrl+S 在當前位置下搜尋命令序列:
  mov edi,ecx
  mov edx,ebp
  mov eax,dword ptr ds:[ecx]
  test eax,eax
找到在003D4C60處,直接F4至003D4C5A

003D4C54     8DB5 0000C0FF     lea esi,dword ptr ss:[ebp+FFC00000]
003D4C5A     8D8D 00600000     lea ecx,dword ptr ss:[ebp+6000]
//這裡[ebp+6000]的6000是原來重定位表的RVA
003D4C60     8BF9              mov edi,ecx
003D4C62     8BD5              mov edx,ebp
003D4C64     8B01              mov eax,dword ptr ds:[ecx]
003D4C66     85C0              test eax,eax
003D4C68     74 1B             je short EdrLib.003D4C85
003D4C6A     3C FF             cmp al,0FF
003D4C6C     75 0B             jnz short EdrLib.003D4C79

此時輸入表已經處理完畢,程式還沒有進行重定位,執行LordPE完全Dump出這個dll。

F9執行,中斷在剛開始下的硬體斷點處:
003D7042     E9 82A1FFFF       jmp EdrLib.003D11C9
//飛向光明之點巔!

003D11C9     55                push ebp
//OEP    ^O^
003D11CA     8BEC              mov ebp,esp
003D11CC     53                push ebx
003D11CD     8B5D 08           mov ebx,dword ptr ss:[ebp+8]


―――――――――――――――――――――――――――――――――
二、輸入表
             
             
隨便從程式找一個API呼叫,如:
003D10FD     FF15 20403D00     call dword ptr ds:[3D4020]; kernel32.GetVersion
在轉存中跟隨3D4020,上下看到許多函式地址,很明顯的可以找到IAT開始和結束的地址:
             
003D3FF0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
003D4000   74 81 EF 77 E8 7C EF 77 49 C4 EF 77 3B D7 EF 77  tw|wI娘w;罪w
…… ……
003D40C0   79 70 3D 00 40 7A 95 7C 00 00 00 00 00 00 00 00  yp=.@z|........
             
開始地址=003D4000
結束地址=003D40C8
             
執行ImportREC。注意:去掉“使用來自磁碟的PE部首”的選項,選擇“重建原始FT”選項!  
選中Ollydbg的loaddll.exe的程式,然後點“選取DLL”,選擇EdrLib.dll,填入RVA=00004000、大小=000000C8 ,點“Get Import”,得到輸入表,用追蹤層次1修復無效函式。改OEP=000011C9,FixDump!


―――――――――――――――――――――――――――――――――
三、ReloX:修復重定位表的“通用”簡便方法


把EdrLib.dll複製一份,然後用DLL_LoadEX載入EdrLib.dll和複製EdrLib.dll,注意兩個DLL程式的基址。
用LordPE直接把這2個DLL程式Dump出來,另存為1.dll(ImageBase=01060000)和2.dll(ImageBase=01080000)

執行ReloX,選擇1.dll和2.dll,分別填入其相應的基址,點ComPare,稍等,分析完畢。
 
Fix PE Module,提示dumped_.dll儲存成功。ReloX已經自動修正了Relocation RVA和Size!

如果想刪除殼區段,則需要挪移輸出表資料,具體操作看《用Ollydbg手脫Neolite加殼的DLL》教程。
可以用LordPE或者FileScanner最佳化一下脫殼後的檔案。
測試一下,正常執行,脫殼完成了。

             
―――――――――――――――――――――――――――――――――    
                                
         ,     _/ 
        /| _.-~/            \_     ,        青春都一晌
       ( /~   /              \~-._ |\
       `\\  _/                \   ~\ )          忍把浮名 
   _-~~~-.)  )__/;;,.          \_  //'
  /'_,\   --~   \ ~~~-  ,;;\___(  (.-~~~-.        換了破解輕狂
 `~ _( ,_..--\ (     ,;'' /    ~--   /._`\ 
  /~~//'   /' `~\         ) /--.._, )_  `~
  "  `~"  "      `"      /~'`\    `\\~~\   
                         "     "   "~'  ""
    
              UnPacked By :  fly
               2004-12-27 20:00

相關文章