逆向学习软件脱壳技术
第一步找:OEP(orginal entry point)入口点
一般都会先pushad 保存寄存器
找popad:
方式一:
F8单步执行 =》ESP内存 数据窗口中跟随
=》上面8字节寄存器内容打硬件断点 硬件访问word/dword
=》F9 popad
=》F8单步
=》分析 分析代码
方式二 :
CPU寄存器窗口,ESP右键HW break
方式三:
直接搜索popad 暴力搜索popad机器码0x61
dump:
loadPE
OD脱壳调试进程
起始地址:真正的加载基地址 PE头文件
起始地址+入口点地址=EIP值
起始地址:9A0000
入口点地址:009B816F-9A0000=1816F
二次断点法找OEP:
1 | .text .data .rdata .rsrc .reloc |
先给.rsrc资源节页面下内存访问断点F9运行
解压到资源节会断下,前面.text已经完成解压缩
再给代码节.text节下内存访问断点F9
外壳工作完成以后,切回OEP执行时触发内存访问断点,停在OEp
给整个节下断点
memory内存窗口F2下断点.radata
SFX找OEP:
调试选项:字节方式跟踪真正入口
最后一次异常法:
壳防止分析会抛出一些异常进行干扰,直到把流程交给OEP
定位到最后一次异常离OEP就不远了
执行2次,第一次计算异常次数比如10
第2次,停在第10次异常找到OEP
插件异常计算器
通过OEP附近函数倒退OEP:
GetVersion函数
跨段转移指令找OEP:
外壳解压缩完成会通过jmp或retn等指令跳转到程序原来的OEP .text
会跨段
1 | 1、ESP定律法(堆栈平衡) |
导入表问题:
导入表在某个节里面,加壳时导入表被破坏
除了各个节压缩,还需要构建新的导入表出来
外壳模仿加载器加DLL
找IAT,通过IAT调用外部函数时,call dword ptr或者jmp dword ptr
dump时,勾选重建输入表
ImportREC工具导入表
默认加载地址随机化
重定位表,dump出来PE文件加载基地址不一样
1、编译随机地址关掉
2、StudyPE 固定PE基址 (改PE文件可选头)
3、dump时重定向表也构建 ReloX 运行两次compare对比
__END__