c++ - DLL 的导入目录不适用于 64 位 dll

标签 c++ dll dependencies portable-executable

我正在尝试打印需要为给定 dll 加载的位数和 dll。

我的代码看起来像这样(简化版;没有错误检查):

fh = CreateFile("my_dll_file.dll", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
fm = CreateFileMapping(fh, NULL, PAGE_READONLY, 0, 0, NULL);
base_pointer = (char *)MapViewOfFile(fm, FILE_MAP_READ, 0, 0, 0);
pe = ImageNtHeader(base_pointer);
oh = pe->OptionalHeader;
mi = oh.Magic;
    switch (mi) {
    case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
        puts("64-bit");
        break;
    case IMAGE_NT_OPTIONAL_HDR32_MAGIC:
        puts("32-bit");
        break;
    default:
        puts("no match bitness\n");
        break;
    }
rva = oh.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
sec = ImageRvaToSection(pe, base_pointer, rva);
sb = (char *)(base_pointer + sec->PointerToRawData);
sa = (char *)(sb - sec->VirtualAddress);
id = (IMAGE_IMPORT_DESCRIPTOR *)(sa + rva);
while (!IsBadReadPtr(id, sizeof(*id)) && id->Name) {
printf("\ndependency \"%s\":\n", (char *)(sa + id->Name));
id++;
}

然而这只适用于 32 位 dll。在 64 位 dll 上尝试时,我的“rva”结果为 0。不过,上面几行中的位数检查工作正常。关于 64 位 dll 可能出现什么问题的任何指示?

编辑: 我想问题可能是我的目标是 x86(并且我链接到 dbghelp.lib,它是 32 位)。将目标更改为 x64 显然会给我链接器错误。但是我没有任何 dbghelp.lib 64 位版本可以链接。那甚至可用吗?我找不到它。

最佳答案

对于位数,您应该使用 pe-> FileHeader .机器:

switch (pe->FileHeader.Machine) {
case IMAGE_FILE_MACHINE_AMD64:
    puts("64-bit");
    break;
case IMAGE_FILE_MACHINE_I386:
    puts("32-bit");
    break;
default:
    puts("no match bitness\n");
    break;
}

你的没用,因为 IMAGE_OPTIONAL_HEADER 有两种不同的变体取决于位数。
所以这应该适用于 rva:

if (pe->FileHeader.Machine == IMAGE_FILE_MACHINE_I386)
  rva = ((PIMAGE_OPTIONAL_HEADER32)&pe->OptionalHeader)->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
else
  rva = ((PIMAGE_OPTIONAL_HEADER64)&pe->OptionalHeader)->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;

关于c++ - DLL 的导入目录不适用于 64 位 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33024608/

相关文章:

dependencies - 提供/要求表示法中接口(interface)之间的 UML 依赖关系

dependencies - Elixir 依赖项中的版本

c++ - 派生类对象的地址超过 1 个?

c++ - 无法通过 C++ vector 进行解析

c++ - 在 Qt 中读取连续 QProcess 的标准输出

c++ - 外部 exe/dll 或 WTF 的镜像基地址?

c++ - 使用 C++ 构建解决方案后缺少 VCRUNTIME140_1.dll

c++ - 如何从我的 boost/lib 文件夹中获取特定的库?

c++ - Boost几何点初始化

.net - 如何使 MSBuild 自动将所有间接引用复制到输出 (bin) 文件夹