Несетевая защита Крис Касперски ака мыщъх Спецвыпуск: Хакер, номер #051, стр. 051-100-7 Функцию Ptrace нельзя вызывать дважды – попытка трассировки уже трассируемого процесса порождает ошибку. Это не ограничение библиотеки Ptrace – это ограничение большинства процессорных архитектур (хотя на x86-процессорах и можно развернуться). Отсюда идея – делаем Fork расщепляя процесс на два и трассируем самого себя. Родителю достается PT_ATTACH (он же PTTRACE_ATTACH), а потомку – PT_TRACE_ME (он же PTTRACE_TRACE_ME). Чтобы хакер не прибил Ptrace, в ходе трассировки рекомендуется сделать что-нибудь полезное (например, динамически расшифровать код), и тогда отладка такой программы будет возможна лишь на эмуляторе. Простейший пример реализации может выглядеть, например, так: Cамотрассирующаяся программа int main() { pid_t child; int status; switch((child = fork())) { case 0: // потомок ptrace(PTRACE_TRACEME); // секретная часть exit(1); case -1: // ошибка perror("fork"); exit(1); default: // родитель if (ptrace(PTRACE_ATTACH, child)) { kill(child, SIGKILL); exit(2); } while (waitpid(child, &status, 0) != -1) ptrace(PTRACE_CONT, child, 0, 0); exit(0); } return 0; } Прямой поиск отладчика в памяти Любой отладчик прикладного уровня может быть обнаружен тривиальным просмотром содержимого /proc. Хороший результат дает поиск по сигнатурам – текстовым строкам копирайтов конкретных отладчиков. Чтобы быть уверенным, что отлаживают именно нас, а не кого-то еще, можно сравнить идентификатор процесса отладчика (он совпадает с именем соответствующей директории в /proc) с идентификатором материнского процесса (его можно получить с помощью Getppid), однако если отладчик сделает Attach на активный процесс, это не сработает. Лучше не заметить отладчик, чем реагировать на отладку посторонних процессов. Измерение времени выполнения Отладчики прикладного уровня не "замораживают" часы в процессе трассировки, и поэтому измерение отрезка времени между двумя соседними участками программы позволяет обнаружить как отладку, так и шпионаж за системными функциями посредством truss\ktrace. Всякая защита лишь отодвигает взлом, но отнюдь не исключает его возможность. Все-таки начиная с некоторого уровня сложности взломов это занятие становится нерентабельным, и единственным стимулом хакерского труда остается спортивный интерес, вызванный природным любопытством и желанием покопаться в интересной программе. Не стремись к элегантности! Используй тошнотворный стиль кодирования, вызывающий у хакера отвращение хуже, чем от горькой редьки. Тогда шансы на выживание у твоей программы значительно возрастут, и долгое время она будет оставаться невзломанной. С точки зрения хакера ПО *nix-системы – не очень интересное место. В *nix-системах содержимое памяти каждого из процессоров представлено в виде набора файлов, расположенных в каталоге /proc. Большинство антиотладочных приемов по своей природе системно-зависимы и препятствуют переносу защищенной программы на другие платформы. Функцию ptrace нельзя вызывать дважды – попытка трассировки уже трассируемого процесса порождает ошибку. Программные точки останова (машинная команда INT 03h с опкодом CCh) распознаются обычным подсчетом контрольной суммы собственного кода программы. |