首页 > 逆向调试 > 两次内存断点法寻找OEP

两次内存断点法寻找OEP

逆向过程中通过会遇到脱壳的过程,而脱壳的方式有有多重,如果手工脱壳,需要找到OEP。
所谓“两次内存断点法寻找OEP”,按照《加密与解密*第三版》上的解释来说,就是这样的。
一般的外壳会依次对.text、.rdata、.data、.rsrc区块进行解压(解密)处理,所以,可以先在.rdata、.data等区块下内存访问断点,中断后,此时代码已解压,接着再对代码段(.text)下内存访问断点,即可到达OEP。

我个人的理解是所有节区都解压完毕之后,然后程序的执行流会转移到OEP,这个时候自然回去访问相应的代码,所以就会断下;实际操作的时候还需要多一个跟踪步骤。

这里以一个UPX加壳的程序为例:
首先OD加载程序,Alt + M打开内存映射视图,找到主模块的数据段或者资源段F2下访问中断,如图。
对数据段或者资源段下F2访问中断

然后F9运行程序,会自动断下,再次Alt + M打开内存映射视图,找到代码段F2下访问中断,如图。
对代码段下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

看到UPX0和UPX1到底哪一个是真实的代码块呢?需要试一下。对于UPX0,VA的范围是00401000~00409000,对于UPX1,VA的范围是00409000~0040C000。可以在OD的命令行中执行tc eip<00409000,按Enter执行,发现来到了OEP了。(同样可以测试tc eip<0040C000,但得到的不是OEP)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



分类: 逆向调试 标签: , , , ,
  1. 本文目前尚无任何评论.