逆向过程中通过会遇到脱壳的过程,而脱壳的方式有有多重,如果手工脱壳,需要找到OEP。
所谓“两次内存断点法寻找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 |
看到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