有很多刚入门的朋友都有个问题 在刚开始练习脱壳时 怎么判断到达OEP了?
不是只要一个大的跳转(JMP之类的)就可以到达OEP了?那是错的
看过天草的教程应该知道 这个所谓大的跳转不是真正意义上的“大”
而是跨区段的跳转 什么是跨区段的跳转?程序都是有区段的 这个大家都很清楚
至于区段的名字只是为了区别区段的作用 名字是什么这个不是很重要
举个简单的例子吧 我们脱个ASPACK的壳 压缩壳一个 基本入门的朋友都可以搞定
看看一个ASPACK的壳的区段 如下
地址 区段
00400000
00401000 .text
00405000 .data
00406000 .idata
00407000 .rsrc
0040C000 .reloc
0040D000 .adata
00411000 .udata
程序载入的代码是在0040D000这里 如果我们是用单步跟踪法(常用的)去调试这个壳
等走到以下一处代码之后 就会发现程序会跨段跳转了 那个0040D564的retn就是跨段跳转
0040D558 61 popad
0040D559 75 08 jnz short ASPACK.0040D563
0040D55B B8 01000000 mov eax,1
0040D560 C2 0C00 retn 0C
0040D563 50 push eax
0040D564 C3 retn
我们继续单步走到0040D564 然后程序代码会走到如下代码(即OEP)
004010CC 55 push ebp
004010CD 8BEC mov ebp,esp
004010CF 83EC 44 sub esp,44
004010D2 56 push esi
004010D3 FF15 E4634000 call dword ptr ds:[4063E4] ; kernel32.GetCommandLineA
004010D9 8BF0 mov esi,eax
代码从0040D000到00401000这就是所谓的跨段跳转 也是我们脱壳到达OEP的简单判断
----------------------------------------------------------------------------------
OEP 就是各种编程软件的入口特征,一般有 VC,BC,VB,DELPHI 较为常见
delphi:
55 PUSH EBP
8BEC MOV EBP,ESP
83C4 F0 ADD ESP,-10
B8 A86F4B00 MOV EAX,PE.004B6FA8
——————————————————————————
vc++
55 PUSH EBP
8BEC MOV EBP,ESP
83EC 44 SUB ESP,44
56 PUSH ESI
————————————————————————————
vb:
00401166 - FF25 6C104000 JMP DWORD PTR DS:[<&MSVBVM60.#100>] ; MSVBVM60.ThunRTMain
0040116C > 68 147C4000 PUSH PACKME.00407C14
00401171 E8 F0FFFFFF CALL <JMP.&MSVBVM60.#100>
00401176 0000 ADD BYTE PTR DS:[EAX],AL
00401178 0000 ADD BYTE PTR DS:[EAX],AL
0040117A 0000 ADD BYTE PTR DS:[EAX],AL
0040117C 3000 XOR BYTE PTR DS:[EAX],AL
————————————————————————————————
bc++
0040163C > $ /EB 10 JMP SHORT BCLOCK.0040164E
0040163E |66 DB 66 ; CHAR 'f'
0040163F |62 DB 62 ; CHAR 'b'
00401640 |3A DB 3A ; CHAR ':'
00401641 |43 DB 43 ; CHAR 'C'
00401642 |2B DB 2B ; CHAR '+'
00401643 |2B DB 2B ; CHAR '+'
00401644 |48 DB 48 ; CHAR 'H'
00401645 |4F DB 4F ; CHAR 'O'
00401646 |4F DB 4F ; CHAR 'O'
00401647 |4B DB 4B ; CHAR 'K'
00401648 |90 NOP
00401649 |E9 DB E9
0040164A . |98E04E00 DD OFFSET BCLOCK.___CPPdebugHook
0040164E > \A1 8BE04E00 MOV EAX,DWORD PTR DS:[4EE08B]
00401653 . C1E0 02 SHL EAX,2
00401656 . A3 8FE04E00 MOV DWORD PTR DS:[4EE08F],EAX
0040165B . 52 PUSH EDX
0040165C . 6A 00 PUSH 0 ; /pModule = NULL
0040165E . E8 DFBC0E00 CALL <JMP.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA