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

时间:2012-09-25 19:03:45

标签: c windows dll process loadlibrary

我有一个使用LoadLibrary加载插件的工作程序。

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

bool is_pointer_into_plugin(void *p, HMODULE h);

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

HMODULE plugin_containing_pointer(void *p);

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

如何实施is_pointer_into_pluginplugin_containing_pointer或等效的内容?

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

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

  • 我可以看到DllBase,看起来它可能是每个DLL的起始地址(是吗?),但没有大小。
  • NtQueryInformationProcess的文档标记为不可移植,但并未提出替代我正在尝试的内容。
  • 在我的系统上,PEB中的唯一字段是BeingDebuggedSessionId,加上一些ReservedN字节数组 - 这不是一个好兆头。

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

1 个答案:

答案 0 :(得分:4)

带有GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS标志的

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