DLL的导入目录不适用于64位dll [英] import directory of a DLL does not work on 64bit dll

查看:104
本文介绍了DLL的导入目录不适用于64位dll的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to print the bitness and dll's that needs to be loaded for a given dll.

我的代码如下所示(简化版;不进行错误检查) :

My code looks like this (simplified version;without error checking):

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可能出什么问题?

However this only works with 32bit dll's. My 'rva' turns out to be 0 when tried on 64 bit dll. Bitness check in the lines above work fine though. Any pointers on what might be going wrong with 64 bit dll's?

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

I guess the problem might be that my target is x86 (and im linking against dbghelp.lib which is 32bit). Changing the target to x64 obviously gives me linker errors. However I dont have any dbghelp.lib 64 bit version to link against. Is that even available. I couldnt find it.

推荐答案

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

For the bitness you should use pe->FileHeader.Machine:

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:

Yours didn't work because there are 2 different variants of IMAGE_OPTIONAL_HEADER depending on the bitness.
So this should work for 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;

这篇关于DLL的导入目录不适用于64位dll的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆