* Reference To: KERNEL32.GetCommandLineA, Ord:00CAh
|
:0040891D FF15D4004100 Call dword ptr [004100D4]
:00408923 50 push eax
:00408924 8B4D08 mov ecx, dword ptr [ebp+08]
:00408927 51 push ecx
* Reference To: KERNEL32.CreateProcessA, Ord:0044h
|
:00408928 FF1544004100 Call dword ptr [00410044]
:0040892E 85C0 test eax, eax
:00408930 7527 jne 00408959
:00408932 C705E057410009000000 mov dword ptr [004157E0], 00000009
外壳在这里产生WEALTHLAB.TMP0进程,在此前已经把环境变量和命令行参数设定好了。f10执行10多
行来到这里:
* Reference To: KERNEL32.ResumeThread, Ord:022Ch
|
:00406DC1 FF152C004100 Call dword ptr [0041002C]
……
……
……
* Reference To: KERNEL32.GetExitCodeProcess, Ord:010Bh
|
:00406DE2 FF1540004100 Call dword ptr [00410040]
:00406DE8 81BD4CF2FFFF03010000 cmp dword ptr [ebp+FFFFF24C], 00000103
:00406DF2 7423 je 00406E17
:00406DF4 C705E05741000A000000 mov dword ptr [004157E0], 0000000A
……
……
……
* Reference To: KERNEL32.Sleep, Ord:0296h
|
:00406E19 FF1558004100 Call dword ptr [00410058]
:00406E1F 8B1524594100 mov edx, dword ptr [00415924]
:00406E25 52 push edx
* Reference To: KERNEL32.SuspendThread, Ord:0298h
|
:00406E26 FF1554014100 Call dword ptr [00410154]
:00406E2C 83F8FF cmp eax, FFFFFFFF
:00406E2F 7530 jne 00406E61
……
……
……
* Reference To: KERNEL32.GetThreadContext, Ord:0167h
|
:00406E6F FF1538004100 Call dword ptr [00410038]
:00406E75 85C0 test eax, eax
:00406E77 7530 jne 00406EA9
:00406E79 C705E05741000A000000 mov dword ptr [004157E0], 0000000A
:00406E83 A124594100 mov eax, dword ptr [00415924]
注意,实际上外壳自身作为调试器来启动WEALTHLAB.TMP0进程,把WEALTHLAB.TMP0进程挂起后调用
GetThreadContext获得线程Context即“线程上下文”,如果不懂的话,请看看有关操作系统原理的
书吧。获得线程Context有什么用呢?等一下有说明……,继续执行:
* Reference To: KERNEL32.ResumeThread, Ord:022Ch
|
:00406ED2 FF152C004100 Call dword ptr [0041002C]
:00406ED8 E9EAFEFFFF jmp 00406DC7
……
……
……
* Reference To: KERNEL32.VirtualProtectEx, Ord:02C4h
|
:00406F08 FF1558014100 Call dword ptr [00410158]
:00406F0E 85C0 test eax, eax
:00406F10 7523 jne 00406F35
:00406F12 C705E05741000A000000 mov dword ptr [004157E0], 0000000A
……
……
……
:00406F35 8D8554F2FFFF lea eax, dword ptr [ebp+FFFFF254]
:00406F3B 50 push eax
:00406F3C 6A02 push 00000002
:00406F3E 6894554100 push 00415594
:00406F43 8B0DCC224100 mov ecx, dword ptr [004122CC]
:00406F49 330DD8224100 xor ecx, dword ptr [004122D8]
:00406F4F 330DE0224100 xor ecx, dword ptr [004122E0]
:00406F55 330DF0224100 xor ecx, dword ptr [004122F0]
:00406F5B 51 push ecx
:00406F5C 8B1520594100 mov edx, dword ptr [00415920]
:00406F62 52 push edx
* Reference To: KERNEL32.WriteProcessMemory, Ord:02E9h
|
:00406F63 FF1534004100 Call dword ptr [00410034]
:00406F69 85C0 test eax, eax
:00406F6B 7523 jne 00406F90
看看上面代码,呵呵…… 原来外壳将WEALTHLAB.TMP0进程的部分段(即内容是0x58的那部分)设为
类似不可读写或执行的属性,来触发自己解码。前面说过外壳将作为调试器而WEALTHLAB.TMP0正好
是被调试器!具体可看看hying以前关于Armadillo 外壳的帖子,精华里有。
继续执行:
:00407035 6A64 push 00000064
* Reference To: KERNEL32.Sleep, Ord:0296h
|
:00407037 FF1558004100 Call dword ptr [00410058]
:0040703D 8B0DD4224100 mov ecx, dword ptr [004122D4]
:00407043 330DF8224100 xor ecx, dword ptr [004122F8]
:00407049 330DE0224100 xor ecx, dword ptr [004122E0]
:0040704F 330DF0224100 xor ecx, dword ptr [004122F0]
:00407055 898D18F3FFFF mov dword ptr [ebp+FFFFF318], ecx
:0040705B 8D9560F2FFFF lea edx, dword ptr [ebp+FFFFF260]
:00407061 52 push edx
:00407062 A124594100 mov eax, dword ptr [00415924]
:00407067 50 push eax
* Reference To: KERNEL32.SetThreadContext, Ord:0283h
|
:00407068 FF158C004100 Call dword ptr [0041008C] 〈==关键啊!!!
:0040706E 85C0 test eax, eax
:00407070 7523 jne 00407095
外壳调用SetThreadContext来改变WEALTHLAB.TMP0进程的eip来达到改变EOP的目的!!!
关于SetThreadContext的说明请看MSDN文档。其中edx是Context指针,edx+b8是eip的值;
下命令“dd edx+b8"将看到OEP的地址是006a19c4。(有关Context结构请看附录),用peditor将
WEAL-NUPACK.exe的OEP改为006a19c4,到此脱壳完成,脱壳文件完美运行!!
(四)总结
外壳作为调试器来调试加壳程序,并利用类似页异常的处理方式来动态解码,利用调试函数
SetThreadContext来动态改变加壳程序的OEP,达到隐藏OEP的目的。
其实相对来说,Armadillo 比aspr要容易多了,(如果你对window的调试原理有了解的话)如
果再加上类似aspr的花指令和反反复复的seh,来加强反静态分析,应该是个保护很强的外壳。
在命令行键入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模块,看到的地址,对比一下发现果然有问题。 上一页 1 2 |