简单判断找到OEP
- 发表于
- Crack
有很多刚入门的朋友都有个问题 在刚开始练习脱壳时 怎么判断到达OEP了?
不是只要一个大的跳转(JMP之类的)就可以到达OEP了?那是错的
看过天草的教程应该知道 这个所谓大的跳转不是真正意义上的“大”
而是跨区段的跳转 什么是跨区段的跳转?程序都是有区段的 这个大家都很清楚
至于区段的名字只是为了区别区段的作用 名字是什么这个不是很重要
举个简单的例子吧 我们脱个ASPACK的壳 压缩壳一个 基本入门的朋友都可以搞定
看看一个ASPACK的壳的区段 如下
1 2 3 4 5 6 7 8 9 |
地址 区段 00400000 00401000 .text 00405000 .data 00406000 .idata 00407000 .rsrc 0040C000 .reloc 0040D000 .adata 00411000 .udata |
程序载入的代码是在0040D000这里 如果我们是用单步跟踪法(常用的)去调试这个壳
等走到以下一处代码之后 就会发现程序会跨段跳转了 那个0040D564的retn就是跨段跳转
1 2 3 4 5 6 |
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)
1 2 3 4 5 6 |
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:
1 2 3 4 |
55 PUSH EBP 8BEC MOV EBP,ESP 83C4 F0 ADD ESP,-10 B8 A86F4B00 MOV EAX,PE.004B6FA8 |
——————————————————————————
vc++
1 2 3 4 |
55 PUSH EBP 8BEC MOV EBP,ESP 83EC 44 SUB ESP,44 56 PUSH ESI |
————————————————————————————
vb:
1 2 3 4 5 6 7 |
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++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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
所有媒体,可在保留署名、
原文连接
的情况下转载,若非则不得使用我方内容。