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

import directory of a DLL does not work on 64bit dll

本文关键字:DLL 不起作用 64位 导入      更新时间:2023-10-16

我正在尝试打印需要为给定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 bitnessn");
        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显然会导致链接器错误。然而,我没有任何帮助。库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 bitnessn");
    break;
}

你的没有工作,因为IMAGE_OPTIONAL_HEADER有2种不同的变体,这取决于位。
所以这应该适用于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;

对于将来偶然发现这篇文章的人。

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

看起来你需要有不同的位程序来处理各自的位dll。

dbghelp。Lib位于这里:C:Program FilesDebugging Tools for Windows (x64)sdklib