简单判断找到OEP
- 发表于
- Crack
有很多刚入门的朋友都有个问题 在刚开始练习脱壳时 怎么判断到达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
原文连接:简单判断找到OEP
所有媒体,可在保留署名、
原文连接
的情况下转载,若非则不得使用我方内容。