【发布时间】:2010-05-23 09:11:24
【问题描述】:
是否有可靠的方法来获知内存页面或页面范围属于进程地址空间内的特定 DLL?
【问题讨论】:
标签: c++ windows winapi dll memory-management
是否有可靠的方法来获知内存页面或页面范围属于进程地址空间内的特定 DLL?
【问题讨论】:
标签: c++ windows winapi dll memory-management
取决于页面的类型。 dll的代码页地址等在加载时是已知的,并且可以通过查看“加载的模块”窗口或任何调试器中的等效窗口来查看。
如果您谈论的是一般的读/写内存页面,而我认为您是,那么我不知道有什么方法可以找出它“属于”哪个 dll - 我也不认为有这里有严格的所有权概念。
【讨论】:
有一种方法称为API 挂钩。来自 John Robbins 的著名 BugslayerUtil.DLL(参见他的书“调试应用程序”)战争最初用作自己进程内部的 API 挂钩。我的意思是,所有内存分配都可以分配给少数众所周知的函数,如LocalAlloc、GlobalAlloc、VirtualAlloc 等。可以在进程地址空间内覆盖此函数的起始地址。您可以在进程开始时的某个地方执行此操作,也可以使用 DLL 注入来执行此操作(就像在分析模式下执行 Dependency Walker 一样)。因此,您将能够记录(跟踪)每次内存分配尝试,将调用转发到原始函数,再次查看结果返回值记录(跟踪)并返回结果。在每次调用尝试中,您都可以在调用堆栈上看到调用此函数的所有函数。因此,调用堆栈的包含以及分配的内存地址和大小为您提供了您正在寻找的完整信息。您将在动态中看到所有内容。
你不应该自己实现所有东西。只需在互联网上搜索“API 挂钩”或“DLL 注入”,您就会找到足够的工作示例。为了检查调用堆栈,您可以使用 imagehlp.dll / dbghelp.dll 中记录的 StackWalk64 函数(参见 http://msdn.microsoft.com/en-us/library/ms680650(VS.85).aspx)(例如参见 http://www.codeproject.com/KB/threads/StackWalker.aspx)。
所以在我看来你的问题可以解决。
【讨论】: