Windows下的动态加载库的地址范围(Address range of a dynamically

2019-09-23 00:35发布

我有一个加载的插件与工作程序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将其标记为不可移植,但没有提出什么,我试图做一个选择。
  • 在我的系统中,唯一的领域PEBBeingDebuggedSessionId ,再加上一些Reserved N字节数组-不是一个好兆头。

我怎样才能枚举插件的地址范围,或测试指针是否是一个插件内,或确定哪些插件指针点进去?

Answer 1:

GetModuleHandleExGET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS标志会告诉你哪些模块指针指向成。 从可以学习模块头找出哪些部分。 但是整套动作的气味好笑。 为什么你关心哪个插件指针指向?



文章来源: Address range of a dynamically loaded library under Windows