C++获取当前进程IAT的方法
本文实例讲述了C++获取当前进程IAT的方法,分享给大家供大家参考。
具体实现方法如下:
#include<windows.h> #include<stdio.h>
intmain(intargc,char*argv[]) { HMODULEhModule=::GetModuleHandleA(NULL); IMAGE_DOS_HEADER*pDosHeader=(IMAGE_DOS_HEADER*)hModule; IMAGE_OPTIONAL_HEADER*pOpNtHeader=(IMAGE_OPTIONAL_HEADER*)((BYTE*)hModule+pDosHeader->e_lfanew+24);//这里加24 IMAGE_IMPORT_DESCRIPTOR*pImportDesc=(IMAGE_IMPORT_DESCRIPTOR*)((BYTE*)hModule+pOpNtHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
while(pImportDesc->FirstThunk) { char*pszDllName=(char*)((BYTE*)hModule+pImportDesc->Name); printf("模块名称:%s\n",pszDllName);
DWORDn=0; //一个IMAGE_THUNK_DATA就是一个导入函数 IMAGE_THUNK_DATA*pThunk=(IMAGE_THUNK_DATA*)((BYTE*)hModule+pImportDesc->OriginalFirstThunk); while(pThunk->u1.Function) { //取得函数名称 char*pszFuncName=(char*)((BYTE*)hModule+pThunk->u1.AddressOfData+2);//函数名前面有两个.. printf("functionname:%-25s, ",pszFuncName); //取得函数地址 PDWORDlpAddr=(DWORD*)((BYTE*)hModule+pImportDesc->FirstThunk)+n;//从第一个函数的地址,以后每次+4字节 printf("addrss:%X\n",lpAddr); n++;//每次增加一个DWORD pThunk++; } printf("\n"); pImportDesc++; } return0; }