逆向学习软件脱壳技术

第一步找: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
2
3
4
5
6
7
8
1、ESP定律法(堆栈平衡)
2、直接搜索popad(堆栈平衡)
3、二次断点法
4、SFX(自解压分析)
5、最后一次异常法
6、OEP附近函数下断倒推
7、跨段转移指令
8、单步跟踪法、根据特征寻找

导入表问题:

导入表在某个节里面,加壳时导入表被破坏

除了各个节压缩,还需要构建新的导入表出来

外壳模仿加载器加DLL

找IAT,通过IAT调用外部函数时,call dword ptr或者jmp dword ptr

dump时,勾选重建输入表

ImportREC工具导入表

默认加载地址随机化

重定位表,dump出来PE文件加载基地址不一样

1、编译随机地址关掉

2、StudyPE 固定PE基址 (改PE文件可选头)

3、dump时重定向表也构建 ReloX 运行两次compare对比

__END__