DLL的导入目录在64位dll上不起作用

时间:2015-10-08 19:41:06

标签: 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位版本链接。这是否可用。我找不到它。

2 个答案:

答案 0 :(得分:1)

对于比特,你应该使用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;

答案 1 :(得分:0)

对于今后偶然发现这篇文章的人。

我怀疑,您需要链接64位dbghelp.lib并将目标平台更改为x64以使用64位dll。但是这对32位dll不起作用。

看起来你需要使用diff bitness程序来处理各自的bitness dll。

此外,dbghelp.lib位于: C:\ Program Files \ Debugging Tools for Windows(x64)\ sdk \ lib