目录 Table of Contents
关于Stolen Code的简单解释
就是一些加壳的软件把程序原有的 OEP 代码抽取了一部分, 这些代码被抽到了壳里面, 所以脱完壳之后, 自然也把壳内 OEP 给脱掉了, 自然跑不起来
常用语言的入口特征是基础 !
我们先查壳, ACProtect, OD 载入
1.设置异常(忽略除INT3中断的所有异常),隐藏OD
如果只是把 非法访问内存
的勾勾去掉, 会发现程序根本就跳不过异常, 如图
我们只把 INT 3 中断
的勾勾去掉, 当然大家可以自己去试一下到底去掉哪个异常的勾勾

2.来到入口点,F9运行
程序入口点 :
004AC000 > 60 pushad //记住这个
004AC001 4E dec esi
004AC002 D3D6 rcl esi,cl
004AC004 4E dec esi
004AC005 66:D3E8 shr ax,cl
004AC008 4E dec esi
004AC009 8BC3 mov eax,ebx
004AC00B 48 dec eax
然后我们 F9 运行
3.程序中断在这里
004BAB23 90 nop //这其实也是最后一次异常
004BAB24 64:67:8F06 0000 pop dword ptr fs:[0]
004BAB2A 83C4 04 add esp,4
004BAB2D 60 pushad
004BAB2E E8 00000000 call NetClean.004BAB33
004BAB33 5E pop esi
004BAB34 83EE 06 sub esi,6
004BAB37 B9 5B000000 mov ecx,5B
004BAB3C 29CE sub esi,ecx
004BAB3E BA 09E5B87E mov edx,7EB8E509
004BAB43 C1E9 02 shr ecx,2
004BAB46 83E9 02 sub ecx,2
004BAB49 83F9 00 cmp ecx,0
004BAB4C 7C 1A jl short NetClean.004BAB68
004BAB4E 8B048E mov eax,dword ptr ds:[esi+ecx*4]
4.看堆栈,找SE句柄,数据窗口跟随,下硬件访问断点,shift+F9
老办法, 堆栈窗口找到 SE 处理程序
, 数据窗口跟随
, 这里也可以下 内存访问断点
Shift F9
5.下断,再次SHIFT+F9,下断,再次SHIFT+F9,取消所有断点,直接F4到RETN处
完成刚才那一步之后就 F2 下断, 再次 Shift F9,
再次 F2 下断, Shift F9
取消所有断点, 别忘了内存断点
然后在 retn
处 F4
然后 Alt+M 来到内存, 在 .text 处 F2 下断
Shift F9 来到假的 OEP
6.下d 12ffc0,下硬件断点。SHIFT+F9。
下面我们找丢失的代码
我们输入 d 12ffc0
, 然后下硬件断点, 这也算是 ACProtect 的一个死穴吧, 下这个就可以把丢失的代码找出来
Shift F9 发现程序跑飞, 我们重来一次, 记得取消断点
我们老方法来到 004BAB62
, 删除所有断点, 然后 retn
处 F4
然后我们 d 12ffc0
, 然后下硬件访问断点, Shift F9 运行然后删除硬件断点
7.记下Stolen Code 。
004C9B31 55 push ebp
004C9B32 8BEC mov ebp,esp
004C9B34 6A FF push -1
我们 二进制复制
一下, 然后我们就去假的 OEP 了
8.找到内存,在00401000处下断,F2,SHIFT+F9。
内存窗口, 在 .text 处下断, Shift F9 就来到假的 OEP 了
004431F9 68 D8B24400 push NetClean.0044B2D8 //这里其实是假的OEP!!
004431FE 68 B4334400 push NetClean.004433B4 ; jmp 到
00443203 64:A1 00000000 mov eax,dword ptr fs:[0]
00443209 50 push eax
0044320A 64:8925 0000000>mov dword ptr fs:[0],esp
00443211 83EC 68 sub esp,68
00443214 53 push ebx
9.写入真实的代码!!
我们向上拉, 但是我们发现, 向上拉程序代码会混掉, 我们试试 Ctrl+A 分析代码
然后按住 Ctrl 键向上拉, 现在可以拉了

我们看看被偷取了多少字节的代码, 数一下是 5 个字节, 所以我们向上找 5 个字节, 找到 004431F4
, 注意一个 db
是一个字节
我们直接把刚才复制的 OEP 代码粘贴上去
10.OD插件脱壳,注意,修正OEP地址!!
11. IR修复,用等级3, 不能修复的CUT掉, 抓取修复, 程序还是报错!
这是因为壳的版本比较高, 壳有自动保护功能
12.做下处理。来到壳的入口。也就是第一步记下的地址
我们 OD 载入 dumped_.exe
CTRL+G,004AC000, 来到最开始的入口点, 我们把原来入口点的地址伪装成 OEP
13.写入真的OEP代码。
当然我们还是得跳到程序真正 OEP 去, 我们直接在 004AC005
这里改
第一种改法, 我们可以直接无条件跳转 jmp 00431F4

第二种改法, 先把地址压栈, 然后用一个返回命令直接到 OEP

然后我们右键复制到可执行文件, 选择
, 重新去个名字, 程序还是跑不起来

原因是这个是真正的 OEP, 而不是我们伪装的那个 OEP
14.Lord PE修正入口点
我们用 Lord PE 的 PE 编辑器改一下入口点
15.保存,脱壳成功!
查壳, 什么也没发现, EP 区段还是 ACProtect, 壳其实已经脱干净了, 这就涉及到区段的优化了, 如果你会 EP 区段的修改你也可以自己修改