最近在寫乙個簡單偵錯程式的時候,需要在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伺服器下的安裝 與喜愛...