有没有可靠的方法来了解内存页面或一系列页面属于进程地址空间内的特定DLL?
答案 0 :(得分:1)
取决于页面类型。 dll的代码页等地址在加载时是已知的,并且可以通过查看任何调试器中的“已加载模块”窗口或等效窗口来查看。
如果你在谈论一般的读/写内存页面,我认为你是,那么我不知道找出它所属的dll的方法 - 我也不认为有这里严格的所有权概念。
答案 1 :(得分:0)
有一种称为 API挂钩的方法。来自John Robbins的着名BugslayerUtil.DLL(参见他的书“调试应用程序”)战争最初用作自己进程中的API挂钩。我的意思是所有内存分配都可以分配给少量众所周知的函数,如LocalAlloc
,GlobalAlloc
,VirtualAlloc
等。可以在进程地址内覆盖此函数的起始地址空间。你可以在进程开始的某个地方执行此操作,也可以使用DLL注入来实现此功能(就像它在分析模式下执行Dependency Walker一样)。因此,您将能够记录(跟踪)每次内存分配尝试,将调用转发到原始函数,再次查看生成的返回值log(trace)并返回结果。在每次调用尝试中,您都可以看到在调用堆栈中调用此函数的所有函数。因此,调用堆栈的包含以及已分配内存的地址和大小可为您提供所需的完整信息。你会看到动态的一切。
你不应该自己实现所有的东西。只需在互联网上搜索“API挂钩”或“DLL注入”,你就会找到足够的工作示例。要检查调用堆栈,您可以使用 imagehlp.dll / dbghelp.dll 中记录的StackWalk64函数(请参阅http://msdn.microsoft.com/en-us/library/ms680650(VS.85).aspx)(例如,请参阅{{3} })。
所以在我看来你的问题可以解决。