Windows下动态加载的库的地址范围

Gil*_*il' 5 c windows dll process loadlibrary

我有一个加载插件的工作程序LoadLibrary.

新要求:在代码中的某个时刻,我给了一个指针,我需要测试这个指针是否指向插件的代码或静态数据.

bool is_pointer_into_plugin(void *p, HMODULE h);
Run Code Online (Sandbox Code Playgroud)

同样地,我需要检索指针所指向的插件(如果有的话).我还需要知道指针是指向主程序的代码还是静态数据(理想情况下,区分只读区域和读写区域).

HMODULE plugin_containing_pointer(void *p);
Run Code Online (Sandbox Code Playgroud)

同样,我需要能够检索插件映射的范围(地址和大小).我还需要这个主程序的信息.

我该如何实现is_pointer_into_plugin,或者plugin_containing_pointer等同于什么?

LoadLibrary如有必要,我可以更改电话.查找应该尽可能快,加载时代码不需要很快.在单独的进程中运行插件并通过共享内存进行通信不是一种选择.该程序必须在Windows XP及更高版本上运行(和Linux,但这是另一个问题).

我需要的信息或多或少是Sysinternals实用程序listdlls报告的内容,所以我试图找出它是如何实现的.我看到了一个建议使用的NtQueryInformationProcess检索PEB其链接到一个结构LDR_DATA_TABLE_ENTRY.看起来很有希望但是:

  • 我可以看到一个DllBase看起来可能是每个DLL的起始地址(是吗?),但没有大小.
  • NtQueryInformationProcess标记的文件标记为不可移植,但并未提示我正在尝试做的替代方案.
  • 在我的系统中,唯一的字段PEBBeingDebuggedSessionId,加上一些字节数组 - 不是一个好兆头.ReservedN

如何枚举插件的地址范围,或者测试指针是否在插件中,或者确定指针指向哪个插件?

Ray*_*hen 5

GetModuleHandleEx带有GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS标志会告诉你指针指向哪个模块。您可以从中研究模块标题来找出哪个部分。但整个练习闻起来很有趣。为什么你关心指针指向哪个插件?