[代码混掉怎么办 ?]基础脱壳教程18:ACProtect之寻找丢失的Stolen Code

关于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 区段的修改你也可以自己修改

来自论坛的疑问

https://www.52pojie.cn/thread-900297-1-1.html