我有一个应用程序,它向我显示一些数据。我需要附加到这个应用程序的进程,在内存中找到我需要的数据(实际上是一个数字),并将其保存在某个地方。这个应用程序似乎没有使用标准的 Windows 控件,所以事情不会像使用 AutoIt 或类似的东西读取控件数据那么简单。
目前我是一个自学数据库的人,对 Windows 应用程序调试的知识相当浅薄。甚至不确定我是否正确地问了我的问题。
那么,您能否给我一些入门指南,例如,我应该首先阅读什么,以及我应该研究的一般方向?
谢谢。
我有一个应用程序,它向我显示一些数据。我需要附加到这个应用程序的进程,在内存中找到我需要的数据(实际上是一个数字),并将其保存在某个地方。这个应用程序似乎没有使用标准的 Windows 控件,所以事情不会像使用 AutoIt 或类似的东西读取控件数据那么简单。
目前我是一个自学数据库的人,对 Windows 应用程序调试的知识相当浅薄。甚至不确定我是否正确地问了我的问题。
那么,您能否给我一些入门指南,例如,我应该首先阅读什么,以及我应该研究的一般方向?
谢谢。
要读取其他应用程序的内存,您需要至少以访问权限打开关于OpenProcessPROCESS_VM_READ
的进程,然后使用ReadProcessMemory从进程中读取任何内存地址。如果您是管理员或具有调试权限,您将能够以最大访问权限打开任何进程,您只需在SeDebugPrivilege
之前启用(例如参见http://support.microsoft.com/kb/131065)。
如果您对目标进程的内存不太了解,则可以仅枚举有关VirtualQueryEx的内存块(请参阅如何使用 VirtualAllocEx 为代码洞穴腾出空间?作为我检查程序代码的示例. 你可以用同样的方法检查程序数据)。
我看到的最实际的问题是您以过于笼统的方式提出问题。如果你解释更多你正在寻找什么样的数据,我可能会建议你一个更好的方法。例如,如果您可以在某处看到数据,您可以检查与 Spy++(Visual Studio 工具的一部分)相关的相应窗口和控件。最重要的是窗口(或控件)的类别以及将在显示最有趣的窗口时发送的消息。您还可以使用Process Monitor在显示带有有趣信息的窗口时跟踪所有文件和注册表访问。至少在开始时,您应该使用ReadProcessMemory检查进程的内存在您正在查找的数据显示在窗口上的那一刻。
如果您的调查没有成功,我建议您在问题中插入更多信息。
我的主要建议是:尝试找到除此之外的任何其他集成方法。即使您成功了,您也将成为目标进程中任何类型更改的人质,并且可能在 Windows O/S 中。您所描述的是大多数病毒扫描程序应该标记和阻止的行为:如果不是现在,那么在将来。
也就是说,你可以看看DLL injection。然而,听起来好像您必须在反汇编级别调试目标进程:否则,您将如何知道要读取的内存地址?
听起来很有趣……但非常困难。既然你说这是“一次性”,那么像这样的东西呢?
因此,现在如果您可以读取应用程序的 OCR 屏幕截图,只需编写一个执行以下操作的程序即可:
我以前做过类似的事情,效果很好,但我会说这是一个脆弱的解决方案。如果应用程序发生更改,它将停止工作。如果 OCR 无法读取文本,它将停止工作。如果 OCR 读取错误的文本,它可能会做比停止工作更糟糕的事情......
正如其他发帖者所说,进入内存并提取数据是一个非常高级的话题......如果你能找到一种方法来做到这一点,那就向你致敬!
我知道这可能不是一个流行的答案,由于该软件的用途,但是像CheatEngine和ArtMoney这样的程序允许您搜索进程为给定值保留的所有内存,然后细化结果直到你找到你正在寻找的值的地址。
我最初是在遇到一位培训师之后尝试学习如何更好地保护我的游戏时了解到这一点的,但我发现该技术在调试时偶尔有用。
以下是使用上述技术的示例:https ://www.youtube.com/watch?v=Nv04gYx2jMw&t=265