Memory dumping Android

18

Devo valutare la sicurezza di una libreria crittografica. In particolare, ho scelto come target una parte della libreria in cui credo che la chiave privata sia esposta per un tempo limitato nella RAM. Qualsiasi idea o suggerimento su come andare a controllare la RAM per questa chiave. Stavo pensando di scaricare la memoria dopo alcune interazioni utente specifiche. Ma come iniziare con questo, tutti gli strumenti consigliati? Sono a casa nel mondo della sicurezza, conosco i layout di memoria, l'uso, le contromisure contro gli attacchi di memoria, ecc. Semplicemente non in Android.

Per quanto riguarda l'avviamento, è sufficiente che gli strumenti / le tecniche richiedano dispositivi di aggiornamento del kernel personalizzati o rooted. Ma alla fine dovrebbe essere applicabile in situazioni reali in cui il dispositivo di destinazione è un dispositivo OEM pronto all'uso.

    
posta 4oxer 02.07.2014 - 16:07
fonte

4 risposte

10

Ho avuto lo stesso bisogno e dopo aver guardato in giro ho finito per scrivere il mio programma.

Utilizzo:

memdump <pid>
memdump <pid> <ip-address> <port>

Il primo invierà l'intera memoria del processo allo stdout e quest'ultimo alla porta TCP di tua scelta (probabilmente userai netcat dall'altra parte).

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <sys/ptrace.h>
#include <sys/socket.h>
#include <arpa/inet.h>

void dump_memory_region(FILE* pMemFile, unsigned long start_address, long length, int serverSocket)
{
    unsigned long address;
    int pageLength = 4096;
    unsigned char page[pageLength];
    fseeko(pMemFile, start_address, SEEK_SET);

    for (address=start_address; address < start_address + length; address += pageLength)
    {
        fread(&page, 1, pageLength, pMemFile);
        if (serverSocket == -1)
        {
            // write to stdout
            fwrite(&page, 1, pageLength, stdout);
        }
        else
        {
            send(serverSocket, &page, pageLength, 0);
        }
    }
}

int main(int argc, char **argv) {

    if (argc == 2 || argc == 4)
    {
        int pid = atoi(argv[1]);
        long ptraceResult = ptrace(PTRACE_ATTACH, pid, NULL, NULL);
        if (ptraceResult < 0)
        {
            printf("Unable to attach to the pid specified\n");
            return;
        }
        wait(NULL);

        char mapsFilename[1024];
        sprintf(mapsFilename, "/proc/%s/maps", argv[1]);
        FILE* pMapsFile = fopen(mapsFilename, "r");
        char memFilename[1024];
        sprintf(memFilename, "/proc/%s/mem", argv[1]);
        FILE* pMemFile = fopen(memFilename, "r");
        int serverSocket = -1;
        if (argc == 4)
        {   
            unsigned int port;
            int count = sscanf(argv[3], "%d", &port);
            if (count == 0)
            {
                printf("Invalid port specified\n");
                return;
            }
            serverSocket = socket(AF_INET, SOCK_STREAM, 0);
            if (serverSocket == -1)
            {
                printf("Could not create socket\n");
                return;
            }
            struct sockaddr_in serverSocketAddress;
            serverSocketAddress.sin_addr.s_addr = inet_addr(argv[2]);
            serverSocketAddress.sin_family = AF_INET;
            serverSocketAddress.sin_port = htons(port);
            if (connect(serverSocket, (struct sockaddr *) &serverSocketAddress, sizeof(serverSocketAddress)) < 0)
            {
                printf("Could not connect to server\n");
                return;
            }
        }
        char line[256];
        while (fgets(line, 256, pMapsFile) != NULL)
        {
            unsigned long start_address;
            unsigned long end_address;
            sscanf(line, "%08lx-%08lx\n", &start_address, &end_address);
            dump_memory_region(pMemFile, start_address, end_address - start_address, serverSocket);
        }
        fclose(pMapsFile);
        fclose(pMemFile);
        if (serverSocket != -1)
        {
            close(serverSocket);
        }

        ptrace(PTRACE_CONT, pid, NULL, NULL);
        ptrace(PTRACE_DETACH, pid, NULL, NULL);
    }
    else
    {
        printf("%s <pid>\n", argv[0]);
        printf("%s <pid> <ip-address> <port>\n", argv[0]);
        exit(0);
    }
}

Per eseguire la cross-compilazione per Android, il tuo Android.mk dovrebbe apparire come segue:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := memdump
LOCAL_SRC_FILES := memdump.c
include $(BUILD_EXECUTABLE)
    
risposta data 27.12.2015 - 15:38
fonte
7

Puoi scaricare le informazioni sulla memoria utilizzando Android Debug Bridge (ADB) usando il seguente comando :

adb shell dumpsys meminfo > mem.txt

Per ottenere informazioni per una particolare app, usa questo:

adb shell dumpsys meminfo 'your apps package name'

Questa risposta fornisce una panoramica dettagliata dello strumento dumpsys . Dai un'occhiata. Inoltre, questo post del blog spiega un altro metodo per scaricare la memoria di un particolare processo in esecuzione (l'ho appena trovato nei risultati di ricerca di Google).

    
risposta data 02.07.2014 - 16:21
fonte
0

Ci sono tecniche per catturare la RAM Android in un file di memoria o scaricare molto come con qualsiasi sistema operativo desktop e analizzare il dump di mem usando una struttura come la volatilità. Per Android è più che probabile che devi eseguire il root del dispositivo . Se hai tempo, questa è un'ottima guida in 2 parti sull'estrazione della memoria Android che inizia qui link

Usando la volatilità puoi estrarre stringhe, vedere il processo in esecuzione ecc ... La fondazione di volatilità ha un ottimo post sul blog qui per identificare le chiavi di crittografia AES per la vera cripta in un dump della memoria. link

Sembra che tu possa utilizzare una metodologia molto simile nel tuo caso d'uso. Spero che questo possa essere di aiuto.

    
risposta data 28.12.2015 - 01:08
fonte
0

Puoi usare GameGuardian per questo. Hai bisogno di root.

Scheda dell'editor di memoria - menu - dump della memoria - seleziona intervallo e cartella - premi ok - attendi il brusco "Dump end".

Ecco alcuni esempi di video su come eseguire questa operazione:

risposta data 25.03.2017 - 05:32
fonte

Leggi altre domande sui tag