把 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, 大家可以用老方法把这些代码找回来



我们重新载入, 第一句就是 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 查壳发现壳还是没脱掉, 但是我们用资源编辑软件可以编辑, 我们的目的已经达到了.