【问题标题】:Different memory dumps generated by being internal/external to a process由进程内部/外部生成的不同内存转储
【发布时间】:2011-08-20 10:30:42
【问题描述】:

我最近一直在玩内存转储,偶然发现了一些我不完全理解的东西。

如果我有一个进程并通过使用 VirtualQueryEx 和 ReadProcessMemory 来获取数据并将其转储到文件中来转储其内存内容,那么一切正常。同时,我尝试通过在进程内部执行 VirtualQuery 并转储它返回的指针的内容来做同样的事情。 我可以通过代理我正在测试的进程的一个 DLL 来做到这一点。 现在,问题是这两个内存转储是不同的(从进程内部创建的转储中缺少区域) 有人可以告诉我为什么会这样吗? Windows XP SP3 + Visual Studio 2008 非常感谢。

【问题讨论】:

    标签: c multithreading winapi memory


    【解决方案1】:

    你需要转储什么?谈到进程分配的所有内存页面,我认为您可以获得不同的值,因为内部进程状态(通常)每次都是唯一的。此外,如果您将进程的内存转储到进程之外,则转储程序的代码不在转储进程地址空间中,而如果您从进程内部转储进程,则该进程现在包含转储程序的代码。因此,仅转储属于进程应用程序或 DLL 的特定数量的页面可能很有用。

    【讨论】:

    • 我正在尝试转储除代码之外的所有内容;是的,我知道该过程现在包括倾销者代码,我已将其考虑在内;内部转储和外部转储同步,但内部转储缺少区域
    • 你能在转储前尝试用 VirtualLock() 锁定内存吗?您能否获得一些关于错过哪些页面的信息?
    • 我的假设是缺少线程堆栈页面,但我真的无法判断;另外,我不会做 VirtualLock() 因为这是为了游戏,它可能会产生......后果;为了在其中运行,我正在挂钩一个 DLL 函数;就像我无法从内钩的线程中“看到”所有内容。
    • 好吧,尝试遍历每个用户模式页面 (4K),并为每个页面尝试获取它的第一个字节。如果页面不是由进程分配的,你应该得到一个 AV 异常,所以跳到下一页。对于每个当前页面调用 VirtualQuery,然后在需要时转储它。这是一个可以给我们一些信息的建议......
    • 这将是一种非常缓慢的记忆方式;关键是,我从流程内部看到的内存是否有理由与我从流程内容外部看到的内存不同?忽略转储程序的存在并考虑完美同步。
    猜你喜欢
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多