用dillodumper2.5脫armdillo加殼的XX軟體在xp下的IAT修復 (7千字)

看雪資料發表於2015-11-15

1.用新出的dillodumper2.5工具可以在2k/xp下脫去Arma 2.65, 2.85, 3.0, 3.0a, 3.01, 3.01a.的馬甲。

2.在win2000下脫出來的程式可以執行在win2000下,但在xp下不能執行。

3.在winxp下脫出來的程式在xp下也不能執行。

看來這個程式還不太完善。下面分析看看。
4.用ollydbg v1.09b載入脫後的程式,跟蹤發現程式在call 005629B8時發生錯誤,跟進看看,來到這裡

005629B8  -FF25 10615B00    JMP DWORD PTR DS:[5B6110]

看看前後內容,這是在呼叫某個dll,對於這個程式是呼叫OLE32.DLL[別細問哈:)]

00562940  -FF25 C0605B00    JMP DWORD PTR DS:[5B60C0]
00562946  -FF25 C4605B00    JMP DWORD PTR DS:[5B60C4]
0056294C  -FF25 C8605B00    JMP DWORD PTR DS:[5B60C8]
00562952  -FF25 CC605B00    JMP DWORD PTR DS:[5B60CC]
00562958  -FF25 D0605B00    JMP DWORD PTR DS:[5B60D0]
0056295E  -FF25 D4605B00    JMP DWORD PTR DS:[5B60D4]
00562964  -FF25 D8605B00    JMP DWORD PTR DS:[5B60D8]
0056296A  -FF25 DC605B00    JMP DWORD PTR DS:[5B60DC]
00562970  -FF25 E0605B00    JMP DWORD PTR DS:[5B60E0]
00562976  -FF25 E4605B00    JMP DWORD PTR DS:[5B60E4]
0056297C  -FF25 E8605B00    JMP DWORD PTR DS:[5B60E8]
00562982  -FF25 EC605B00    JMP DWORD PTR DS:[5B60EC]
00562988  -FF25 F0605B00    JMP DWORD PTR DS:[5B60F0]
0056298E  -FF25 F4605B00    JMP DWORD PTR DS:[5B60F4]
00562994  -FF25 F8605B00    JMP DWORD PTR DS:[5B60F8]
0056299A  -FF25 FC605B00    JMP DWORD PTR DS:[5B60FC]
005629A0  -FF25 00615B00    JMP DWORD PTR DS:[5B6100]
005629A6  -FF25 04615B00    JMP DWORD PTR DS:[5B6104]
005629AC  -FF25 08615B00    JMP DWORD PTR DS:[5B6108]
005629B2  -FF25 0C615B00    JMP DWORD PTR DS:[5B610C]
005629B8  -FF25 10615B00    JMP DWORD PTR DS:[5B6110]
005629BE  -FF25 14615B00    JMP DWORD PTR DS:[5B6114]
005629C4  -FF25 18615B00    JMP DWORD PTR DS:[5B6118]
005629CA  -FF25 1C615B00    JMP DWORD PTR DS:[5B611C]
005629D0  -FF25 20615B00    JMP DWORD PTR DS:[5B6120]
005629D6  -FF25 24615B00    JMP DWORD PTR DS:[5B6124]
005629DC  -FF25 28615B00    JMP DWORD PTR DS:[5B6128]
005629E2  -FF25 2C615B00    JMP DWORD PTR DS:[5B612C]
005629E8  -FF25 30615B00    JMP DWORD PTR DS:[5B6130]
005629EE  -FF25 34615B00    JMP DWORD PTR DS:[5B6134]
005629F4  -FF25 38615B00    JMP DWORD PTR DS:[5B6138]

在命令列鍵入D 005B60C0看到下面內容
005B60C0  77 21 EE 00 A9 48 EE 00 0E BB EF 00 C6 82 EE 00
005B60D0  B6 B8 EF 00 53 07 EE 00 41 07 EE 00 17 0E EE 00
005B60E0  99 8B EE 00 6F A9 F2 00 EA 77 F0 00 1B CD FA 00
005B60F0  3C EA F3 00 7C C3 F2 00 74 73 F4 00 9E 22 F3 00
005B6100  D2 DC F3 00 5A A2 F1 00 F8 BA F3 00 4B E4 FA 00
005B6110  C3 EA EF 00 44 30 F4 00 14 C5 F2 00 F5 D9 F3 00
005B6120  58 ED EF 00 E0 86 EE 00 60 85 EE 00 F6 49 EE 00
005B6130  19 86 EE 00 F3 A4 F2 00 8D 49 EE 00

注意看看005B6110開始的4個位元組內容 C3 EA EF 00,即呼叫程式入口地址為00efeac3。
我們在ollydbg中再選擇OLE32.DLL模組,看到的地址,對比一下發現果然有問題。

5.正好我有這個軟體的前一版本,載入發現OLE32.DLL的IAT情況:
0058E59C  -FF25 10015E00    JMP DWORD PTR DS:[<&OLE32.CoCreateInstance>]          ; OLE32.CoCreateInstance
0058E5A2  -FF25 14015E00    JMP DWORD PTR DS:[<&OLE32.CoGetClassObject>]          ; OLE32.CoGetClassObject
0058E5A8  -FF25 18015E00    JMP DWORD PTR DS:[<&OLE32.CoGetInterfaceAndReleaseStre>; OLE32.CoGetInterfaceAndReleaseStream
0058E5AE  -FF25 1C015E00    JMP DWORD PTR DS:[<&OLE32.CoInitialize>]              ; OLE32.CoInitialize
0058E5B4  -FF25 20015E00    JMP DWORD PTR DS:[<&OLE32.CoMarshalInterThreadInterfac>; OLE32.CoMarshalInterThreadInterfaceInStream
0058E5BA  -FF25 24015E00    JMP DWORD PTR DS:[<&OLE32.CoTaskMemAlloc>]            ; OLE32.CoTaskMemAlloc
0058E5C0  -FF25 28015E00    JMP DWORD PTR DS:[<&OLE32.CoTaskMemFree>]              ; OLE32.CoTaskMemFree
0058E5C6  -FF25 2C015E00    JMP DWORD PTR DS:[<&OLE32.CoUninitialize>]            ; OLE32.CoUninitialize
0058E5CC  -FF25 30015E00    JMP DWORD PTR DS:[<&OLE32.CreateBindCtx>]              ; OLE32.CreateBindCtx
0058E5D2  -FF25 34015E00    JMP DWORD PTR DS:[<&OLE32.CreateILockBytesOnHGlobal>]  ; OLE32.CreateILockBytesOnHGlobal
0058E5D8  -FF25 38015E00    JMP DWORD PTR DS:[<&OLE32.CreateStreamOnHGlobal>]      ; OLE32.CreateStreamOnHGlobal
0058E5DE  -FF25 3C015E00    JMP DWORD PTR DS:[<&OLE32.DoDragDrop>]                ; OLE32.DoDragDrop
0058E5E4  -FF25 40015E00    JMP DWORD PTR DS:[<&OLE32.IsAccelerator>]              ; OLE32.IsAccelerator
0058E5EA  -FF25 44015E00    JMP DWORD PTR DS:[<&OLE32.IsEqualGUID>]                ; OLE32.IsEqualGUID
0058E5F0  -FF25 48015E00    JMP DWORD PTR DS:[<&OLE32.OleCreateFromData>]          ; OLE32.OleCreateFromData
0058E5F6  -FF25 4C015E00    JMP DWORD PTR DS:[<&OLE32.OleCreateLinkFromData>]      ; OLE32.OleCreateLinkFromData
0058E5FC  -FF25 50015E00    JMP DWORD PTR DS:[<&OLE32.OleDraw>]                    ; OLE32.OleDraw
0058E602  -FF25 54015E00    JMP DWORD PTR DS:[<&OLE32.OleFlushClipboard>]          ; OLE32.OleFlushClipboard
0058E608  -FF25 58015E00    JMP DWORD PTR DS:[<&OLE32.OleGetClipboard>]            ; OLE32.OleGetClipboard
0058E60E  -FF25 5C015E00    JMP DWORD PTR DS:[<&OLE32.OleGetIconOfClass>]          ; OLE32.OleGetIconOfClass
0058E614  -FF25 60015E00    JMP DWORD PTR DS:[<&OLE32.OleInitialize>]              ; OLE32.OleInitialize
0058E61A  -FF25 64015E00    JMP DWORD PTR DS:[<&OLE32.OleIsCurrentClipboard>]      ; OLE32.OleIsCurrentClipboard
0058E620  -FF25 68015E00    JMP DWORD PTR DS:[<&OLE32.OleSetClipboard>]            ; OLE32.OleSetClipboard
0058E626  -FF25 6C015E00    JMP DWORD PTR DS:[<&OLE32.OleSetMenuDescriptor>]      ; OLE32.OleSetMenuDescriptor
0058E62C  -FF25 70015E00    JMP DWORD PTR DS:[<&OLE32.OleUninitialize>]            ; OLE32.OleUninitialize
0058E632  -FF25 74015E00    JMP DWORD PTR DS:[<&OLE32.ProgIDFromCLSID>]            ; OLE32.ProgIDFromCLSID
0058E638  -FF25 78015E00    JMP DWORD PTR DS:[<&OLE32.RegisterDragDrop>]          ; OLE32.RegisterDragDrop
0058E63E  -FF25 7C015E00    JMP DWORD PTR DS:[<&OLE32.ReleaseStgMedium>]          ; OLE32.ReleaseStgMedium
0058E644  -FF25 80015E00    JMP DWORD PTR DS:[<&OLE32.RevokeDragDrop>]            ; OLE32.RevokeDragDrop
0058E64A  -FF25 84015E00    JMP DWORD PTR DS:[<&OLE32.StgCreateDocfileOnILockBytes>; OLE32.StgCreateDocfileOnILockBytes
0058E650  -FF25 88015E00    JMP DWORD PTR DS:[<&OLE32.StringFromCLSID>]            ; OLE32.StringFromCLSID
005E0110 >77 21 6C 00 A9 48 6C 00 0E BB 6D 00 C6 82 6C 00
005E0120 >B6 B8 6D 00 53 07 6C 00 41 07 6C 00 17 0E 6C 00
005E0130 >99 8B 6C 00 6F A9 70 00 EA 77 6E 00 1B CD 78 00
005E0140 >3C EA 71 00 7C C3 70 00 74 73 72 00 9E 22 71 00
005E0150 >D2 DC 71 00 5A A2 6F 00 F8 BA 71 00 4B E4 78 00
005E0160 >C3 EA 6D 00 44 30 72 00 14 C5 70 00 F5 D9 71 00
005E0170 >58 ED 6D 00 E0 86 6C 00 60 85 6C 00 F6 49 6C 00
005E0180 >19 86 6C 00 F3 A4 70 00 8D 49 6C 00

6.對照分析,我們知道dll的載入應該考慮相對地址,但值得關注的一點就是入口地址的低8位是一樣的,看看OLE32.OleInitialize 005e0160這裡C3 EA 6D 00以及OLE32.DLL在記憶體中的位置,這樣就不難得到在新版本檔案中OLE32.OleInitialize的正確位置應該是00dfeac3

問題出在dll載入時的地址發生錯誤,產生偏移=00efeac3-00dfeac3=00100000

7.至此我們修改新版本中005B60C0--005B613B的相對內容為
005B60C0  77 21 DE 00 A9 48 DE 00 0E BB DF 00 C6 82 DE 00
005B60D0  B6 B8 DF 00 53 07 DE 00 41 07 DE 00 17 0E DE 00
005B60E0  99 8B DE 00 6F A9 E2 00 EA 77 E0 00 1B CD EA 00
005B60F0  3C EA E3 00 7C C3 E2 00 74 73 E4 00 9E 22 E3 00
005B6100  D2 DC E3 00 5A A2 E1 00 F8 BA E3 00 4B E4 EA 00
005B6110  C3 EA DF 00 44 30 E4 00 14 C5 E2 00 F5 D9 E3 00
005B6120  58 ED DF 00 E0 86 DE 00 60 85 DE 00 F6 49 DE 00
005B6130  19 86 DE 00 F3 A4 E2 00 8D 49 DE 00

8.至此,修復完對OLE32.DLL的正確呼叫地址。修改方法用ultraedit搜尋定位即可完成修改。

修改後程式在xp下執行正常。

總結,透過此例發現dillodumper2.5脫殼存在的問題主要是在IAT修復時,對dll呼叫的地址採用的是絕對地址,計算有誤,導致程式出錯並且不能跨平臺使用。

LAJIAOLZ 2003/05/20

相關文章