ptrace: получить базу изображений трассировки?

У меня Ubuntu 13.10, и у меня есть этот небольшой раздетый + упакованный файл эльфа. Мне нужно автоматически выгрузить различные фрагменты информации из его процесса, поэтому я собрал крошечный трассировщик, который отслеживает мой прогресс, похожий на strace. Возникло три вопроса:

1) после подключения к моему процессу, как я могу получить его базу изображений?

2) где процесс прерывается первым? Судя по всему, это не EP программы.

3) каким-либо образом я могу быть уведомлен о загрузке файла .so/.lib? Я думаю, что GDB как-то может это сделать.

Первый вопрос действительно самый важный. Любая помощь приветствуется.


person bernd feinman    schedule 14.11.2013    source источник
comment
Я не знаю точно, но я считаю, что вы должны сами найти ответ на вопрос (1), проанализировав исполняемый образ процесса. И программа сломается только там, где вы скажете ей сломаться (используя либо PTRACE_SETREGSET, либо PTRACE_POKEUSER, в зависимости от ОС и ЦП, чтобы установить регистры управления отладкой для установки аппаратной точки останова, или PTRACE_POKETEXT для ввода инструкции точки останова). ptrace — это очень чистый API-интерфейс — он очень мало для вас делает, и вы должны знать аппаратное обеспечение и ABI от и до, чтобы эффективно использовать его.   -  person zwol    schedule 14.11.2013
comment
как мне разобрать исполняемый процесс?   -  person bernd feinman    schedule 14.11.2013
comment
Изучите клевету.   -  person zwol    schedule 14.11.2013
comment
я могу это сделать, но это не даст мне текущую базу изображений для процесса, которая не обязательно совпадает с базой по умолчанию из файла (ASLR).   -  person bernd feinman    schedule 14.11.2013


Ответы (1)


1) /proc/<PID>/maps содержит список всего, что отображено процессом и откуда, включая страницы, отображенные из исполняемого файла. Читая исполняемые заголовки ELF, вы сможете понять, где находится .text.

2) Выполнение динамически подключаемого бинарного файла обычно начинается с интерпретатора. Заголовок программы INTERP в исполняемом файле ELF (дамп с readelf -e) будет иметь свое имя. Это точка входа интерпретатора, с которой начинается выполнение. Обычно это компоновщик среды выполнения ld-<some-variant>.so. Он отображается в разделах исполняемого файла, а также может отображать необходимые общие библиотеки.

3) GDB довольно подробно знает, как реализован компоновщик времени выполнения, поэтому он может перехватывать загрузку динамических объектов, устанавливая точки останова в нужных местах. Вы можете сделать то же самое. dlopen() кажется хорошим кандидатом на роль точки перехвата. Как я отметил в № 2, общие объекты могут быть предварительно загружены до того, как исполняемый файл получит управление.

person ArtemB    schedule 14.11.2013
comment
1) сейчас посмотрю. Однако я бы, по сути, анализировал text, чтобы найти базу изображений. Не чувствует себя чистым. Но спасибо, я сейчас все проверю. - person bernd feinman; 15.11.2013