在兩種情景下獲得指定程序基位址的方法

2021-10-07 21:36:49 字數 2775 閱讀 7859

最近在寫乙個簡單偵錯程式的時候,需要在createprocess()建立除錯程序後獲得程式的基位址。

一開始我是在createprocess()前,利用記憶體對映檔案來載入指定可執行檔案,然後從檔案的nt檔案頭中讀取程式的載入基位址。但是我忽略了有可能程式發生基址隨機化,這樣的話就獲得的基位址就不準確了。

可以在createprocess()建立程序前利用記憶體對映檔案讀nt檔案頭中的入口位址的rva(入口位址隨基位址變化,但是入口位址的rva是不變的)。然後在createprocess()建立除錯程序後,獲取除錯程序的程序環境塊(context),context . eax即為其程式的入口位址。然後減去入口位址的rva即為真正的基位址。

handle	hfile;

//檔案控制代碼

handle hmapfile;

//記憶體對映檔案物件控制代碼

lpvoid lpmapfile;

//記憶體對映檔案指標

hfile =

createfile

(exename, generic_read | generic_write, file_share_read,

0, open_existing, file_attribute_normal,0)

; hmapfile =

(hfile,

null

, page_readwrite,0,

0,null);

lpmapfile =

mapviewoffile

(hmapfile, file_map_read,0,

0,0)

; image_dos_header* lpdosmz =

(image_dos_header*

)lpmapfile;

image_nt_headers* lpnt =

(image_nt_headers*

)lpmapfile;

lpnt =

(image_nt_headers*)(

(byte*

)lpnt + lpdosmz-

>e_lfanew);

dwentrypointrva = lpnt-

>optionalheader.addressofentrypoint;

//獲得入口位址的rva

unmapviewoffile

(lpmapfile)

;//撤銷對映

closehandle

(hmapfile)

;//關閉記憶體對映物件控制代碼

closehandle

(hfile)

;//關閉檔案

//建立被除錯程式程序

createprocess

( exename,

null

,null

,null

, false,

// 不可繼承

debug_only_this_process | debug_process,

// 除錯模式啟動 (debug_only_this_process標誌表示其不能除錯程序如果被除錯的話,此新程序不會成為其除錯程序的除錯物件)

null

,null

,&si,

&pi)

;//獲取入口位址

stcontext.contextflags = context_all;

getthreadcontext

(pi.hthread,

&stcontext)

; dwentrypoint = stcontext.eax;

//獲取基位址

hinstance = dwentrypoint - dwentrypointrva;

可以先建立乙個程序快照,獲得指定程序的pid之後。在建立乙個基於這個程序的模組快照,然後獲得此程序第乙個模組的基位址,此基位址即為這個程序的基位址。然後在通過基位址呼叫readprocessmemory()讀取nt頭獲得入口位址rva,在與基位址相加即為此程序的入口位址。

//dwdata是指定程序的pid,通過建立程序快照獲得

//程序模組快照,(獲得已執行程序基位址)

hmodulesnap =

createtoolhelp32snapshot

(th32cs_snapmodule, dwdata)

;module32first

(hmodulesnap,

&me32)

; dwinstance =

(dword)me32.modbaseaddr;

//程序基位址

closehandle

(hmodulesnap)

;//獲取入口位址rva

dword lpnt;

//指向nt頭

readprocessmemory

(hisdebuggedprocess,

(lpvoid)

(dwinstance +

0x3c),

&lpnt,4,

null);

lpnt = lpnt + dwinstance;

readprocessmemory

(hisdebuggedprocess,

(lpvoid)

(lpnt +

0x28),

&dwentrypointrva,4,

null);

//獲取入口位址

dwentrypoint = dwinstance + dwentrypointrva;

hover在兩種情況下的兩種用法

hover在滑鼠移到鏈結上時新增的特殊樣式。注意 為了產生預期的效果,在 css 定義中,hover 必須位於 link 和 visited 之後!前兩天遇到乙個關於 hover的問題,困惑了好久 這裡我們舉個例子看一下 hover在兩種情況下的兩種用法 先說一下,下面的 想實現的效果 當滑鼠放在 ...

PHP5在Apache下的兩種模式的安裝

php 5.0.0 和 php 4.0.38 於2004年7月13日同時發布,這是乙個值得我們 php愛好者的一大喜訊。期盼已久的 php5終於出來了,我們可以更進一步的享受 php新的功能和使用開發的樂趣。我也在第一時間用上了php5,下面簡要介紹一下我的安裝過程 只講述apache伺服器下的安裝...

PHP5在Apache下的兩種模式的安裝

php 5.0.0 和php 4.0.38 於2004年7月13日同時發布,這是乙個值得我們php愛好者的一大喜訊。期盼已久的php5終於出來了,我們可以更進一步的享受php新的功能和使用開發的樂趣。我也在第一時間用上了php5,下面簡要介紹一下我的安裝過程 只講述apache伺服器下的安裝 與喜愛...