Вопрос: Сбросьте память процесса linux в файл


Можно ли сбросить текущую память, выделенную для процесса (по PID), в файл? Или что-то прочитал?


46
2017-08-24 17:44


Источник


Вы можете использовать мой сценарий доказательной концепции который читает /proc/$pid/mem, - Gilles
Вы также можете прочитать superuser.com/questions/236390/... и вместо этого используйте gcore. - Simon A. Eugster


Ответы:


Я не уверен, как вы удаляете всю память в файл, не делая этого повторно (если кто-то знает автоматизированный способ получить gdb для этого, дайте мне знать), но следующее работает для любой одной партии памяти, если вы знаете pid:

$ cat /proc/[pid]/maps

Это будет в формате (пример):

00400000-00421000 r-xp 00000000 08:01 592398                             /usr/libexec/dovecot/pop3-login
00621000-00622000 rw-p 00021000 08:01 592398                             /usr/libexec/dovecot/pop3-login
00622000-0066a000 rw-p 00622000 00:00 0                                  [heap]
3e73200000-3e7321c000 r-xp 00000000 08:01 229378                         /lib64/ld-2.5.so
3e7341b000-3e7341c000 r--p 0001b000 08:01 229378                         /lib64/ld-2.5.so

Выберите одну партию памяти (например, 00621000-00622000), затем используйте gdb как root для присоединения к процессу и сбрасывайте эту память:

$ gdb --pid [pid]
(gdb) dump memory /root/output 0x00621000 0x00622000

Затем проанализируйте / root / output с помощью команды strings, и вы хотите, чтобы PuTTY находился по всему экрану.


37
2017-08-24 18:39



Есть ли способ сделать это только в bash / sh без gdb? - Programming4life
@ Programming4life gcore (1) - SYS_V


Я выполнил сценарий, который выполняет эту задачу.

Идея исходит из ответа Джеймса Лори и этого поста: http://www.linuxforums.org/forum/programming-scripting/52375-reading-memory-other-processes.html#post287195

#!/bin/bash

grep rw-p /proc/$1/maps | sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/\1 \2/p' | while read start stop; do gdb --batch --pid $1 -ex "dump memory $1-$start-$stop.dump 0x$start 0x$stop"; done

поместите это в файл (например, «dump-all-memory-of-pid.sh») и сделайте его исполняемым

Применение: ./dump-all-memory-of-pid.sh [pid]

Вывод печатается в файлы с именами: pid-startaddress-stopaddress.dump

зависимости: gdb


40
2017-07-18 17:38



Потрясающие! Просто использовал его, чтобы узнать, в каком сценарии запущен таинственный экземпляр bash. - Tobia


пытаться

    gcore $pid

где $pid - фактическое число pid; для получения дополнительной информации см .: info gcore

может потребоваться некоторое время, чтобы дамп произошел, и некоторая память может быть недоступна для чтения, но достаточно хороша ... помните также, что она может создавать большие файлы, я просто создал файл размером 2 ГБ таким образом.


33
2018-03-09 19:06



Является gcore сбросить разреженный файл? - CMCDragonkai


человек говорит:

/ Proc / [PID] / MEM                 Этот файл можно использовать для доступа к страницам процесса   память через открытый (2), читать (2) и lseek (2).

Может быть, это может помочь вам


3
2017-08-24 17:58



Этого недостаточно, для чтения другого процесса требуется комбинация / proc / <pid> / {mem, * maps}, ptrace и некоторая обработка сигналов, чтобы избежать зависания целевого процесса. - Tobu
@Tobu В самом деле, Я написал сценарий доказательной концепции, - Gilles


Я сделал свою собственную программу, чтобы свалить всю память процесса, а также на C, поэтому ее можно скомпилировать на Android, и это то, что мне нужно.

Вы также можете указать IP-адрес и порт tcp. Исходный код Вот,


2
2017-12-27 14:55





Инструмент для вывода процесса на стандартный вывод, pcat / memdump:


1
2018-02-04 21:27



Это устарело (удалено по запросу сопровождающего); В любом случае, я установил старый пакет, и ему не удалось «Ошибка ввода / вывода, вы использовали GCC с файлами заголовков другого компьютера?». - Tobu


Теперь вы можете использовать procdump из пакета SysInternals в Linux:

https://github.com/Microsoft/ProcDump-for-Linux 


0
2017-12-07 07:09