Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scanning and Editing Android App Memory Values Programmatically

Tags:

android

memory

I've been using a few Android apps that hook onto another process, scan its allocated memory and edit it. Obviously, I was using it to mess around with some games.

Then, it got me thinking, "How are they doing it?" I know how to get the list of currently running apps but hooking onto another process and scanning and editing the process' memory are.. Beyond my knowledge.

It seems that I'd need some kind of "root" privileges to execute code like that but I don't mind. I just want to know how these app developers did it to sate my curiosity.

So.. Assuming root privileges are enabled..

1) How can I hook onto a currently running different app?

2) How can I scan its memory regions?

3) How can I edit its memory regions?

inb4 "Have you tried googling?"

I thought about it and did a tonne of Googling (1+ hours) but no results because the words "RAM" and "memory" just gives me stuff like how to track the current app's memory allocations and whatnot. In other words, not what I am looking for.

So, I finally turned to opening a thread here.

like image 641
Justin AnyhowStep Avatar asked Apr 04 '14 02:04

Justin AnyhowStep


People also ask

How do I check app memory on Android?

Open your Apps list and tap the ""Settings"" app. Select ""Device care"" or ""Device maintenance"" on the menu—the name varies by model. Now, tap ""Memory"" to view the total amount of RAM in your phone or tablet, as well as RAM usage per app.

What is the onTrimMemory () method?

onTrimMemory(): Called when the operating system has determined that it is a good time for a process to trim unneeded memory from its process. This will happen for example when it goes in the background and there is not enough memory to keep as many background processes running as desired.

What is PSS memory in Android?

When inspecting your app's heap, Android computes a value called the Proportional Set Size (PSS), which accounts for both dirty and clean pages that are shared with other processes—but only in an amount that's proportional to how many apps share that RAM.


1 Answers

Putting this here for posterity

After a fair bit of research (read, 5 days straight), as far as Linux is concerned, one may attach to a process, read its memory and detach by simply doing this:

Heavily commented for the newbies like me, uncomment and whatever if you're better

#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, pid, (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, pid, NULL, NULL);
    return 0;
}

References:

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

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

How does this relate to editing Android app memory values?

Well, the headers for ptrace and wait exist in the Android NDK. So, to read/write an app's RAM, you will need native code in your app.

Also, ptrace() requires root privileges.

Why did it take you this long? I've never written this kind of code before.

like image 184
Justin AnyhowStep Avatar answered Sep 24 '22 15:09

Justin AnyhowStep