声明:
1.只为纪录自己成长历程,高手勿喷
2.您的热心是新手持续发帖的动力
1.载入PEID
ACProtect v1.35 -> risco software Inc. & Anticrack Soft
2.载入OD,需要注意的是,异常选项除了[内存访问异常]外其他全部勾选上,然后shift+F9运行至最后一次异常,是1次之后。第二次程序就跑飞了
[Asm] 纯文本查看 复制代码 00436000 > 60 pushad ; //入口
00436001 7C 03 jl short QQ个性签.00436006
00436003 7D 01 jge short QQ个性签.00436006
00436005 71 0B jno short QQ个性签.00436012
00436007 C2 66C1 retn 0xC166
0043600A D29E FC4566D3 rcr byte ptr ds:[esi-0x2C99BA04],>
00436010 D27403 75 sal byte ptr ds:[ebx+eax+0x75],cl
00436014 0177 66 add dword ptr ds:[edi+0x66],esi
3.落脚点,落脚后右键点堆栈窗口SE句柄---数据窗口跟随---数据窗口第一行下内存访问断点然后shift+F9
[Asm] 纯文本查看 复制代码 00447B1F CD 01 int 0x1 ; //落脚点
00447B21 40 inc eax
00447B22 40 inc eax
00447B23 0BC0 or eax,eax
00447B25 75 05 jnz short QQ个性签.00447B2C
00447B27 90 nop
00447B28 90 nop
[Asm] 纯文本查看 复制代码 0012FF44 00447B03 SE处理程序 //堆栈窗口
[Asm] 纯文本查看 复制代码 00447B03 0C245C8B //数据窗口第一行
4.落脚点,在落脚点下F2断点,然后shift+F9
[Asm] 纯文本查看 复制代码 00447B03 8B5C24 0C mov ebx,dword ptr ss:[esp+0xC] ; //落脚点
00447B07 8383 B8000000 0>add dword ptr ds:[ebx+0xB8],0x2
00447B0E 33C0 xor eax,eax
00447B10 C3 retn
00447B11 64:67:FF36 0000 push dword ptr fs:[0]
00447B17 64:67:8926 0000 mov dword ptr fs:[0],esp
5.落脚点,继续在这里下F2断点,然后shift+F9运行
[Asm] 纯文本查看 复制代码 00447B53 8B048E mov eax,dword ptr ds:[esi+ecx*4] ; //落脚点
00447B56 8B5C8E 04 mov ebx,dword ptr ds:[esi+ecx*4+0>
00447B5A 2BC3 sub eax,ebx
00447B5C C1C0 07 rol eax,0x7
00447B5F 33C2 xor eax,edx
00447B61 81C2 4B3DF129 add edx,0x29F13D4B
6.落脚点,先清除刚刚下的2个F2断点和1个内存访问断点,然后在最近的retn处F4
[Asm] 纯文本查看 复制代码 00447B67 89048E mov dword ptr ds:[esi+ecx*4],eax ; //落脚点
00447B6A 49 dec ecx
00447B6B ^ EB E1 jmp short QQ个性签.00447B4E
00447B6D 61 popad
00447B6E 61 popad
00447B6F C3 retn ; //F4
00447B70 0000 add byte ptr ds:[eax],al
7.在无StolenCode的帖子中已经说过,正常情况下接下来是在内存窗口的401000处下段然后shift+F9运行就可以到OEP了,但是我们这个壳你这样操作后会发现OEP处的代码好像不对劲,因为被抽取过了,我们要做的是点[调试]按钮---设置条件,或者使用快捷键ctrl+T,在弹出来的界面勾选最下面一个然后输入被偷取的代码,我使用的ximo教程里的壳,被偷取的代码为"push ebp",输入完后点确定,然后使用快捷键ctrl+F11跟踪步入(或者点[调试]--跟踪步入)
8.找到了我们被偷取的代码,在这个壳中被偷取了三行代码,选中这三行,二进制复制
[Asm] 纯文本查看 复制代码 004254C8 61 popad
004254C9 55 push ebp ; //被偷取1
004254CA 8BEC mov ebp,esp ; //被偷取2
004254CC 83EC 44 sub esp,0x44 ; //被偷取3
004254CF 60 pushad
004254D0 60 pushad
[Asm] 纯文本查看 复制代码 55 8B EC 83 EC 44 //二进制复制出来的,一共6个字节
9.然后到内存窗口,在401000处下断F2,然后shift+F9运行来到假的OEP,向上找6个字节(看代码第二列,两位为一个字节),然后右键--二进制---使用nop填充,填充完毕后再数6个字节,然后使用二进制粘贴
[Asm] 纯文本查看 复制代码 004010D2 56 push esi
004010D3 FF15 E4634000 call dword ptr ds:[0x4063E4] ; //假的OEP
004010D9 8BF0 mov esi,eax
004010DB 8A00 mov al,byte ptr ds:[eax]
004010DD 3C 22 cmp al,0x22
004010DF 75 1B jnz short notepad9.004010FC
004010E1 56 push esi
10.此时OEP已经补充完整了,接着右键点'push ebp'哪一行---点[此处新建EIP]然后就可以脱壳了,脱壳注意[重建输出表]这一项不勾选,脱壳后使用ImportREC修复,我在脱壳的过程中出现过修复失败的情况,这种情况我一般都是用ImportREC上修复的插件或者别的版本的ImportREC来修复,可以都试试。
[Asm] 纯文本查看 复制代码 004010CC 55 push ebp
004010CD 8BEC mov ebp,esp
004010CF 83EC 44 sub esp,0x44
004010D2 56 push esi
004010D3 FF15 E4634000 call dword ptr ds:[0x4063E4] ; notepad9.0040D1BA
004010D9 8BF0 mov esi,eax ; kernel32.BaseThreadInitThunk
004010DB 8A00 mov al,byte ptr ds:[eax]
004010DD 3C 22 cmp al,0x22
004010DF 75 1B jnz short notepad9.004010FC
004010E1 56 push esi
11.运行查壳
运行OK,查壳:Microsoft Visual C++ v6.0 SPx
|