基础脱壳教程20:另类方法解 ACProtect

INT 3 中断 的勾勾去掉, 隐藏 OD, 要多试几次才能断下来, 我们现在断在了 0043D99F

老方法, 找到 SE处理程序, 下内存访问断点 ……

内存窗口, .text 下断, 我们来到假的 OEP :

0040A483    A3 ECFF4000         mov dword ptr ds:[40FFEC],eax  //假OEP
0040A488    E8 16010000         call 跑跑排行.0040A5A3
0040A48D    391D 90FE4000       cmp dword ptr ds:[40FE90],ebx
0040A493    75 0C               jnz short 跑跑排行.0040A4A1
0040A495    68 A0A54000         push 跑跑排行.0040A5A0
0040A49A    FF15 CCC24000       call dword ptr ds:[40C2CC]                      ; msvcrt.__setusermatherr
0040A4A0    59                  pop ecx
0040A4A1    E8 E8000000         call 跑跑排行.0040A58E
0040A4A6    68 1CF04000         push 跑跑排行.0040F01C
0040A4AB    68 18F04000         push 跑跑排行.0040F018
0040A4B0    E8 D3000000         call 跑跑排行.0040A588                              ; jmp 到
0040A4B5    A1 C8FF4000         mov eax,dword ptr ds:[40FFC8]

我们拿没加壳的程序比较一下, 一下就发现了 stolen code, 大家可以用老方法把这些代码找回来

假的OEP
与未加壳的程序进行比较
黄色部分为假的 OEP, 上面都是被偷走的代码

我们重新载入, 第一句就是 pushad 关键句, 我们在这用 ESP 定律, 运行第一次是在 popad 下面, 注意这里没有删硬件断点

然后我们接着运行, 来到 pushad 下面, 然后我们一直运行, 运行到最后一次异常前面

来到如下代码处 :

00441E4D    64:A1 00000000      mov eax,dword ptr fs:[0]        //脱壳最佳时机
00441E53    8905 39CA4200       mov dword ptr ds:[42CA39],eax
00441E59    FF35 39CA4200       push dword ptr ds:[42CA39]
00441E5F    8F05 71CA4200       pop dword ptr ds:[42CA71]
00441E65    FF35 71CA4200       push dword ptr ds:[42CA71]
00441E6B    891C24              mov dword ptr ss:[esp],ebx
00441E6E    890424              mov dword ptr ss:[esp],eax
00441E71    64:8925 00000000    mov dword ptr fs:[0],esp
00441E78    83EC 68             sub esp,68
00441E7B    8905 11C94200       mov dword ptr ds:[42C911],eax
00441E81    FF35 11C94200       push dword ptr ds:[42C911]
00441E87    51                  push ecx
00441E88    B9 91C94200         mov ecx,跑跑排行.0042C991
00441E8D    8BC1                mov eax,ecx
00441E8F    59                  pop ecx
00441E90    8918                mov dword ptr ds:[eax],ebx

我们在这开始脱壳, 不用去假的 OEP, 我们在 ImportREC 填假的 OEP : A483

我用插件修复后, 再看无效函数, 发现还有两个无效的, 直接剪掉, 然后我们修复转存, 发现跑不起来

原因是我们用的假的 OEP, 我们在 ImportREC 那里填上 41E4D 这个地址, 就是刚才发现 stolen code 的地方

注意, 是在你修复完那些无效函数之后再改 OEP !

然后转存, 现在就可以跑起来了.

PEiD 查壳发现壳还是没脱掉, 但是我们用资源编辑软件可以编辑, 我们的目的已经达到了.