【问题标题】:How to read some data from a Windows application memory?如何从 Windows 应用程序内存中读取一些数据?
【发布时间】:2011-04-14 08:51:34
【问题描述】:

我有一个应用程序,它会显示一些数据。我需要附加到这个应用程序的进程,在内存中找到我需要的数据(实际上是一个数字),并将其保存在某个地方。这个应用程序似乎没有使用标准的 windows 控件,所以事情不会像使用 AutoIt 或类似的东西读取控件数据那么简单。

目前我是一名自学数据库的人,对 Windows 应用程序调试的知识相当浅薄。甚至不确定我是否正确地问了我的问题。

那么,您能否给我一些入门指南,例如,我应该首先阅读什么,以及我应该研究的一般方向?

谢谢。

【问题讨论】:

    标签: windows debugging memory data-extraction


    【解决方案1】:

    要读取其他应用程序的内存,您需要打开具有至少PROCESS_VM_READ 访问权限的OpenProcess 进程,然后使用ReadProcessMemory 从进程中读取任何内存地址。如果您是管理员或具有调试权限,您将能够以最大访问权限打开任何进程,您只需在之前启用SeDebugPrivilege(例如参见http://support.microsoft.com/kb/131065)。

    如果您对目标进程的内存不太了解,您可以枚举与VirtualQueryEx 相关的内存块(请参阅How does one use VirtualAllocEx do make room for a code cave? 作为我检查程序代码的示例。您的程序数据可以用同样的方法检查)。

    我看到的最实际的问题是您以过于笼统的方式提出问题。如果你解释更多你正在寻找什么样的数据,我可能会建议你一个更好的方法。例如,如果您可以在某处看到数据,您可以检查与 Spy++(Visual Studio 工具的一部分)相关的相应窗口和控件。最重要的是窗口(或控件)的类别以及将在显示最有趣的窗口时发送的消息。您还可以使用Process Monitor 跟踪所有文件和注册表访问,此时将显示带有有趣信息的窗口。至少在开始时,您应该在您要查找的数据显示在窗口上时检查进程的内存ReadProcessMemory

    如果您的调查没有成功,我建议您在问题中插入更多信息。

    【讨论】:

      【解决方案2】:

      我的主要建议是:尝试找到任何除此之外的其他集成方法。即使您成功了,您也将成为目标进程中任何类型更改的人质,并且可能在 Windows O/S 中。您所描述的是大多数病毒扫描程序应该标记和阻止的行为:如果不是现在,那么在将来。

      也就是说,你可以看看DLL injection。然而,听起来好像您必须在反汇编级别调试目标进程:否则,您将如何知道要读取的内存地址?

      【讨论】:

      • 我不太关心任何变化问题,因为这将是一项一次性的工作——我只需要收集一些恒定的数据并忘记它。我本可以使用此应用程序的 API 收集它,但它没有为我提供获取这些数字的方法,原因不明。
      • 根据我的经验,这是一次快速、肮脏的一次性工作,在六个月的时间内完成这项工作这真的需要永远得到支持,再加上六个月。祝你好运...
      • 事实上,这不是一份工作,它永远都会得到支持。事实上,这根本不是一份工作。这只是对我的好奇心和对不同编程事物的渴望的致敬,与我的“现实生活”项目绝对没有任何关系。没有人永远不会支持它,因为没有人甚至永远不会看到它,因为它永远不会离开我的个人家庭桌面。冷静;)
      【解决方案3】:

      我以前知道windows调试API,但是早就失忆了。使用ollydbg怎么样:

      http://www.ollydbg.de/

      并使用 ollydbg 脚本和 autoit 来控制它?

      【讨论】:

      【解决方案4】:

      听起来很有趣……但非常困难。既然你说这是“一次性”,那么像这样的东西呢?

      • 截取此应用程序的屏幕截图。
      • 通过 OCR 程序运行屏幕截图
      • 如果您能够以可预测的方式阅读您要查找的文本,那么您就成功了一半!

      因此,如果您现在可以读取应用程序的 OCR 屏幕截图,那么只需编写一个执行以下操作的程序即可:

      • 编写步骤以获取屏幕上的数据
      • 创建相关数据的屏幕截图
      • 通过像Microsoft Office Document Imaging这样的OCR程序运行它
      • 提取相关文本并对其执行“任何操作”。

      我以前做过类似的事情,效果很好,但我会说这是一个脆弱的解决方案。如果应用程序发生更改,它将停止工作。如果 OCR 无法读取文本,它将停止工作。如果 OCR 读取错误的文本,它可能会做比停止工作更糟糕的事情......

      正如其他发帖者所说,进入内存并提取数据是一个相当高级的话题......如果你能找到一种方法来做到这一点,我向你致敬!

      【讨论】:

      • 我没有意识到你这样做是为了好玩。无论如何,我都会留下我的答案作为替代方法。
      【解决方案5】:

      我知道这可能不是一个受欢迎的答案,因为该软件的用途性质,但像 CheatEngineArtMoney 这样的程序允许您搜索进程为给定的所有保留的内存值,然后细化结果,直到找到您要查找的值的地址。

      我最初是在尝试学习如何更好地保护我的游戏时了解到这一点的,因为我遇到了一位培训师,但在调试时发现该技术有时很有用。

      这里是上述技术的一个使用示例:https://www.youtube.com/watch?v=Nv04gYx2jMw&t=265

      【讨论】:

        猜你喜欢
        • 2015-11-26
        • 1970-01-01
        • 1970-01-01
        • 2013-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多