如何从Android应用程序中读取内存数据

时间:2016-06-15 02:31:37

标签: android database

我想从应用程序中获取一些数值数据,但它们不会存储为像db这样的文件。我知道有一些内存黑客应用程序可以改变游戏价值,虽然我不知道它们是如何工作的。 我正在寻找类似的功能,但我不需要改变任何东西。

我正在尝试编写的应用程序只读取特定应用程序中的一些数据,并根据它进行一些背景计算。如果这是不可能的,我需要通过阅读屏幕获取信息(例如获取像素颜色),但这对于获取大量数据来说似乎是非常麻烦的任务。

有没有办法实现这个目标?

感谢。

编辑:我认为我需要root权限吗?

2 个答案:

答案 0 :(得分:6)

是的,您需要root权限。此外,您的用户必须拥有完全有根的设备,例如SuperSU或其他现代Su应用程序,可以解除大多数SELinux限制。可能还存在与KNOX和其他类似系统的冲突,但我对这些系统并不了解。

您需要将您的进程作为调试器附加到目标应用程序,并通过扫描其内存来找到必要的数据。这可以通过多种方式完成,可以在scanmem中找到要查看的最佳参考实现。

执行实际行为的代码,需要root权限, - 读/写目标进程内存 - 将驻留在本机可执行文件中,通过su运行。您必须编写一些代码来与该可执行文件进行通信(可能通过它的stdin / stdout或类似的东西)。

您还必须编写其他代码来自行解析目标应用程序的内存布局。

或者,您可能更喜欢在目标应用程序的内存中注入一个小模块和/或让应用程序本身加载您制作的Dex文件(如果您的目标数据存储在Java内存中,则特别方便)。此方法具有最小化与虚拟机的内存布局的交互的好处,但您仍然必须启动初始Dex文件的加载。加载Dex文件后,您可以使用古老的反射API在Java代码中完成其余工作。如果你选择这条路线,可以在compel library中找到一个(体面支持!)用于在Linux进程内存中注入可执行代码片段的代码,该代码是作为CRIU项目的一部分开发的 [1]

答案 1 :(得分:1)

两个Android进程无法共享内存并相互通信直接。因此,为了进行通信,必须将对象分解为基元(编组)并跨过程边界进行转换。

要进行此编组操作,必须编写大量复杂的代码,因此Android会使用AIDL(Android界面定义语言)为我们处理它。

从OP开始,由于无法找到更多详细信息,我建议您使用关键字“AIDL”进行阅读/搜索,然后您将被重定向到具体的解决方案。