Описание тега abet
Следующий быстрый-и-грязный скрипт на Python, дампы памяти процесса в stdout. Это имеет побочный эффект загружать любые выгружена страница или файл, сопоставленный. Называйте это как cat_proc_mem 123 456 789
, где аргументы являются идентификаторами процесса.
Этот сценарий является абсолютно специфичным для Linux. Это могут быть адаптированы для других систем с аналогичным в/proc
структуры (Солярис?), но забывать о его, например, на *БСД. Даже на Linux, вам может потребоваться изменить определение c_pid_t
и значения PTRACE_ATTACH
и PTRACE_DETACH
. Это доказательство принципа скрипт, не предназначены в качестве примера хорошей практики программирования. Используйте на свой страх и риск.
Linux делает памяти процесса доступен как в/proc/$PID в/мэм
. Читаются только определенные диапазоны адресов. Эти диапазоны могут быть найдены путем считывания памяти отображения информации из текстового файла в/proc/$PID в/карты
. Псевдо-файл в/proc/$PID в/мэм
не может быть прочитан всеми процессами, которые имеют права на чтение: читатель процесс должен был позвонить в ptrace(PTRACE_ATTACH, $пид)
.
#!/usr/Бен/ОКР питона
импорт под, пере, Сыс
## Частичный интерфейс вызова ptrace(2), только для PTRACE_ATTACH и PTRACE_DETACH.
c_ptrace = под.CDLL("библиотеки libc.так.6").в ptrace
c_pid_t = под.c_int32 # это предполагает pid_t это int32_t
c_ptrace.argtypes = [под.c_int, c_pid_t, под.c_void_p, под.c_void_p]
деф в ptrace(прикрепить, пид):
ОП = под.c_int(16 если присоединить еще 17) #PTRACE_ATTACH или PTRACE_DETACH
c_pid = c_pid_t(пид)
нуль = под.c_void_p()
подстраховаться = c_ptrace(ОП, c_pid, нуль, нуль)
если индикатор ERR != 0: поднять SysError, 'в ptrace', подстраховаться
## Распарсить строку в /proc/$PID в/карты. Вернуть границы чанка
## читать характер разрешения.
деф maps_line_range(линии):
м = ре.матч(Р'([0-9А-ФА-ф]+)-([0-9А-ФА-Ф]+) ([-Р])', строка)
возвращение [инт(м. группы(1), 16), инт(м. группа(2), 16), м.группа(3)]
## Дамп читается куски памяти процессом
деф cat_proc_mem(пид):
## Видимо нужно в ptrace(PTRACE_ATTACH, $PID) для чтение файла /proc/$PID в/мэм
в ptrace(правда, инт(пид))
## Чтения памяти карты, чтобы увидеть, что диапазоны адресов чтения
maps_file = открыть("/proc и/" + пид + "/ "карты"", 'Р')
диапазоны = карте(maps_line_range, maps_file.readlines())
maps_file.закрыть()
## Читать четкий сопоставлены диапазоны
mem_file = открыть("/proc и/" + пид + "/ "мэм"", 'Р', 0)
для R в диапазонах:
если R[2] == 'р':
mem_file.искать(Р[0])
чанк = mem_file.чтение(r[1] - Р[0])
кусок печати,
mem_file.закрыть()
## Очистка
в ptrace(ложь, инт(пид))
если __имя__ == "__основной__":
для пид в sys.аргумент argv[1:]:
cat_proc_mem(пид)
См. также более подробную информацию о в/proc/$PID в/мэм
.
unswap () {
cat_proc_mem "$@" >/dev/нуль
}