自己随便用VB写了个程序,然后出于好奇,给他加了个UPX的壳(UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo)然后又继续给他加上个EXEStealth的壳(EXEStealth 2.72 - 2.73 -> WebToolMaster)试着运行了一下程序,能够正常运行!
加好壳后就准备试着脱壳.UPX的壳能用EXP脱掉,EXEStealth的壳也能利用前辈的经验脱掉!不过两个壳一起加上后问题就来了!加双重壳后查出来的是EXEStealth的壳!
我首先用OD载入程序,提示:模块 'a' 的快速统计报告表明其代码段可能被压缩, 加密, 或包含大量的嵌入数据. 代码分析将是非常不可靠或完全错误的. 您仍要继续分析吗?选择否!
0041B060 > /EB 00 jmp short 0041B062
;载入后停在这里
0041B062 \EB 2F jmp short 0041B093
0041B064 53 push ebx
0041B065 68 61726577 push 77657261
0041B06A 61 popad
0041B06B 72 65 jb short 0041B0D2
0041B06D 202D 20457865 and byte ptr [65784520], ch
0041B073 53 push ebx
0041B074 74 65 je short 0041B0DB
0041B076 61 popad
0041B077 6C ins byte ptr es:[edi], dx
0041B078 74 68 je short 0041B0E2
0041B07A 00EB add bl, ch
0041B07C 16 push ss
异常做的如下设置:
然后shift+F9运行一次后停在了这里
0041B189 8BEF mov ebp, edi
;停在这里
0041B18B 33DB xor ebx, ebx
0041B18D 64:8F03 pop dword ptr fs:[ebx]
0041B190 83C4 04 add esp, 4
0041B193 3C 04 cmp al, 4
0041B195 74 05 je short 0041B19C
0041B197 EB 01 jmp short 0041B19A
0041B199 - E9 61C38B85 jmp 85CD74FF
0041B19E B6 2F mov dh, 2F
0041B1A0 40 inc eax
0041B1A1 0003 add byte ptr [ebx], al
0041B1A3 40 inc eax
0041B1A4 3C 05 cmp al, 5
0041B1A6 8000 00 add byte ptr [eax], 0
0041B1A9 008B 08038DB6 add byte ptr [ebx+B68D0308], cl
再使用BP IsDebuggerPresent 命令下断点,之后接着shift+F9运行
7C813123 > 64:A1 18000000 mov eax, dword ptr fs:[18]
;中断在这里
7C813129 8B40 30 mov eax, dword ptr [eax+30]
7C81312C 0FB640 02 movzx eax, byte ptr [eax+2]
7C813130 C3 retn
7C813131 90 nop
7C813132 90 nop
7C813133 90 nop
7C813134 90 nop
7C813135 90 nop
7C813136 8BFF mov edi, edi
7C813138 55 push ebp
7C813139 8BEC mov ebp, esp
7C81313B 56 push esi
7C81313C 8B75 08 mov esi, dword ptr [ebp+8]
7C81313F 8B06 mov eax, dword ptr [esi]
7C813141 85C0 test eax, eax
7C813143 57 push edi
取消断点后继续shift+F9运行两次到了这里
0041B7F2 0000 add byte ptr [eax], al
0041B7F4 0000 add byte ptr [eax], al
0041B7F6 0000 add byte ptr [eax], al
0041B7F8 0000 add byte ptr [eax], al
这时堆栈为
0012FFBC 0012FFE0 指向下一个 SEH 记录的指针
0012FFC0 0041B795 SE处理程序
0012FFC4 7C817067 返回到 kernel32.7C817067
按ctrl+G转到0041B795 后下断点,再继续shift+F9运行
0041B795 55 push ebp
;断点到此处后F8单步走
0041B796 8BEC mov ebp, esp
0041B798 57 push edi
0041B799 8B45 10 mov eax, dword ptr [ebp+10]
0041B79C 8BB8 C4000000 mov edi, dword ptr [eax+C4]
0041B7A2 FF37 push dword ptr [edi]
0041B7A4 33FF xor edi, edi
0041B7A6 64:8F07 pop dword ptr fs:[edi]
0041B7A9 8380 C4000000 0>add dword ptr [eax+C4], 8
0041B7B0 8BB8 A4000000 mov edi, dword ptr [eax+A4]
0041B7B6 C1C7 07 rol edi, 7
0041B7B9 89B8 B8000000 mov dword ptr [eax+B8], edi
0041B7BF B8 00000000 mov eax, 0
0041B7C4 5F pop edi
;直到这里停
0041B7C5 C9 leave
0041B7C6 C3 retn
到0041B795 后一直单步走,一直到0041B7C4 5F pop edi 这里后停下来!
信息面板提示:
堆栈 [0012FBE4]=00000000
edi=004130E0 (a.004130E0)
这里edi应该就是oep了,ctrl+G 转到004130E0下断点,再shift+F9运行到这后脱壳,检查了下脱壳出来的程序,提示被加了UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo的壳!试着运行了下,不能运行。然后我又用上面的方法脱了一遍,这次到了
004130E0 60 pushad
这里后没有脱壳,继续用ESP定律脱UPX的壳,F8后到了
004130E1 BE 00E04000 mov esi, 0040E000
这时寄存器的ESP为红色显示,右击ESP选择数据窗口中跟随,数据面板变成了
0012FFA4 0012BEF4
0012FFA8 7C92E900 ntdll.7C92E900
0012FFAC 0012FFF0
0012FFB0 0012FFC4
然后右击0012FFA4 0012BEF4下硬件访问断点word后F9运行,到了
7C81CB09 E8 46FFFFFF call 7C81CA54
;在这里被断下来了
7C81CB0E E9 9ACF0100 jmp 7C839AAD
7C81CB13 90 nop
7C81CB14 90 nop
7C81CB15 90 nop
7C81CB16 90 nop
7C81CB17 90 nop
7C81CB18 - FF25 0414807C jmp dword ptr [<&ntdll.LdrShutdownPr>; ntdll.LdrShutdownProcess
7C81CB1E 90 nop
7C81CB1F 90 nop
删除硬件断点后用F8单步,转到了
7C92E4F4 > C3 retn
;停在这里
7C92E4F5 8DA424 00000000 lea esp, dword ptr [esp]
7C92E4FC 8D6424 00 lea esp, dword ptr [esp]
7C92E500 > 8D5424 08 lea edx, dword ptr [esp+8]
7C92E504 CD 2E int 2E
7C92E506 C3 retn
7C92E507 90 nop
7C92E508 > 55 push ebp
7C92E509 8BEC mov ebp, esp
7C92E50B 9C pushfd
7C92E50C 81EC D0020000 sub esp, 2D0
之后进程终止!
我把第一次脱出来的程序单独用ESP定律脱壳也是一样的情况,不知道是哪里错了,请高手指点下!我OD已隐藏!
补充说明:
在脱掉ExeStealth壳后我使用importREC修复过,也不能运行!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)