两次内存断点法寻找OEP
2015-05-17 19:02
239 查看
逆向过程中通过会遇到脱壳的过程,而脱壳的方式有有多重,如果手工脱壳,需要找到OEP。
所谓“两次内存断点法寻找OEP”,按照《加密与解密*第三版》上的解释来说,就是这样的。
一般的外壳会依次对.text、.rdata、.data、.rsrc区块进行解压(解密)处理,所以,可以先在.rdata、.data等区块下内存访问断点,中断后,此时代码已解压,接着再对代码段(.text)下内存访问断点,即可到达OEP。
我个人的理解是所有节区都解压完毕之后,然后程序的执行流会转移到OEP,这个时候自然回去访问相应的代码,所以就会断下;实际操作的时候还需要多一个跟踪步骤。
这里以一个UPX加壳的程序为例:
首先OD加载程序,Alt + M打开内存映射视图,找到主模块的数据段或者资源段F2下访问中断,如图。
然后F9运行程序,会自动断下,再次Alt + M打开内存映射视图,找到代码段F2下访问中断,如图。
之后F9运行,会再次断下。这个时候仍然Alt + M打开内存映射视图,观察一下主模块的区块。
看到UPX0和UPX1到底哪一个是真实的代码块呢?需要试一下。对于UPX0,VA的范围是00401000~00409000,对于UPX1,VA的范围是00409000~0040C000。可以在OD的命令行中执行tc eip<00409000,按Enter执行,发现来到了OEP了。(同样可以测试tc eip<0040C000,但得到的不是OEP)。
附:
TC (Trace in till condition)跟踪进入直到条件
更多参考:http://www.pediy.com/bbshtml/BBS5/pediy50401.htm
所谓“两次内存断点法寻找OEP”,按照《加密与解密*第三版》上的解释来说,就是这样的。
一般的外壳会依次对.text、.rdata、.data、.rsrc区块进行解压(解密)处理,所以,可以先在.rdata、.data等区块下内存访问断点,中断后,此时代码已解压,接着再对代码段(.text)下内存访问断点,即可到达OEP。
我个人的理解是所有节区都解压完毕之后,然后程序的执行流会转移到OEP,这个时候自然回去访问相应的代码,所以就会断下;实际操作的时候还需要多一个跟踪步骤。
这里以一个UPX加壳的程序为例:
首先OD加载程序,Alt + M打开内存映射视图,找到主模块的数据段或者资源段F2下访问中断,如图。
然后F9运行程序,会自动断下,再次Alt + M打开内存映射视图,找到代码段F2下访问中断,如图。
之后F9运行,会再次断下。这个时候仍然Alt + M打开内存映射视图,观察一下主模块的区块。
1 2 3 4 5 6 7 8 9 10 11 | 0040BA75 8D8430 58B00000 LEA EAX,DWORD PTR DS:[EAX+ESI+B058] 0040BA7C 01F3 ADD EBX,ESI 0040BA7E 50 PUSH EAX 0040BA7F 83C7 08 ADD EDI,8 0040BA82 FF96 94B00000 CALL DWORD PTR DS:[ESI+B094] ; KERNEL32.LoadLibraryA 0040BA88 95 XCHG EAX,EBP 0040BA89 8A07 MOV AL,BYTE PTR DS:[EDI] 0040BA8B 47 INC EDI 0040BA8C 08C0 OR AL,AL 0040BA8E ^ 74 DC JE SHORT 0040BA6C 0040BA90 89F9 MOV ECX,EDI |
Memory map, 项目 18 地址=00401000 大小=00008000 (32768.) 属主=UpxDemo 00400000 区段=UPX0 类型=映像 01001002 访问=R 初始访问=RWE |
Memory map, 项目 19 地址=00409000 大小=00003000 (12288.) 属主=UpxDemo 00400000 区段=UPX1 包含=SFX,代码 类型=映像 01001002 访问=R 初始访问=RWE |
1 2 3 4 5 6 7 8 9 10 1112 | 00401120 55 PUSH EBP 00401121 8BEC MOV EBP,ESP 00401123 6A FF PUSH -1 00401125 68 B8504000 PUSH 004050B8 0040112A 68 EC1D4000 PUSH 00401DEC 0040112F 64:A1 00000000 MOV EAX,DWORD PTR FS:[0] 00401135 50 PUSH EAX 00401136 64:8925 0000000>MOV DWORD PTR FS:[0],ESP 0040113D 83EC 58 SUB ESP,58 00401140 53 PUSH EBX 00401141 56 PUSH ESI 00401142 57 PUSH EDI 00401143 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP 00401146 FF15 28504000 CALL DWORD PTR DS:[405028] ; KERNEL32.GetVersion 0040114C 33D2 XOR EDX,EDX 0040114E 8AD4 MOV DL,AH 00401150 8915 14854000 MOV DWORD PTR DS:[408514],EDX 00401156 8BC8 MOV ECX,EAX 00401158 81E1 FF000000 AND ECX,0FF 0040115E 890D 10854000 MOV DWORD PTR DS:[408510],ECX 00401164 C1E1 08 SHL ECX,8 |
TC (Trace in till condition)跟踪进入直到条件
更多参考:http://www.pediy.com/bbshtml/BBS5/pediy50401.htm
相关文章推荐
- 两次内存断点法寻找OEP脱UPX壳
- 两次内存断点法寻找OEP
- 菜鸟脱壳之脱壳的基础知识(五)——利用内存断点寻找OEP
- 脱壳_两次断点法找oep
- 用内存断点找OEP 问题 脱壳时提示无法读取被调试进程的内存 bad dos signature
- GDB 内存断点
- vs2008 无法设置断点&设置内存断点的方法
- [转]对抗OD内存断点
- 使用WinDbg+SOS及WinDbg Script寻找内存中DataTable第M行N列的值
- OD笔记2 内存断点与硬件断点
- GDB 内存断点
- OD硬件断点,OD内存断点,API断点命令
- 【原创】OllyDBG 入门系列(四)-内存断点
- OllyDBG 入门系列<4> 内存断点
- 在VB程序寻找下断点地址的有效方法
- 寻找真正的入口(OEP)--广义ESP定律
- 【转载】寻找真正的入口(OEP)--广义ESP定律
- VC++6.0调试篇:内存断点(转帖)
- VS2005 内存泄露的快速寻找方法
- VS2008设置内存断点