导入表(IT)与导入地址表(IAT)

kwy*_*tay 12 c portable-executable

我一直在尝试在加载和运行进程后解析/显示进程的导入地址表(IAT)中的信息.我理解程序中的API调用跳转到IAT中的相关点,然后跳转到加载的DLL中的实际函数.

通过读取PE头并跟随OptionalHeader.DataDirectory [1]指针到IMAGE_IMPORT_DESCRIPTORs数组,可以找到IAT是否正确.然后按照FirstThunk指针.而 OriginalFirstThunk指针在这里,会给你原始的导入表(IT)吗?

我也尝试在PE头中跟随OptionalHeader.DataDirectory [12]指针,但这甚至不太成功.

我一直在尝试使用来自另一个进程的ReadProcessMemory来解析notepad.exe(32位)的这个结构.

这是我正在做的粗略的C-psuedocode:

char buf[128];

// get first import descriptor
readMemory(&import, procImgBase + DataDirectory[1].VirtualAddress, sizeof(IMAGE_IMPORT_DESCRIPTOR));

// get dll name 
readMemory(buf, import.Name + procImgBase, 127);
printf("libname: %s\n", buf);

// get first function name
DWORD iltAddress = 0;
readMemory(&iltAddress, import.FirstThunk + procImgBase, 4);
readMemory(buf, iltAddress + procImgBase, 127);
printf("fname: %s\n", libName + 2); // <-- the +2 for the 2byte 'hint' of import lookup table entries
Run Code Online (Sandbox Code Playgroud)

如果,在第3行到最后一行,我用import.OriginalFirstThunk而不是FirstThunk替换它,它将按预期打印所有内容.我必须在概念上遗漏一些东西,所以我想知道是否有人能澄清这是什么,对我来说?

非常感谢!

Eri*_*ahm 6

看起来你正走向正确的方向.一些说明:

  • DataDirectory为您提供IMAGE_IMPORT_DESCRIPTOR数组的偏移量,该数组由全零的条目终止.导入的每个DLL都将有一个IMAGE_IMPORT_DESCRIPTOR
  • IMAGE_IMPORT_DESCRIPTOR具有2个IMAGE_THUNK_DATA数组的偏移量,一个维护对导入函数名称的偏移(OriginalFirstThunk),另一个现在具有函数的实际地址(FirstThunk)

由于您的可执行文件正在运行,因此IAT应包含函数的实际地址,而不是名称条目的RVA.

你可以这样做:

DWORD rva_to_name_of_function = 0;
DWORD address_of_function = 0;

// get the RVA of the IMAGE_IMPORT_BY_NAME entry
readMemory(&rva_to_name, import.OriginalFirstThunk + procImgBase, 4);

// copy the name of the import
readMemory(buf, rva_to_name + procImgBase + 2, 127);

// get the actual address that was filled in by the loader
readMemory(&address_of_function, import.FirstThunk + procImgBase, 4);

printf("fname: %s address: %X", buf, address_of_function); 
Run Code Online (Sandbox Code Playgroud)

请查看本文以获取一些有用的详细信息:http: //msdn.microsoft.com/en-us/magazine/cc301808.aspx