Определить, используется ли отладчик во время выполнения

Я хочу разработать безопасное приложение, и в качестве меры по снижению безопасности я хотел бы иметь возможность узнать, используется ли отладчик (GDB, LLDB...) в текущем запущенном приложении; прерывание в случае обнаружения.

Как я могу обнаружить мониторинг статически связанного приложения C?

  • Пройдитесь по дереву /proc
  • ...

person Ben Crowhurst    schedule 07.10.2020    source источник
comment
FWIW, вы остановите только людей, которые не знают, что они делают. Когда вы даете кому-то что-то для запуска на своем компьютере, они БУДУТ точно понимать, что делает ваш код. Это их ядро, их библиотеки и их железо. Вы можете сделать это сложнее, но вы не можете остановить это.   -  person Andrew Henle    schedule 07.10.2020
comment
Программе математически невозможно определить, работает ли она внутри идеальной эмуляции, отладчика или нет. То, что вы хотите, невозможно.   -  person 12431234123412341234123    schedule 07.10.2020
comment
Усложнение отладки программы не повышает безопасность, верно как раз обратное. Чем сложнее отлаживать, тем меньше вероятность того, что вы поймаете уязвимости в системе безопасности. Я бы порекомендовал вам изучить некоторые основы, прежде чем разрабатывать приложение, чувствительное к безопасности.   -  person 12431234123412341234123    schedule 07.10.2020
comment
Безопасность зависит от уровней, очень трудно остановить целеустремленного человека, но это само по себе не является оправданием для отсутствия каких-либо ограничений. Очень возможно определить, был ли процесс разветвлен отладчиком, и в этом случае закрыть приложение ... это уровень защиты, временная мера, а не лекарство.   -  person Ben Crowhurst    schedule 08.10.2020
comment
@BenCrowhurst Нет, это невозможно. Отладчик может сообщить вашему программному обеспечению все, что угодно, и программное обеспечение не сможет определить, является ли это подделкой или нет. Это не просто сложно, это невозможно. Попытка запретить владельцу делать что-либо с вашим программным обеспечением невозможна. Кажется, вы пытаетесь реализовать безопасность с помощью неизвестности. Пожалуйста, прекратите то, что вы пытаетесь сделать. Вы не понимаете, что делаете.   -  person 12431234123412341234123    schedule 08.10.2020
comment
и все же... stackoverflow. ком/вопросы/573115/   -  person Ben Crowhurst    schedule 08.10.2020
comment
и еще... reverseengineering.stackexchange .com/questions/43/   -  person Ben Crowhurst    schedule 08.10.2020
comment
@BenCrowhurst Как вы можете прочитать в связанном вопросе, все методы, которые я нашел в Интернете, можно было легко обойти, как только была понята техника защиты от отладки. Это относится ко всем возможным способам обнаружения отладчика. Опять же, это невозможно. Это все равно, что пытаться определить квадратный корень из 2 как дробь.   -  person 12431234123412341234123    schedule 12.10.2020
comment
@ 12431234123412341234123 Я ценю ваш страстный ответ, и я ищу не полностью защищенный подход, а дополнительные уровни для борьбы с неправильным использованием потенциала, см. Мой предыдущий комментарий сам по себе не повод не иметь никаких ограничений...   -  person Ben Crowhurst    schedule 12.10.2020


Ответы (3)


Просто сумасшедшая идея - загрузить программу BPF (при условии, что ваш двоичный файл имеет возможность сделать это), чтобы перехватить системный вызов ptrace от родительского процесса, и проверить, соответствует ли pid отслеживаемого процесса pid вашего процесса, тогда вы можете либо сбой системного вызова, предотвращая отладка, а также отправка и событие в пространство пользователя, чтобы остановить ваш процесс.

Хотя это не сработает для подключенного процесса, поэтому вам нужно будет перехватывать ptrace из всех процессов, я не уверен, что BPF это позволяет, не помню.

person qrdl    schedule 07.10.2020
comment
Хороший ход мыслей, буду копаться. - person Ben Crowhurst; 07.10.2020
comment
А как сделать так, чтобы дочерний процесс не подменялся отладчиком и когда дочерний вызывает pid() отладчик перехватывает вызов и возвращает свой pid? Вы пытаетесь решить математически неразрешимую задачу. - person 12431234123412341234123; 07.10.2020
comment
@ 12431234123412341234123 Стандартный отладчик, такой как gdb, этого не сделает. - person qrdl; 07.10.2020
comment
@qrdl Вы можете перехватывать вызовы с помощью GDB и изменять переменные, а также вы можете изменять двоичный файл с помощью GDB и заменять функции, чтобы вы могли заставить это работать в GDB. - person 12431234123412341234123; 07.10.2020

Еще одна сумасшедшая идея - трассировщик ожидает SIGTRAPs от tracee на каждой точке останова/шаге, так что вы можете поймать этот сигнал из вашего процесса, опять же используя BPF, и что-то с этим сделать. Но опять же это основано на предположении, что трассировщик об этом не знает.

person qrdl    schedule 07.10.2020

Вы не можете. Программное обеспечение не может определить, работает ли оно в идеальной эмуляции или в реальном мире. И эмулятор можно остановить, программу можно проанализировать, переменные можно изменить, в общем можно сделать все, что можно сделать в отладчике.

Допустим, вы хотите определить, является ли родительский процесс отладчиком. Итак, вы делаете системный вызов, чтобы получить родительский PID? Отладчик может перехватить системный вызов и вернуть любой PID, который не обязательно должен быть реальным PID. Вы хотите перехватывать каждый SIGTRAP, чтобы отладчик больше не мог его использовать? Что ж, в этом случае отладчик может просто остановиться и отправить SIGTRAP также вашему процессу. Вы хотите измерить время, когда вы отправляете SIGTRAP, чтобы знать, останавливается ли процесс на короткое время отладчиком для отправки SIGTRAP, чтобы вы знали, когда есть отладчик? Отладчик может заменить ваши вызовы, чтобы получить время и вернуть поддельное время. Допустим, вы работаете на процессоре, у которого есть инструкция, возвращающая время, поэтому для получения времени не требуется вызов функции. Теперь вы можете знать, что время, которое вы получаете, реально? Нет, отладчик может заменить эту инструкцию инструкцией SIGTRAP и вернуться в любое время, когда он захочет, или, если такой инструкции не существует, запустить Программу в эмуляторе, который можно запрограммировать любым способом. Все, что вы можете придумать для обнаружения отладчика или эмулятора, может быть сфальсифицировано средой, и у вас нет никаких изменений для его обнаружения.

Единственный способ остановить отладку — не давать программное обеспечение клиентам, а держать его в своих руках. Создайте облачный сервис и запустите программное обеспечение на своем сервере. В этом случае заказчик не может отлаживать вашу программу, так как он ее не запускает и не контролирует. За исключением того, что клиент может каким-то образом получить доступ к серверу или данным, но это уже другая история.

person 12431234123412341234123    schedule 08.10.2020