Можете ли вы обнаружить отладчик, подключенный к вашему процессу, используя Div by Zero - PullRequest
9 голосов
/ 20 января 2012

Можете ли вы определить, подключен ли отладчик к вашему собственному процессу Windows, с помощью высокоточного таймера, определяющего время, необходимое для деления целого числа на ноль?

Обоснование заключается в том, что при отсутствии отладчикаподключен, вы получаете серьезную ошибку, которая обрабатывается аппаратно и очень быстро.Если отладчик подключен, вы вместо этого получаете мягкую ошибку, которая просачивается в ОС и, в конечном итоге, в отладчик.Это относительно медленно.

Ответы [ 3 ]

4 голосов
/ 20 января 2012

Поскольку вы абсолютно ничего не можете сделать, чтобы помешать решительному человеку пересмотреть ваш код, ни один умный подход, который вы найдете, не будет значительно лучше, чем вызов IsDebuggerPresent()

3 голосов
/ 20 января 2012

Нет. Достаточно решительный злоумышленник просто разместит ваш процесс на виртуальной машине и сломается таким образом.

Кроме того, вам не нужно подключать отладчик для атаки на программу: захват минидампа позволит злоумышленнику проверить состояние памяти в автономном режиме, или с помощью Process Explorer вы можете проверить открытые дескрипторы, чтобы определить файлы уязвимы.

Если бы вы собирались использовать исключение, чтобы определить, был ли присоединен наивный отладчик, я бы лично использовал INT_MIN/-1, чтобы вызвать исключение целочисленного переполнения. Большинство не знают об этом.

2 голосов
/ 20 января 2012

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

это большепродуктивно, чтобы в первую очередь предотвратить присоединение отладчика, но в долгосрочной перспективе вы никогда не выйдете вперед, если не сделаете необходимые инвестиции неосуществимыми.

...