2017-09-12 48 views
0

假设有下面的代码 -获取文件名由地址映射到内存中它映射到

HANDLE h = CreateFile(L"some_dll.dll", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_DELETE, 
    NULL, 
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
HANDLE map = CreateFileMapping(h, NULL, PAGE_READONLY | SEC_IMAGE, 0, 0, NULL); 
LPVOID res = MapViewOfFileEx(map, 0, 0, 0, 0, 0); 

是否可以提取“some_dll”,因为采用c它映射到地址,++?

当试图调试使用WinDbg的这个可执行文件,它似乎不提取模块也很好

enter image description here

回答

5

是的,这正是GetMappedFileName是:

检查指定地址是否在指定进程的地址空间中的内存映射文件中。如果是这样,该函数将返回内存映射文件的名称。

PS:没有理由让windbg显示不是加载模块的内存映射文件的名称,即使该文件碰巧是DLL。

+0

太好了,谢谢! –

+2

文件映射(即段对象)映射为“SEC_IMAGE”,内存管理器为其映射PE/COFF映像标题中指定的各个段。因此,WinDbg会显示来自映射图像“IMAGE_EXPORT_DIRECTORY”的“Name”,如果它实际上是作为模块加载的,IIRC将被加载器模块表中的任何名称覆盖。 VC++在生成一个DLL时设置这个导出目录'Name'字段。似乎用于构建此DLL的工具将其留为空白。 – eryksun