目录 Table of Contents
一些简单的以壳解壳理论
stolen code : 程序的一部分代码被抽取到壳里面, 然后我们把壳脱掉之后, 自然也把那些被抽取的代码脱掉了, 程序当然无法运行
以壳解壳针对 stolen code 比较多的情况下的懒方法
以壳解壳的问题 : 加入源程序中有壳的校验, 或者一些暗桩, 那我们把代码区段补上去之后, 无异于引狼入室
因为以壳解壳并不是把被抽取的代码补上去, 而是把包含被抽取代码的壳的代码, 这个区段全给补上去
而且补完之后, 程序会变大
实战以壳解壳
1、忽略除内存访问外的所有异常,SHIFT+F9,来到最后一次异常
只取消 非法访问内存
的勾勾

2、来到最近的 retn
取消断点
3、Alt+M 打开内存镜像,在 00401000 处下断,SHIFT+F9,到达假 OEP,记下
这里我 F8 跟了一下才到假的 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

6、修复
OEP 填假的 OEP, 获取输入表 balabala….
这里步骤就和上一节课一样了, 当然软件也是一样地死掉orz
我们这么做肯定还是跑不起来的, 假的 OEP 怎么可能跑得起来
刚才不是在 ImportREC 里把无效函数都修复了吗 ?
还是在这个界面, 我们把 OEP 改成 885793, 就是最佳地的地址减去基址