• 标 题:用dillodumper2.5脱armdillo加壳的XX软件在xp下的IAT修复 (7千字)
  • 作 者:lajiaolz
  • 时 间:2003-5-20 17:53:10
  • 链 接:http://bbs.pediy.com

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