DLL的导入目录不适用于64位dll [英] import directory of a DLL does not work on 64bit 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屋!