【问题标题】:Get filename mapped into memory by the address it's mapped to通过映射到的地址获取文件名映射到内存
【发布时间】:2018-02-20 15:57:56
【问题描述】:

假设有以下代码 -

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);

如果给定它映射到的地址,是否可以使用 c++ 提取“some_dll”?

当尝试使用windbg调试这个可执行文件时,它似乎也没有很好地提取模块

【问题讨论】:

    标签: c++ c windows winapi memory


    【解决方案1】:

    是的,这正是 GetMappedFileName 的用途:

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

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

    【讨论】:

    • 文件映射(即Section对象)被映射为SEC_IMAGE,内存管理器映射PE/COFF图像头中指定的各个部分。所以WinDbg确实显示了映射图像IMAGE_EXPORT_DIRECTORY中的Name,如果它实际上是作为一个模块加载的,那么IIRC会被加载器模块表中的任何名称覆盖。 VC++ 在构建 DLL 时设置此导出目录Name 字段。似乎用于构建此 DLL 的工具将其留空。
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2020-12-06
    相关资源
    最近更新 更多