IAT HOOK的检测

IAT HOOK的检测
在EXE加载前,IAT表中的结构和INT表中的结构内容一致,如果所示,OriginalFirstThunk指向INT中第一个IMAGE_THUNK_DATA,FirstThunk指向IAT中的第一个IMAGE_THUNK_DATA
IMAGE_THUNK_DATA中放着指向IMAGE_IMPORT_BY_NAME的指针

 

在程序装载完成之后,IAT中的数据进行了修改,内容改为相应的API函数地址,如图

进行检测时只需要读取IAT表中的数据,便可得到目标进程所调用的API地址

原始的地址,LoadLibrary GetProcAddress 经过换算可以得到

 

 

贴上相关的结构体

typedef struct _IMAGE_IMPORT_DESCRIPTOR {
union {
DWORD   Characteristics;            // 0 for terminating null import descriptor
DWORD   OriginalFirstThunk;         // RVA to original unbound IAT (PIMAGE_THUNK_DATA)
};
DWORD   TimeDateStamp;                  // 0 if not bound,
// -1 if bound, and real date\time stamp
//     in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
// O.W. date/time stamp of DLL bound to (Old BIND)

DWORD   ForwarderChain;                 // -1 if no forwarders
DWORD   Name;
DWORD   FirstThunk;                     // RVA to IAT (if bound this IAT has actual addresses)
} IMAGE_IMPORT_DESCRIPTOR;


typedef struct _IMAGE_THUNK_DATA32 {
union {
PBYTE  ForwarderString;
PDWORD Function;
DWORD Ordinal;
PIMAGE_IMPORT_BY_NAME  AddressOfData;
} u1;
} IMAGE_THUNK_DATA32;