探索地球的奥秘

地质录井≠地质

脱壳简单判断到达OEP

脱壳简单判断到达OEP
http://hi.baidu.com/%CB%C9%D7%D0/blog/item/e98a804ae60a28f982025c88.html

2009-07-16 11:23

有很多刚入门的朋友都有个问题 在刚开始练习脱壳时 怎么判断到达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

posted on 2009-09-14 21:44  acheng99  阅读(2300)  评论(0编辑  收藏  举报

导航