基础脱壳教程24:ASProtect之以壳解壳

论坛补充
其他人的笔记

一些简单的以壳解壳理论

stolen code : 程序的一部分代码被抽取到壳里面, 然后我们把壳脱掉之后, 自然也把那些被抽取的代码脱掉了, 程序当然无法运行

以壳解壳针对 stolen code 比较多的情况下的懒方法

以壳解壳的问题 : 加入源程序中有壳的校验, 或者一些暗桩, 那我们把代码区段补上去之后, 无异于引狼入室

因为以壳解壳并不是把被抽取的代码补上去, 而是把包含被抽取代码的壳的代码, 这个区段全给补上去

而且补完之后, 程序会变大

实战以壳解壳

1、忽略除内存访问外的所有异常,SHIFT+F9,来到最后一次异常

只取消 非法访问内存 的勾勾

最后一次异常

2、来到最近的 retn

取消断点

3、Alt+M 打开内存镜像,在 00401000 处下断,SHIFT+F9,到达假 OEP,记下

这里我 F8 跟了一下才到假的 OEP

假的OEP
004F27CF     FF15 9CC25200       call dword ptr ds:[52C29C]
004F27D5     33D2                xor edx,edx
004F27D7     8AD4                mov dl,ah
004F27D9     8915 34306900       mov dword ptr ds:[693034],edx
004F27DF     8BC8                mov ecx,eax
004F27E1     81E1 FF000000       and ecx,0FF
004F27E7     890D 30306900       mov dword ptr ds:[693030],ecx
004F27ED     C1E1 08             shl ecx,8
004F27F0     03CA                add ecx,edx
004F27F2     890D 2C306900       mov dword ptr ds:[69302C],ecx
004F27F8     C1E8 10             shr eax,10
004F27FB     A3 28306900         mov dword ptr ds:[693028],eax
004F2800     6A 01               push 1
004F2802     E8 933B0000         call SoWorker.004F639A
004F2807     59                  pop ecx
004F2808     85C0                test eax,eax
004F280A     75 08               jnz short SoWorker.004F2814

4、重新来,重复上面 1 和 2 步, 下 hr 0012ff68,SHIFT+F9,取消断点,F8,来到最佳的以壳解壳地方

堆栈窗口找那个第二行下硬件断点, 也就是图中黄色选中部分

上节课是在这里下硬件断点, 也就是 0012FFA4, 这节课我们下 0012FF68, 上节课下 0012FF68 也可以找回代码

下断点后运行

记得取消断点

我们然后单步走两步来到这 :

00C85793     BB A2000000         mov ebx,0A2  //最佳地
00C85798     0BDB                or ebx,ebx
00C8579A     75 07               jnz short 00C857A3
00C8579C     894424 1C           mov dword ptr ss:[esp+1C],eax
00C857A0     61                  popad
00C857A1     50                  push eax
00C857A2     C3                  retn
00C857A3     E8 00000000         call 00C857A8
00C857A8     5D                  pop ebp
00C857A9     81ED 4DE14B00       sub ebp,4BE14D
这里我的地址和视频中有些区别

然后我们脱壳

5、完整转存,区域转存

区域转存

我们把包含代码的那个区段也给转存下来, 我们选择 区域转存

就是找包含 00C85793 这个地址的这一段 (我虚拟机里是 00C87067)

然后我们要把这个区段添加到我们脱完壳的那个程序中去

打开 PE编辑器, 选中脱完壳的那个程序, 然后选择 区段, 我们 从磁盘载入区段, 然后编辑刚才载入的区段

从磁盘载入区段

名字随便取, 虚拟地址的计算方法 : 00C8 0000 - 基址 0040 0000 = 880000

然后我们保存一下

编辑区段

在重建 PE 前说明一下, 选项卡只选 使PE有效

使区段有效

然后我们重建PE

重建PE

6、修复

OEP 填假的 OEP, 获取输入表 balabala….

这里步骤就和上一节课一样了, 当然软件也是一样地死掉orz

我们这么做肯定还是跑不起来的, 假的 OEP 怎么可能跑得起来

刚才不是在 ImportREC 里把无效函数都修复了吗 ?

还是在这个界面, 我们把 OEP 改成 885793, 就是最佳地的地址减去基址