2016-06-15 162 views
1

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

我想写的应用程序只是从特定的应用程序读取一些数据,并根据它做一些背景计算。如果这是不可能的,我需要通过阅读屏幕来获取信息(例如获取像素颜色),但这对于获取许多数据似乎是非常繁琐的任务。

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

谢谢。

编辑:我想我会需要一个根权限呢?

+0

您想要访问以读取数据的应用程序吗? –

+0

@Raptor我不知道如何,所以我在这里问。任何相关的想法或在哪里寻找将是非常有益的。 – Seung

+0

@TedHopp是的,我试图写的应用程序将读取数据。正在读取的数据来自另一个第三方应用程序 – Seung

回答

4

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

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

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

您还必须编写额外的代码来自己分析目标应用程序的内存布局。或者,您可能更喜欢在目标应用程序的内存中注入一个小模块,或者让应用程序本身加载您制作的Dex文件(如果目标数据存储在Java内存中,尤其方便)。这种方法有利于最大限度地减少与虚拟机的内存布局的交互,但是您仍然必须启动加载初始Dex文件。一旦加载了Dex文件,您就可以使用旧的反射API在Java代码中完成剩下的工作。如果你采用这种方式,在Linux进程内存中注入可执行代码片段的代码(体面支持!)可以在compel library中找到,该代码是作为CRIU项目的一部分而开发的。

+0

请注意,我真诚地为您提供帮助,但是许多内存扫描程序应用程序在抄袭开源代码(尤其是scanmem)时甚至没有给予作者正确的评分。如果您使用scanmem的代码,请考虑至少与其他人分享与您的工作相关的记忆扫描相关部分。还要注意,上述方法是非常通用的。如果您只需要Java应用程序支持,则最好使用Android Accesibility API或Java远程调试API来获得您的方式(前者甚至可以在没有root权限的情况下使用!) – user1643723

+0

非常感谢,它确实有帮助。这个应用程序将是私人的,只为我。一直在用神经网络学习和编码,并且认为一场比赛对于练习对抗实际比赛是一个好的开始。我只希望获得输入数据与神经网络的实际部分相比并不是那么大的混杂。 – Seung

1

两个Android进程不能共享内存并互相通信直接。所以为了交流,对象必须被分解为原语(编组)并跨越过程边界。

要做到这一点编组,必须编写大量复杂的代码,因此Android会使用AIDL(Android接口定义语言)处理它。

从OP,因为没有更多的细节可以找到,我建议你阅读/搜索关键字“AIDL”,你会被重定向到具体的解决方案。

+0

感谢您的回答。现在,我没有看到任何相关部分,但我想这是我的错,不清楚我想要什么。我会继续阅读:) – Seung

相关问题