獲取GetProcAddress函式地址
阿新 • • 發佈:2018-12-18
我們都知道,GetProcAddress函式就是從系統檔案kernel32.dll中匯出的,而kernel32.dll是系統的基礎連結庫,每一個程式都會載入kernel32.dll的,我們只要得到kernel32.dll的基址就可以找到GetProcAddress函式的地址了。而獲取kernel32.dll的載入基址的方法有3種,第一種就是通過特徵匹配的暴力搜尋,第二種就是利用系統的SEH機制找到kernel32.dll並搜尋出載入基址,第三種就是通過執行緒環境塊TEB的資訊逐步找到kernel32.dll的載入地址。
這裡介紹第三種辦法:
1.通過段選擇字FS在記憶體中得到當前執行緒環境塊TEB的地址。
2.TEB偏移為0x30處是指向程序環境塊PEB的指標。
3.PEB偏移為0x0c處是指向PEB_LDR_DATA結構的指標。
4.PEB_LDR_DATA偏移為0x1c處是模組初始化連結串列的頭指標InInitializationOrderModuleList。
5.InInitializationOrderModuleList中按順序存放著這個程序初始化模組的資訊,第一個節點是ntdll.dll基址,第二個就是kernel32.dll基址。
DWORD GetKernel32Base() { DWORD dwKernel32Base=0; _asm { push eax mov eax,dword ptr fs:[0x30] mov eax,[eax+0x0c] mov eax,[eax+0x1c] mov eax,[eax] mov eax,[eax+0x08] mov dwKernel32Base,eax pop eax } return dwKernel32Base; }