文章整理自黑鹰视频教程
1、查壳显示“ACProtect 1.40 - 1.41 - RISCO Software Inc.”
2、OD载入(用看雪论坛上的OD即可),打开“调试选项->异常”,除了“非法访问内存”和“同时忽略以下指定的异常或范围”这两项不勾以外,其他的都打勾。
3、重新载入程序,F9运行,程序断下来,如下所示:
0043374D |. CD 01 int 1
0043374F |. 40 inc eax
00433750 |. 40 inc eax
00433751 |. 0BC0 or eax, eax
00433753 |. 75 05 jnz short 0043375A
堆栈窗口显示如下:
0012FF84 0012FFE0 指向下一个 SEH 记录的指针
0012FF88 00433731 SE处理程序
0012FF8C 00123F2D
0012FF90 6CE87C5E
在SE处理程序这一行的“00433731”数据窗口中跟随,在数据窗口该地址处右键“断点->内存访问”下内存访问断点。Shift+F9运行。
4、程序在如下处断了下来:
00433731 . 8B5C24 0C mov ebx, dword ptr [esp+C]
00433735 . 8383 B8000000>add dword ptr [ebx+B8], 2
0043373C . 33C0 xor eax, eax
0043373E . C3 retn
在00433731这一行F2下断,Shift+F9运行。
5、程序在如下处断了下来:
00433781 |. 8B048E |mov eax, dword ptr [esi+ecx*4]
00433784 |. 8B5C8E 04 |mov ebx, dword ptr [esi+ecx*4+4]
00433788 |. 2BC3 |sub eax, ebx
0043378A |. C1C8 05 |ror eax, 5
0043378D |. 2BC2 |sub eax, edx
0043378F |. 81C2 43A18EAB |add edx, AB8EA143
在00433781这一行F2下断,Shift+F9运行。
6、程序在如下处断了下来:
00433795 |. 89048E |mov dword ptr [esi+ecx*4], eax
00433798 |. 49 |dec ecx
00433799 |.^ EB E1 \jmp short 0043377C
0043379B |> \61 popad
0043379C |. 61 popad
0043379D \. C3 retn
此时删除前面的断点(注意,有两个F2断点和一个内存访问断点)。在最后0043379D这一行F4运行到该行,打开内存镜像,在程序的.text代码段F2下断,Shift+F9运行。
7、程序断在如下处:
00401B4A $- FF25 7C114000 jmp dword ptr [40117C] ; MSVBVM60.ThunRTMain
00401B50 47 db 47 ; CHAR 'G'
00401B51 6B db 6B ; CHAR 'k'
00401B52 2B db 2B ; CHAR '+'
00401B53 2E db 2E ; CHAR '.'
00401B54 36 db 36 ; CHAR '6'
00401B55 E6 db E6
00401B56 96 db 96
堆栈窗口如下:
0012FFD8 00438CC9 返回到 123.00438CC9 来自 123.00401B4A
0012FFDC 00402C98 ASCII "VB5!6&vb6chs.dll"
0012FFE0 FFFFFFFF SEH 链尾部
0012FFE4 7C839AA8 SE处理程序
0012FFE8 7C817080 kernel32.7C817080
在反汇编窗口中00401B50处修改反汇编代码如下:
00401B50 68 982C4000 push 00402C98 ; ASCII "VB5!6&vb6chs.dll"
00401B55 E8 F0FFFFFF call 00401B4A ; jmp 到 MSVBVM60.ThunRTMain
00401B5A 90 nop
注意,push 00402C98这一行的地址来源于堆栈窗口中00402C98 ASCII "VB5!6&vb6chs.dll",而call 00401B4A这一行的地址来源于反汇编窗口中的MSVBVM60.ThunRTMain这一行,不同的程序要区别对待。
8、dump文件,注意,程序入口点要填1B50。脱壳成功。