5

我有一个可以加载插件的工作程序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,但这是另一个问题)上运行。

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

  • 我可以看到一个DllBase看起来可能是每个 DLL 的起始地址(是吗?),但没有大小。
  • 的文档将NtQueryInformationProcess其标记为不可移植,但并没有为我正在尝试做的事情提供替代方案。
  • 在我的系统上,只有and中PEB的字段,加上一些字节数组——这不是一个好兆头。BeingDebuggedSessionIdReservedN

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

4

1 回答 1

4

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

于 2012-09-26T00:15:42.727 回答