WINDOWS黑客基礎(4):查找進程運行的基址


從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的庫就可以枚舉對應進程加載的所有模塊,枚舉的第一個就是我們要查看進程對應的地址

后面的兩個方法都會比較簡單,所以簡單講解一下,以上代碼都在

https://github.com/linyilong3/hacker-tutorial

里面的ModuleBaseAddr我們這一章的代碼,代碼在WIN7 64位下也均可以通過編譯和運行正確,本人水平所限,有不足之處希望大家指教


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM