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

标签 c windows dll process loadlibrary

我有一个可以使用 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 报告,所以我试图找出它是如何实现的。我看到一个suggestion使用 NtQueryInformationProcess 检索 PEB 链接到 LDR_DATA_TABLE_ENTRY 的结构.看起来很有前途,但是:

  • 我可以看到 DllBase看起来它可能是每个 DLL 的起始地址(是吗?),但没有大小。
  • NtQueryInformationProcess 的文档将其标记为不可移植,但不建议替代我正在尝试做的事情。
  • 在我的系统上,PEB 中唯一的字段是BeingDebuggedSessionId , 加上一些 Reserved<em>N</em>字节数组——这不是一个好兆头。

如何枚举插件的地址范围,或者判断指针是否在插件内,或者判断指针指向哪个插件?

最佳答案

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

关于c - Windows下动态加载库的地址范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12589461/

相关文章:

c - 在 CMake 中编译静态 C 库时未生成中间 .obj 文件

使用字符串参数从 C 调用 D 函数

C:如何将一系列变量应用于函数?

windows - 批处理脚本多选

C# - 动态加载 DLL - System.Reflection.ReflectionTypeLoadException : Unable to load one or more of the requested types

c++ - 如何从共享库中调用函数?

.net - 我能否创建一个与标准 .NET Framework 和 .NET Compact Framework 兼容的 DLL?

c - 为什么这个添加被默默地忽略了?

windows - 添加/删除显示在漫游用户帐户中的我的应用程序

c# - 当前焦点程序/文件名 (Windows)