昨天写的是磁盘的IAT.现在是内存的IAT.接着进行比较就可以得到IAT HOOK了
用OpenProcess和ReadProcessMemory读取你想读的进程..然后按照PE文件格式来解释读到的数据,lpBase就是读到数据缓冲区的地址
dosHeader=(IMAGE_DOS_HEADER*)lpBase;
if (dosHeader->e_magic!=IMAGE_DOS_SIGNATURE)
{
printf("This is not a windows file/n");
return;
}
ntHeader=(IMAGE_NT_HEADERS*)((BYTE*)lpBase+dosHeader->e_lfanew);
if(ntHeader->Signature!=IMAGE_NT_SIGNATURE)
{
printf("This is not a win32 file/n");
return;
}
IMAGE_IMPORT_DESCRIPTOR * pImportDesc=(IMAGE_IMPORT_DESCRIPTOR*)((BYTE*)lpBase+ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
while (pImportDesc->FirstThunk)
{
IMAGE_THUNK_DATA* thunk = (IMAGE_THUNK_DATA*)( (BYTE*)lpBase + pImportDesc->OriginalFirstThunk);
IMAGE_THUNK_DATA* pThunk= (PIMAGE_THUNK_DATA32)((PBYTE)lpBase+pImportDesc->FirstThunk) ;
while(thunk->u1.Function)
{
isOrdinal = 0;
if(thunk->u1.Function >= 0x01000000) isOrdinal = TRUE;
if(!isOrdinal) // 以名字到处而不是序号
{
char* functionName = (char*)( (BYTE*)lpBase + (DWORD)thunk->u1.AddressOfData + 2 );
printf("%x %s/n",pThunk->u1.Function,functionName);
}
if(isOrdinal)
{
}
pThunk++;
thunk++;
}
pImportDesc++;