我有一个应用程序,它会显示一些数据。我需要附加到这个应用程序的进程,在内存中找到我需要的数据(实际上是一个数字),并将其保存在某个地方。这个应用程序似乎没有使用标准的Windows控件,所以事情并不像使用AutoIt或类似的东西读取控件数据那么简单。
目前,我是一名自学数据库人,对Windows应用程序调试知之甚少。我甚至不确定我是否正确地提出了我的问题。
那么,您能否给我一些入门指南,比如说,我应该先阅读什么,以及我应该做的一般指示?
感谢。
答案 0 :(得分:7)
要读取其他应用程序的内存,您需要打开至少具有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 Tools的一部分)相关的窗口和控件。最重要的是窗口(或控件)类以及在显示最有趣窗口时将发送的消息。您还可以使用Process Monitor在显示包含有趣信息的窗口时跟踪所有文件和注册表访问。至少在开始时,您应该在窗口上显示您要查找的数据时使用ReadProcessMemory检查进程的内存。
如果您的调查没有成功,我建议您在问题中插入更多信息。
答案 1 :(得分:5)
我的主要建议是:尝试找到任何其他集成方法。即使您成功了,您也将受到目标进程中任何类型更改的攻击,并且可能在Windows O / S中。您所描述的是大多数病毒扫描程序应该标记和阻碍的行为:如果不是现在,那么将来。
那就是说,你可以看看DLL injection。但是,听起来好像你将不得不在反汇编级别调试目标进程:否则,你将如何知道要读取的内存地址?
答案 2 :(得分:0)
答案 3 :(得分:0)
听起来很有趣......但非常困难。既然你说这是“一次性”,那么这样的事情呢?
现在,如果您可以阅读应用程序的OCR屏幕截图,那么编写执行以下操作的程序就是一件简单的事情:
之前我做过类似的事情并取得了不错的成绩,但我认为这是一个脆弱的解决方案。如果应用程序更改,它将停止工作。如果OCR无法读取文本,它将停止工作。如果OCR读取错误的文本,它可能比停止工作更糟糕......
正如其他海报所说,进入记忆和提取数据是一个非常高级的话题......如果你能找到办法,你会感到荣幸!
答案 4 :(得分:0)
我知道这可能不是一个受欢迎的答案,因为这个软件的用途很好,但像CheatEngine和ArtMoney这样的程序允许你搜索一个保留的所有内存。处理给定值,然后细化结果,直到找到您要查找的值的地址。
我最初是在尝试学习如何在遇到其中一个人的培训师后更好地保护我的游戏时学到的,但是在调试时发现该技术偶尔会有用。
以下是上述使用的技术示例:https://www.youtube.com/watch?v=Nv04gYx2jMw&t=265