從windows visita開始以後,windows已經開始支援隨機基址的關係,也就是說以前我們的程序基址都是從0x40000開始的,如果乙個變數在我們第一次執行的時候位址為0x50000,那麼以後也都會在這個位置
而vs2008後開始提供隨機基址的功能,在windows visita後的版本也都支援這個功能,這樣程序的基址將不會再固定從乙個地方開始,變數的位址也會隨著基址的不同而不同,加大了我們對乙個程序修改的難度,我們每次修改乙個變數不能再將變數寫死,而是要根據基址+資料偏移量來算出資料的位址,那麼,我們怎麼去獲得乙個程序的基址呢??
在我們程式執行的時候,我們程序自己的hinstance或者hmodule就是我們這個程序的基址,當然,dll的hmodule或者hinstance則是該dll的基址,這樣我們大概就知道怎麼獲取程序的基址了
1.getmodulehandle
通過getmodulehandle,我們可以獲取乙個程序的基址,我們可以直接傳入乙個null就可以直接拿到該程序的基址,但是這種方法我們只能拿到自己程序的基址,所以不是很方便
當然我還有乙個想法就是可以把獲取程序基址的**注入到另外乙個程序,然後通過其他方法傳送出來,除了socket,檔案,管道等正常通訊外,我們還可以利用virtualallocex,在對方記憶體開闢一塊位址後,我們把**複製進去(如同上一章的**注入),記得,我們申請記憶體的大小除了需要放置**,還需要放置我們計算完以後的結果,我們計算完了後把結果放在這塊記憶體,就可以通過另外乙個程序去取了
比如我們a程序向b程序申請了100位元組的記憶體區域c,並且複製了50位元組的**到c,我們這50位元組的**執行了後,可以獲取b程序的基位址,並且取得基位址後,他會把這個值放到區域c位址偏移為80的位置,這樣我們a程序就可以通過讀取區域c再往後面偏移80個,這個值就是程序的基址
這個方法也適用於注入**與原程序的通訊,簡單的來講就是通過在對方記憶體開闢一塊專門放置計算結果的記憶體,然後再由另外乙個程序去取資料,有點類似於記憶體對映,後面將會有專門的一節講這個
2. 給我們的程序拍載入模組的快照
windows有專門的tlhelp32這個庫,就是給我們的電腦拍快照用的,比如dll快照,比如電腦程序表的快照,createtoolhelp32snapshot(th32cs_snapmodule,processid),這樣的話,第乙個dll將會是我們要查詢的dll
3.利用enumprocessmodules
psapi庫裡面也有提供一些程序狀態的api,其中enumprocessmodules的庫就可以列舉對應程序載入的所有模組,列舉的第乙個就是我們要檢視程序對應的位址
後面的兩個方法都會比較簡單,所以簡單講解一下,以上**都在
裡面的modulebaseaddr我們這一章的**,**在win7 64位下也均可以通過編譯和執行正確,本人水平所限,有不足之處希望大家指教
Linux基礎命令 查詢程序id
pidof pidof 可以查詢指定名稱的程序的pid,將結果送到標準輸出。pidof有兩種返回值 0,找到至少乙個程序 1,沒有找到程序。pidof實際上與killall5相同 程式根據呼叫它的名稱進行操作。此命令的適用範圍 redhat rhel ubuntu centos suse opens...
Linux基礎命令 查詢程序pidof
pidof pidof可以查詢指定名稱的程序的pid,將結果送到標準輸出。pidof有兩種返回值 0,找到至少乙個程序 1,沒有找到程序。pidof實際上與killall5相同 程式根據呼叫它的名稱進行操作。此命令的適用範圍 redhat rhel ubuntu centos suse opensu...
Linux基礎命令 查詢程序id
pidof pidof可以查詢指定名稱的程序的pid,將結果送到標準輸出。pidof有兩種返回值 0,找到至少乙個程序 1,沒有找到程序。pidof實際上與killall5相同 程式根據呼叫它的名稱進行操作。此命令的適用範圍 redhat rhel ubuntu centos suse opensu...