打印绑定导入表
//打印 绑定导入表
BOOL PrintBoundImport(__in char* m_fileName)
{
char* Filebuffer = NULL;
if (!GetFileBuffer(m_fileName, &Filebuffer)) return FALSE;
PIMAGE_DOS_HEADER LPdosHeader = NULL;
PIMAGE_NT_HEADERS LPntHeader = NULL;
LPdosHeader = (PIMAGE_DOS_HEADER)Filebuffer;
LPntHeader = (PIMAGE_NT_HEADERS)((CHAR*)LPdosHeader + LPdosHeader->e_lfanew);
//如果是32位程序
if (LPntHeader->OptionalHeader.Magic == 0x10b)
{
PIMAGE_NT_HEADERS32 LPntHeader32 = LPntHeader;
LPntHeader = NULL;
PIMAGE_DATA_DIRECTORY LPdirBoundImport = &LPntHeader32->OptionalHeader.DataDirectory[11];
PIMAGE_BOUND_IMPORT_DESCRIPTOR LPBoundImport = (CHAR*)LPdosHeader + RVAToFOA(LPdosHeader, LPdirBoundImport->VirtualAddress);
CHAR* NameBase = LPBoundImport;
while (LPBoundImport->TimeDateStamp != 0 && LPBoundImport->OffsetModuleName != 0)
{
printf("时间戳:0x%x dll名字偏移:0x%x ForwarderRefs结构数量: %d dll名字 %s\n",
LPBoundImport->TimeDateStamp, LPBoundImport->OffsetModuleName, LPBoundImport->NumberOfModuleForwarderRefs,(NameBase+ LPBoundImport->OffsetModuleName));
LPBoundImport++;
}
return TRUE;
}
else
{
PIMAGE_NT_HEADERS64 LPntHeader64 = LPntHeader;
LPntHeader = NULL;
PIMAGE_DATA_DIRECTORY LPdirBoundImport = &LPntHeader64->OptionalHeader.DataDirectory[11];
PIMAGE_BOUND_IMPORT_DESCRIPTOR LPBoundImport = (CHAR*)LPdosHeader + RVAToFOA(LPdosHeader, LPdirBoundImport->VirtualAddress);
CHAR* NameBase = LPBoundImport;
while (LPBoundImport->TimeDateStamp != 0 && LPBoundImport->OffsetModuleName != 0)
{
printf("时间戳:0x%x dll名字偏移:0x%x ForwarderRefs结构数量: %d dll名字 %s\n",
LPBoundImport->TimeDateStamp, LPBoundImport->OffsetModuleName, LPBoundImport->NumberOfModuleForwarderRefs, (NameBase + LPBoundImport->OffsetModuleName));
LPBoundImport++;
}
return TRUE;
}
}
IAT 表中的数据,在文件中可能已经不和INT表一样了,已经保存了需要导入的函数的VA(内存地址或者说绝对地址). 如果IMAGE_IMPORT_DESCRIPTOR结构(导入表的结构)中的TimeDateStamp==0 ,表示 没有绑定 ,如果为-1,说明已经绑定,这时 IAT表的数据已经是导入函数的VA了
IAT 中的 IMAGE_THUNK_DATA 结构将被导入函数的实际地址覆盖。磁盘上的可执行文件具有其 IAT 中其他 DLL 中 API 的实际内存地址。加载绑定的可执行文件时,Windows 加载程序可以绕过查找每个导入的 API 并将其写入 IAT 的步骤。正确的地址已经在那里了!但是,这只有在DLL正确对齐时才会发生
Inside Windows:深入了解 Win32 可移植可执行文件格式,第 2 部分 |Microsoft 学习