gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:44:40 25 4
gpt4 key购买 nike

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

通过读取 PE header 并跟随 OptionalHeader.DataDirectory[1] 指向 IMAGE_IMPORT_DESCRIPTOR 数组的指针可以找到 IAT 是否正确。然后跟随 FirstThunk 指针。而此处的 OriginalFirstThunk 指针将为您提供原始导入表 (IT)?

我也尝试过在 PE header 中跟踪 OptionalHeader.DataDirectory[12] 指针,但这更不成功。

我一直在通过使用来自另一个进程的 ReadProcessMemory 尝试解析 notepad.exe(32 位)的结构来对此进行测试。

这是我正在做的粗略的 C 伪代码:

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

如果在倒数第三行,我将其替换为 import.OriginalFirstThunk 而不是 FirstThunk,它将按预期打印所有内容。我一定在概念上遗漏了一些东西,所以我想知道是否有人可以为我澄清这是什么?

非常感谢!

最佳答案

看起来您的方向是正确的。一些注意事项:

  • 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);

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

关于c - 导入表 (IT) 与导入地址表 (IAT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5631317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com