我正在尝试打印需要为给定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位版本链接。这是否可用。我找不到它。
答案 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