0%

NewSectionFindLoseData

包含壳的脱壳

有的时候我们丢失的数据过多,如果我们要找到我们所有丢失的数据基本上是不是太可能的,这个时候我们将壳的一部分包含在程序当中,当不需要做太大的动作的时候,我们的这种做法还是可以的,具体操作如下:

AsProtect找丢失的数据区段

首先我们先找到我们假的OEP,这个壳子我们还是用最后一次异常法:我们先隐藏OD,其实可以用OD插件的options设置开启自动隐藏(小技巧),这个时候我们设置我们的异常为:
异常设置
然后我们用最后一次异常法(shift+F9),这里一共是27次,在26次的时候我们我们调节我们的异常这个地方我不知道其他人为啥可以,但我就是不可以,我们这个时候将我们的异常调节为:
异常设置
然后我们在最近的一个retn下端,然后执行过去:
retn处
这个时候注意看我在堆栈处的箭头,在这个地方下硬件下硬件写入断点(具体原因只有当时研究的人知道),然后我们的程序会跑到一个jmp处,我们删除硬件写入断点,然后往下跟句,然后我们当前的位置:
适合找数据的位置
塑这个位置使我们比较合适的找数据的位置:

1
2
3
4
5
6
7
8
9
00CC696F    BB A2000000     MOV EBX,0A2
00CC6974 0BDB OR EBX,EBX
00CC6976 75 07 JNZ SHORT 00CC697F
00CC6978 894424 1C MOV DWORD PTR SS:[ESP+1C],EAX
00CC697C 61 POPAD
00CC697D 50 PUSH EAX
00CC697E C3 RETN
00CC697F E8 00000000 CALL 00CC6984
00CC6984 5D POP EBP

然后我们用我们的LoadPE进行脱壳:
在这里我们先纠正镜像大小,然后完全转存。
下面比较重要,注意看我们需要区域转存:
区域转存
区域转存
注意我们选择的区段要包含我们刚才停留的位置:这个时候我们使用LoadPE给我们的PE编辑器,打开文件,点击编辑区段:
区段编辑
区段编辑
导入我们刚才的区段。
计算区段
这里我们用我们当前的位置减去我们的基址(也就是400000),得到我们的虚拟地址,然后我们保存一下。
这个时候我们重建PE,但在重建之前我们需要设置:
重建PE
只留下验证PE就好了,我们重建确定。

AsProtect找假OEP

然后我们找我们假的OEP,这个地方我们很简单,我们在我们的code断下内存访问中断,然后我们运行,运行到这个地方:
假OEP

1
2
3
4
5
6
7
8
9
10
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

我们这个时候重建输入表,import REC我们填写我们的假OEP,然后查找:
重建IAT
我们用等级一修复,还剩下六个,我们用ASProcet的插件进行搜索,最后得到的结果:
重建IAT
我们全部都找到了。
我们修改我们的OEP,修改为我们的假OEP地址的相对地址:0x00CC696F-0x00400000=0x008C696F
修改OEP
然后抓取修复就可以了。
PS:但在这个地方,我却没有成功,不知道为什么。但是操作确实是这个样子的,可能是OD的版本不同,或者我查看的这个程序是在是太老了的原因,这也算是给自己留下的一个疑惑吧,脱壳学习,先暂停一下,是时候复习一下Win32了!