DLL的导入目录在64位的DLL上不起作用
import directory of a DLL does not work on 64bit dll
我正在尝试打印需要为给定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
相关文章:
- C++/CLI 混合托管/本机 DLL 不起作用
- 可视C++:XGBoost 从 DLL 调用时不起作用
- PlayFunction在DLL中不起作用,但在独立的exe中工作
- DLL函数在VBA环境中不起作用,但在Excel VBA中工作
- 将 DLL 附加到托管进程不起作用
- 在 DLL 中使用时,运行代码不起作用
- boost::从 DLL 调用时日志格式不起作用
- 在 Windows 8 中编译的 DLL 在 Windows 7 中不起作用
- 编译错误libgcc_s_dw2-1.dll缺少任何内容都不起作用
- 64位DLL中的CreateThread不起作用
- 将DLL与python一起使用(使用ctypes),不起作用
- GetFullPathNameA的Dll注入不起作用
- 注入dll在windows XP上不起作用
- C# COM-Interop dll for C++ COM dll 在 2 个解决方案之间不起作用
- 在Windows 7下编译的Dll在Windows XP中不起作用
- 线程对象的 WaitForSingleObject 在 DLL 卸载中不起作用
- 这个简单的C++ DLL 在 C# 中不起作用
- win32 DLL中的C++-LoadString()不起作用
- PostMessage(),SendMessage 在 ATL dll 中不起作用(事件处理)
- 在Windows CE上安装CAB时,安装DLL不起作用