进入吾爱有段时间了,教程看了很多,当然会手痒忍不住动手玩玩喽
看到求助区有个软件加了ASPack 壳,嗯,好像很容易欺负,那就蹂躏它吧
(原帖https://www.52pojie.cn/thread-946792-1-1.html)
萌新首帖,一步步记录过程,希望能给其他新货们灵感,共同进步吧
首先查壳
嗯,工具查看,是带着 ASPack,那拖入OD,ESP 就能搞定了,赶紧试试吧
带壳拖入OD,停在这:
[Asm] 纯文本查看 复制代码 00429B68 > 55 push ebp
00429B69 52 push edx ; ntdll.KiFastSystemCallRet
00429B6A 53 push ebx
00429B6B 51 push ecx
00429B6C 57 push edi
00429B6D 56 push esi
00429B6E E8 01000000 call tjydhenz.00429B74
00429B73 3058 2D xor byte ptr ds:[eax+0x2D],bl
00429B76 0B10 or edx,dword ptr ds:[eax]
额,好像不是我了解的ASPack特征啊
试试 ESP 定律,好吧,程序飞了,这让我怎么欺负它呀
怎么办呢,记住以下的大致方案:
无从下手的时候 F8 单步跟
向上跳转时,F4下一句
程序跑飞时,记住位置,F7 步入
奔溃时,找到位置,看能不能跳过,或者NOP掉
OK,撸起袖子从头开始,开干
在入口点往下拖
[Asm] 纯文本查看 复制代码 00429BC2 58 pop eax ; kernel32.7C817077
00429BC3 5E pop esi ; kernel32.7C817077
00429BC4 5E pop esi ; kernel32.7C817077
00429BC5 5F pop edi ; kernel32.7C817077
00429BC6 59 pop ecx ; kernel32.7C817077
00429BC7 5B pop ebx ; kernel32.7C817077
00429BC8 5A pop edx ; kernel32.7C817077
00429BC9 5D pop ebp ; kernel32.7C817077
00429BCA FFE0 jmp eax ; 下断,F9运行到这,而后F8
来到这
[Asm] 纯文本查看 复制代码 00426001 60 pushad
00426002 E8 03000000 call tjydhenz.0042600A ; F8会挂,所以F7进入
00426007 - E9 EB045D45 jmp 459F64F7
0042600C 55 push ebp ; tjydhenz.00426008
0042600D C3 retn
[Asm] 纯文本查看 复制代码 0042602F /0F85 65030000 jnz tjydhenz.0042639A ; [color=#ff0000]发现下面有个Call会奔溃[/color]
00426035 |8D85 2E040000 lea eax,dword ptr ss:[ebp+0x42E]
0042603B |50 push eax ; tjydhenz.00426001
0042603C |FF95 4D0F0000 call dword ptr ss:[ebp+0xF4D] ; kernel32.GetModuleHandleA
00426042 |8985 26040000 mov dword ptr ss:[ebp+0x426],eax ; tjydhenz.00426001
00426048 |8BF8 mov edi,eax ; tjydhenz.00426001
0042604A |8D5D 5E lea ebx,dword ptr ss:[ebp+0x5E]
0042604D |53 push ebx ; tjydhenz.00400000
0042604E |50 push eax ; tjydhenz.00426001
0042604F |FF95 490F0000 call dword ptr ss:[ebp+0xF49] ; kernel32.GetProcAddress
00426055 |8985 4D050000 mov dword ptr ss:[ebp+0x54D],eax ; tjydhenz.00426001
0042605B |8D5D 6B lea ebx,dword ptr ss:[ebp+0x6B]
0042605E |53 push ebx ; tjydhenz.00400000
0042605F |57 push edi
00426060 |FF95 493C0000 call dword ptr ss:[ebp+0x3C49] ;[color=#ff0000] 这个Call,执行会奔溃[/color]
00426066 |8985 51050000 mov dword ptr ss:[ebp+0x551],eax ; tjydhenz.00426001
0042606C |8D45 77 lea eax,dword ptr ss:[ebp+0x77]
正常调试时,上面的跳转未实现,一直往下会执行“00426060 |FF95 493C0000 call dword ptr ss:[ebp+0x3C49]”,从而奔溃
重新载入,运行到该跳转,修改 ZF 标记,使其跳转实现,再几次 F8 后 会发现执行到这,显然这是未解密的代码,所以跳转不能实现,还是老老实实的吧
[Asm] 纯文本查看 复制代码 00419743 . 0000 add byte ptr ds:[eax],al
00419745 ? 0000 add byte ptr ds:[eax],al
00419747 ? 0000 add byte ptr ds:[eax],al
00419749 $ 0000 add byte ptr ds:[eax],al
0041974B ? 0000 add byte ptr ds:[eax],al
0041974D ? 0000 add byte ptr ds:[eax],al
0041974F ? 0000 add byte ptr ds:[eax],al
00419751 ? 0000 add byte ptr ds:[eax],al
00419753 ? 0000 add byte ptr ds:[eax],al
00419755 ? 0000 add byte ptr ds:[eax],al
那崩溃的Call怎么办呢,NOP掉,当然,记得将它的参数一起NOP
[Asm] 纯文本查看 复制代码 0042604E 50 push eax ; kernel32.VirtualAlloc
0042604F FF95 490F0000 call dword ptr ss:[ebp+0xF49] ; kernel32.GetProcAddress
00426055 8985 4D050000 mov dword ptr ss:[ebp+0x54D],eax ; kernel32.VirtualAlloc
0042605B 8D5D 6B lea ebx,dword ptr ss:[ebp+0x6B]
0042605E 90 nop
0042605F 90 nop
00426060 90 nop ; 这个Call,执行会奔溃
00426061 90 nop
00426062 90 nop
00426063 90 nop
00426064 90 nop
00426065 90 nop
00426066 8985 51050000 mov dword ptr ss:[ebp+0x551],eax ; kernel32.VirtualAlloc
0042606C 8D45 77 lea eax,dword ptr ss:[ebp+0x77]
一路单步执行,最终来到这
[Asm] 纯文本查看 复制代码 00419743 . 60 pushad
00419744 . E8 00000000 call tjydhenz.00419749 ; F7 跟入
00419749 $ 5D pop ebp ; 0012FFC8
0041974A . 81ED 06104000 sub ebp,tjydhenz.00401006
00419750 . 8D85 56104000 lea eax,dword ptr ss:[ebp+0x401056]
同样 CALL F8会跑飞,就 F7 跟入,期间经过一段系统领空,出来后到这
[Asm] 纯文本查看 复制代码 00419767 . 64:8F05 00000>pop dword ptr fs:[0] ; 0012FFE0
0041976E . 83C4 04 add esp,0x4
00419771 . 74 05 je short tjydhenz.00419778
00419773 . 75 03 jnz short tjydhenz.00419778
00419775 . EB 07 jmp short tjydhenz.0041977E
00419777 . 59 pop ecx ; 0012FFE0
00419778 > 8D9D 00104000 lea ebx,dword ptr ss:[ebp+0x401000]
0041977E > 53 push ebx
0041977F . 5F pop edi ; 0012FFE0
00419780 . 2BFA sub edi,edx
00419782 . 57 push edi ; ntdll.KiFastSystemCallRet
00419783 > 8A03 mov al,byte ptr ds:[ebx]
00419785 . 3007 xor byte ptr ds:[edi],al
00419787 . 43 inc ebx
00419788 . 47 inc edi ; ntdll.KiFastSystemCallRet
00419789 .^ E2 F8 loopd short tjydhenz.00419783
0041978B . 58 pop eax ; 0012FFE0
0041978C . 894424 1C mov dword ptr ss:[esp+0x1C],eax ; tjydhenz.00419799
00419790 . 61 popad
00419791 . FFE0 jmp eax ; tjydhenz.00419799 ; 跳到OEP
最后的 jmp eax 就是飞向OEP了
[Asm] 纯文本查看 复制代码 00418810 /. 55 push ebp ; OEP
00418811 |. 8BEC mov ebp,esp
00418813 |. B9 07000000 mov ecx,0x7
00418818 |> 6A 00 /push 0x0
0041881A |. 6A 00 |push 0x0
0041881C |. 49 |dec ecx
0041881D |.^ 75 F9 \jnz short tjydhenz.00418818
0041881F |. 53 push ebx
00418820 |. 56 push esi
00418821 |. 57 push edi ; ntdll.KiFastSystemCallRet
00418822 |. B8 78874100 mov eax,tjydhenz.00418778
00418827 |. E8 68D3FEFF call tjydhenz.00405B94
0041882C |. BE A8C94100 mov esi,tjydhenz.0041C9A8
00418831 |. 33C0 xor eax,eax ; tjydhenz.00418810
00418833 |. 55 push ebp ; tjydhenz.00426001
00418834 |. 68 02944100 push tjydhenz.00419402
00418839 |. 64:FF30 push dword ptr fs:[eax]
0041883C |. 64:8920 mov dword ptr fs:[eax],esp
0041883F |. 33C0 xor eax,eax ; tjydhenz.00418810
00418841 |. A3 90C94100 mov dword ptr ds:[0x41C990],eax ; tjydhenz.00418810
00418846 |. 64:8B05 30000>mov eax,dword ptr fs:[0x30]
0041884D |. 0FB640 02 movzx eax,byte ptr ds:[eax+0x2]
00418851 |. 08C0 or al,al
00418853 |. 74 0A je short tjydhenz.0041885F
其实是不是OEP,心里没底,不是VC/C++,VB,易语言,有点像Delphi,但比对 H大 教程例子中的Delphi程序入口,又不是
不管了,先当这就是吧,老套路,LordPE dump,ImportREC 修复
嗯,IAT 也没问题,难道成功了??
试试吧,运行修复后的文件
好激动,真的成功了
后记:脱壳除了ESP外,还有二次镜像、模拟跟踪 等等方法,那这个程序呢
ALT+O,打开调试设置窗口,将 SFX 选项卡 按照以下设置,点击确定,而后清理所有断点
重新载入,会发现程序停在以下位置,熟悉吧,最后一句就是跳转到 OEP 的关键跳啊
[Asm] 纯文本查看 复制代码 00419785 . 3007 xor byte ptr ds:[edi],al
00419787 . 43 inc ebx ; tjydhenz.00419743
00419788 . 47 inc edi ; tjydhenz.00418810
00419789 .^ E2 F8 loopd short tjydhenz.00419783
0041978B . 58 pop eax ; tjydhenz.00418810
0041978C . 894424 1C mov dword ptr ss:[esp+0x1C],eax ; tjydhenz.00419760
00419790 . 61 popad
00419791 .^ FFE0 jmp eax ; tjydhenz.00419760
dump后进行修复,程序同样能够跑起来,成功,这个够省力吧,但不推荐,为啥,我是来练习的,结果是重要,但过程更重要
先到这吧,等有时间试试其他方法
|