记手动脱壳
其实之前也手脱过一些壳,但一直没仔细研究过。。。
#以下方法参考《加密与解密第四版》,程序可在随书文件里找到
EXE
一,寻找OEP
1,根据跨段指令寻找
入口处
在401130处要用ctrl+A重新分析代码
其实这种方法只要f8不跑飞,一直f8就行
2,内存访问断点寻找
通过在.text段下内存访问断点后f9,运行到OEP时会断下来
但因为程序会先对.text段进行解密,所以感觉并不好用
3,根据栈平衡原理
因为要保护现场环境,通常会使用pushad/popad,pushfd/popad
pushad前的esp
pushad后
(1) 在19ff54处下个硬件访问断点,f9
(2)在19ff70处下硬件写入断点,f9
两种方法区别不大
二,Dump与Anti-Dump
1,纠正SizeOfImage
程序MODULERNTRY32中modBaseSize被修改
可以看到镜像大小只有1000
注:如果用OllyDump直接默认dump即可
2,修改内存属性
通过将部分地址设为不可读,
可以看到被设置成了无法访问
之后dump
三,重建输入表
1,寻找IAT
找到这样的指令
这段就是IAT
2,重建输入表
(1)使用import REC
运行要脱壳的程序,attach process
填入OEP的RVA,使用IAT AutoSearch
点Get import
使用Fix Dump修复dump出的文件
可以看到多了一个.mackt段,输入表被放到了这里
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DLL
一,寻找OEP
和exe的方法几乎一致,但有可能不会在外壳的入口处停下来,可以先将入口处的数据改为 EB FE,运行后不断在入口处循环,f12停下后改为原数据后调试
dll被映射到了30000处,找到的OEP为31240,OEP的RVA为1240
寻找IAT:和exe一致
二,Dump
要修改Image Base的值为当前的值
三,修复输入表
管理员打开Import REC,attach到loaddll,pick dll
选择edrlib,填入OEP,IAT的RVA和size,fix dump
四,构建重定位表
找到重定位初始化的地方
(图不是一次截得,和下面地址不一样)
RVA为c000
分配一段地址
打个补丁
跑出来(注:第一次的edx值要手动设置分配出来的地址)
二进制复制出来放进010editor(shift+ctrl+v复制hex,直接在菜单里好像找不到)存为Relo.bin
运行ReloRCE,把文件拖进去
fix Dump