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

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

我有一个工作程序,用 LoadLibrary加载插件. 新要求:在代码中的某个时刻,我给了一个指针,我需要测试这个指针是否指向插件的代码或静态数据. bool is_pointer_into_plugin(void *p, HMODULE h); 同样地,我需要检索指针所指向的插件(如果有的话).我还需要知道指

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

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

bool is_pointer_into_plugin(void *p,HMODULE h);

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

HMODULE plugin_containing_pointer(void *p);

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

我如何实现is_pointer_into_plugin,plugin_containing_pointer或类似的东西?

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

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

>我可以看到一个DllBase看起来可能是每个DLL的起始地址(是吗?),但没有大小.
> NtQueryInformationProcess的文档将其标记为不可移植,但并未提示我正在尝试执行的操作.
>在我的系统上,PEB中的唯一字段是BeingDebugged和SessionId,加上一些ReservedN字节数组 – 这不是一个好兆头.

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

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

本文来自网络,不代表云浮站长网立场。转载请注明出处: https://www.0766zz.com/html/zhonghe/fwq/windows/20200901/8717.html
上一篇
下一篇

作者: dawei

【声明】:云浮站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

为您推荐

返回顶部