Linux ptrace() прочитать всю страницу памяти

Здравствуйте, я пытаюсь сбросить память процесса в Android/Linux. Прямо сейчас я читаю карты памяти, чтобы получить адресное пространство области памяти, а затем я читаю каждое слово следующим образом:

ptrace(PTRACE_ATTACH, pid, NULL, NULL);
wait(NULL);

read each word in this memory region:
word = ptrace(PTRACE_PEEKDATA, pid, (void *)address, NULL);

ptrace(PTRACE_CONT, pid, NULL, NULL);
ptrace(PTRACE_DETACH, pid, NULL, NULL);

Нет ли более эффективного решения, читающего напрямую всю страницу памяти, указав начало/конец адресного пространства памяти для чтения?


person micha    schedule 23.12.2015    source источник
comment
Чего именно вы пытаетесь достичь? Полный дамп процесса можно сделать, прочитав файл /proc/pid/mem   -  person Mats Petersson    schedule 23.12.2015
comment
Мне нужен дамп всех доступных для записи страниц памяти. Теперь я получил дамп кучи, используя open, lseek и read. Но когда я пытаюсь получить доступ к другим областям памяти, таким как стек, я все равно получаю ошибку ввода-вывода.   -  person micha    schedule 29.12.2015


Ответы (1)


Есть два возможных способа более эффективного чтения памяти из другого процесса.

Если ваше ядро ​​поддерживает это (я понятия не имею о ядрах Android), вы можете использовать process_vm_readv.

Другой способ — открыть файл /proc/.../mem целевого процесса и прочитать его. gdb использует этот метод, хотя я думаю только потому, что process_vm_readv является "новым" (в терминах gdb).

person Tom Tromey    schedule 23.12.2015
comment
process_vm_readv недоступен в Android -› приводит к ошибке: неопределенная ссылка на 'process_vm_readv' Но спасибо за ваш совет, теперь мне удалось прочитать кучу из / proc/pid/mem с помощью open, lseek и read. - person micha; 29.12.2015