1. 程式人生 > >獲取GetProcAddress函式地址

獲取GetProcAddress函式地址

我們都知道,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;
}