以编程方式扫描并编辑Android应用内存值

前端之家收集整理的这篇文章主要介绍了以编程方式扫描并编辑Android应用内存值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在使用几个挂钩到另一个进程的 Android应用程序,扫描其分配的内存并进行编辑.显然,我正在用它来混乱一些游戏.

然后,它让我想到,“他们怎么做?
我知道如何获取当前正在运行的应用程序的列表,但是挂钩到另一个进程,扫描和编辑进程的内存是…除了我的知识.

看来我需要某种“root”特权来执行这样的代码,但是我不介意.我只是想知道这些应用程序开发人员如何表达我的好奇心.

所以..
假设启用root权限

1)如何挂钩到当前运行不同的应用程序?

2)如何扫描其内存区域?

3)如何编辑其内存区域?

inb4“你尝试过谷歌吗?”

我想了一下,做了一吨谷歌(1小时),但没有结果,因为“RAM”和“记忆”这个词只是给我的东西,如何跟踪当前的应用程序的内存分配和什么.换句话说,不是我在找什么.

所以,我终于转过身来打开一个线程.

解决方法

把这里放在后面

经过相当多的研究(直读5天),就Linux而言,可以附加到一个进程,读取它的内存和分离,只需这样做:

重新评论像我这样的新手,取消注释,如果你更好的话

#include <sys/ptrace.h> //For ptrace()
#include <sys/wait.h>   //For waitpid()

int main () {
    int pid     = 1337; //The process id you wish to attach to
    int address = 0x13371337; //The address you wish to read in the process

    //First,attach to the process
    //All ptrace() operations that fail return -1,the exceptions are
    //PTRACE_PEEK* operations
    if (ptrace(PTRACE_ATTACH,pid,NULL,NULL) == -1) {
        //Read the value of errno for details.
        //To get a human readable,call strerror()
        //strerror(errno) <-- Returns a human readable version of the
        //error that occurred
        return 0;
    }

    //Now,attaching doesn't mean we can read the value straight away
    //We have to wait for the process to stop
    int status;
    //waitpid() returns -1 on failure
    //W.I.F,not W.T.F
    //WIFSTOPPED() returns true if the process was stopped when we attached to it
    if (waitpid(pid,&status,0) == -1 || !WIFSTOPPED(status)) {
        //Failed,read the value of errno or strerror(errno)
        return 0;
    }

    errno = 0; //Set errno to zero
    //We are about to perform a PTRACE_PEEK* operation,it is possible that the value
    //we read at the address is -1,if so,ptrace() will return -1 EVEN THOUGH it succeeded!
    //This is why we need to 'clear' the value of errno.
    int value = ptrace(PTRACE_PEEKDATA,(void*)addr,NULL);
    if (value == -1 && errno != 0) {
        //Failed,read the value of errno or strerror(errno)
        return 0;
    } else {
        //Success! Read the value
    }

    //Now,we have to detach from the process
    ptrace(PTRACE_DETACH,NULL);
    return 0;
}

参考文献:

http://linux.die.net/man/2/ptrace

http://linux.die.net/man/2/waitpid

这与编辑Android应用内存值有关吗?

那么,在Android NDK中存在ptrace和wait的标题.所以,要读/写一个应用程序的RAM,你将需要你的应用程序的本地代码.

此外,ptrace()需要root权限.

为什么要这么长时间?我从来没有写过这样的代码.

猜你在找的Android相关文章