WindowsAPI解析IAT位址

2021-09-13 02:48:06 字數 1760 閱讀 9652

#include #include int main(int argc,char* ar**);

dword timedatestamp;

dword forwarderchain;

dword name; // dll名稱的rva偏移

dword firstthunk; // iat真實位址的rva偏移

}image_import_descriptor;

*//*

typedef struct _image_thunk_data32u1;

}image_thunk_data32;

*//*

typedef struct _image_import_by_nameimage_import_by_name, *pimage_import_by_name;

*/hmodule hmod;

pimage_dos_header pdos;

pimage_nt_headers pnt;

pimage_optional_header popt;

pimage_import_descriptor piid;

pimage_thunk_data pfuncname_addr,pfunc_addr;

hmod = getmodulehandle(null); // hmodule型別不能直接參與運算,要強制轉換為位元組流

pdos = (pimage_dos_header)hmod;

pnt = (pimage_nt_headers)((byte *)hmod + pdos->e_lfanew); // nt_offset = dos.e_lfanew

popt = (pimage_optional_header)(&(pnt->optionalheader));

piid = (pimage_import_descriptor)((byte *)hmod+popt->datadirectory[1].virtualaddress); // base_addr + rva_addr

while(piid->firstthunk)

printf("\n");

piid++; // 每個dll對應乙個iid項

}getchar();

return 0;

}

簡單解釋通過獲取本程序的模組控制代碼,從而定位到檔案載入的記憶體區域!再用 dos 頭的 e_lfanew 偏移到 nt 頭,用 nt 頭找到 optional 頭。其中 optional 的 datadirectory 的第乙個索引項就對應第乙個 iid 項,再通過 iid 定位到 originalfirstthunk 和 firstthunk,迴圈獲取每乙個函式的名稱與記憶體位址!再外層迴圈每乙個 dll!最終列印出所有 dll 的 iat 函式名稱與記憶體位址!

執行結果

注意

originalfirstthunk指向的 u1.addressofdata 是 hint/name 所在的結構體

firstthunk指向的 u1.addressofdata 此時已經填入函式在記憶體的真實位址

Windows API程式設計

了解 windows作業系統應用程式開發的基本概念,win32 api函式 訊息與事件驅動 掌握winmain函式的基本框架,視窗定義 視窗建立 訊息迴圈及視窗過程函式 1.定義 winmain 函式 2.設計視窗類 wndclass 3.註冊視窗類 4.建立視窗 5.顯示並更新視窗 6.編寫訊息迴...

Windows API函式大全

1.api之網路函式 wnetaddconnection 建立同乙個網路資源的永久性連線 wnetaddconnection2 建立同乙個網路資源的連線 wnetaddconnection3 建立同乙個網路資源的連線 wnetcancelconnection 結束乙個網路連線 wnetcancelc...

Windows API程式設計入門

windows api實驗報告目錄 了解windows作業系統應用程式開發的基本概念,win32 api函式 訊息與事件驅動 2.掌握winmain函式的基本框架,視窗定義 視窗建立 訊息迴圈及視窗過程函式 windows 10作業系統 編譯環境vc 6.0 一 windows應用程式 作業系統與計...