Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #51, ФЕВРАЛЬ 2005 г.

Особенности национальной отладки

Крис Касперски ака мыщъх

Спецвыпуск: Хакер, номер #051, стр. 051-096-2


PTrace – фундамент для GDB

GDB – это системно-независимый кросс-платформенный отладчик. Как и большинство *nix-отладчиков, он основан на библиотеке PTrace, которая реализует низкоуровневые отладочные примитивы. Для отладки многопоточных процессов и параллельных приложений рекомендуется использовать дополнительные библиотеки, например, CTrace (http://ctrace.sourceforge.net), а лучше – специализированные отладчики типа Total View (www.etnus.com), поскольку GDB с многопоточностью справляется не самым лучшим образом.

PTrace может: переводить процесс в состояние останова/возобновлять его выполнение, читать/записывать данные из/в адресное пространство отлаживаемого процесса, читать/записывать регистры ЦП. На i386 это – регистры общего назначения, сегментные регистры, регистры "сопроцессора" (включая SSE) и отладочные регистры семейства DRx (они нужны для организации аппаратных точек останова). В Linux еще можно манипулировать служебными структурами отлаживаемого процесса и отслеживать вызов системных функций. В "правильных" *nix-системах этого нет, и недостающую функциональность приходится реализовывать уже в отладчике.

PTrace и ее команды

В user-mode режиме доступна всего лишь одна функция – ptrace ((int _request, pid_t _pid, caddr_t _addr, int _data)), зато она делает все! При желании ты можешь за пару часов написать собственный мини-отладчик, специально заточенный под твою проблему.

Аргумент _request функции ptrace важнейший: он определяет, что мы будем делать. Заголовочные файлы в BSD и Linux используют различные определения, затрудняя перенос ptrace-приложений с одной платформы на другую. По умолчанию мы будем использовать определения из заголовочных файлов BSD.

PT_TRACE_ME (в Linux – PTRACE_TRACEME): переводит текущий процесс в состояние останова. Обычно используется совместно с fork/exec, хотя встречаются так же и самотрассирующиеся приложения. Для каждого из процессов вызов PT_TRACE_ME может быть сделан лишь однажды. Трассировать уже трассируемый процесс не получится (менее значительное следствие – процесс не может трассировать сам себя, сначала он должен расщепиться). На этом основано множество антиотладочных приемов, для преодоления которых приходится использовать отладчики, работающие в обход ptrace. Отлаживаемому процессу посылается сигнал, переводящий его в состояние останова, из которого он может быть выведен командами PT_CONTINUE или PT_STEP, вызванными из контекста родительского процесса. Функция wait задерживает управление материнского процесса до тех пор, пока отлаживаемый процесс не перейдет в состояние останова или не завершиться (тогда она возвращает значение 1407). Остальные аргументы игнорируются.

Назад на стр. 051-096-1  Содержание  Вперед на стр. 051-096-3