常見程序入口點特徵

Delphi入口程序

在這裏插入圖片描述
Delphi開頭的入口程序是正常的壓棧,然後調用一個E8字節類型的call
0044CA98 > $ 55 push ebp
0044CA99 . 8BEC mov ebp,esp
0044CA9B . 83C4 F0 add esp,-0x10
0044CA9E . B8 B8C84400 mov eax,delphi7?0044C8B8 ; UNICODE “;”
0044CAA3 . E8 2091FBFF call delphi7?00405BC8

E8字節Call中的內容調用了一個GetModuleHandleA()函數
00405BC8 /$ 53 push ebx
00405BC9 |. 8BD8 mov ebx,eax ; delphi7?0044C8B8
00405BCB |. 33C0 xor eax,eax ; delphi7?0044C8B8
00405BCD |. A3 9CD04400 mov dword ptr ds:[0x44D09C],eax ; delphi7?0044C8B8
00405BD2 |. 6A 00 push 0x0 ; /pModule = NULL
00405BD4 |. E8 2BFFFFFF call <jmp.&kernel32.GetModuleHandleA> ; \GetModuleHandleA

進入這個系統dll調用,發現一個跳轉jmp的字節碼對應是 FF25
00405B04 $- FF25 E4014500 jmp dword ptr ds:[<&kernel32.GetModuleHa>; kernel32.GetModuleHandleA

我們可以識別這些機器碼和調用的函數來判斷是否進入了程序的入口點。

BC++入口程序

在這裏插入圖片描述
入口點是一個jmp,jmp中間是語段字符fb:C++HOOK,之後的第一個調用是GetModuleHandleA()函數

0040135C > $ /EB 10 jmp short BC2002例.0040136E
0040135E |66 db 66 ; CHAR ‘f’
0040135F |62 db 62 ; CHAR ‘b’
00401360 |3A db 3A ; CHAR ‘:’
00401361 |43 db 43 ; CHAR ‘C’
00401362 |2B db 2B ; CHAR ‘+’
00401363 |2B db 2B ; CHAR ‘+’
00401364 |48 db 48 ; CHAR ‘H’
00401365 |4F db 4F ; CHAR ‘O’
00401366 |4F db 4F ; CHAR ‘O’
00401367 |4B db 4B ; CHAR ‘K’
00401368 |90 nop
00401369 |E9 db E9
0040136A . |98904700 dd BC2002例.___CPPdebugHook
0040136E > \A1 8B904700 mov eax,dword ptr ds:[0x47908B]
00401373 . C1E0 02 shl eax,0x2
00401376 . A3 8F904700 mov dword ptr ds:[0x47908F],eax
0040137B . 52 push edx ; ntdll.KiFastSystemCallRet
0040137C . 6A 00 push 0x0 ; /pModule = NULL
0040137E . E8 83640700 call <jmp.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA

GetModuleHandleA這個系統API也是FF25的間接跳轉實現
00477806 $- FF25 E0824800 jmp dword ptr ds:[<&KERNEL32.GetModuleHa>; kernel32.GetModuleHandleA

VC入口特徵

在這裏插入圖片描述
004183D7 >/$ 55 push ebp
004183D8 |. 8BEC mov ebp,esp
004183DA |. 6A FF push -0x1
004183DC |. 68 18CB4100 push VC.0041CB18
004183E1 |. 68 2C9D4100 push VC.00419D2C ; SE 處理程序安裝
004183E6 |. 64:A1 0000000>mov eax,dword ptr fs:[0]
004183EC |. 50 push eax
004183ED |. 64:8925 00000>mov dword ptr fs:[0],esp
004183F4 |. 83EC 58 sub esp,0x58
004183F7 |. 53 push ebx
004183F8 |. 56 push esi
004183F9 |. 57 push edi
004183FA |. 8965 E8 mov [local.6],esp
004183FD |. FF15 74B14100 call dword ptr ds:[<&KERNEL32.GetVersion>; kernel32.GetVersion

發現VC的Call用的是FF15,而且VC入口點特徵第一個調用函數是GetVersion()

VB程序入口特徵

在這裏插入圖片描述
一進入VB程序,發現入口點定位在0x004014B0位置,該位置push了入口地址,上面還有個關於ThunRTMain的跳轉,下面是ThunRTMain()函數調用,使用E8來進行函數調用。
入口點的push就是push了一段字符串的地址

004014AA $- FF25 F0104000 jmp dword ptr ds:[<&MSVBVM60.#ThunRTMain>; msvbvm60.ThunRTMain
004014B0 > $ 68 28264000 push vb例子.00402628
004014B5 . E8 F0FFFFFF call <jmp.&MSVBVM60.#ThunRTMain_100>

我們立即數跟隨,發現push的是一段字符串,是一個dll的名字,我們可以通過搜索push該段字符串的地址的指令找到入口點,00402628 56 42 35 21 F0 1F 76 62 36 63 68 73 2E 64 6C 6C VB5!?vb6chs.dll
查找內容vb5!

在這裏插入圖片描述

alt+m打開內存窗口,然後ctrl+b輸入vb5!。定位到0x402628
在這裏插入圖片描述
刪除分析
在這裏插入圖片描述
可以直接搜索push指令的機器碼:68 28 26 40 00,注意68push的是個立即數,不用進行偏移差計算。
在這裏插入圖片描述
將數據搜索到的地址進行反彙編查看
在這裏插入圖片描述
發現正好是我們要找的入口點
在這裏插入圖片描述
我們可以定位入口點上下調用的函數來定位入口點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章