Как работает отладчик PyDbg?

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

Отладчик, как известно, — разновидность подпрограммы обработки прерывания, которая приостанавливает работу выполняемого процесса. Когда отладчик завершает свою работу, возобновляется логика процесса. Отладчик устанавливает точку останова в инструкции, которую программист хочет отладить, и периодически проверяет, не наступило ли событие отладки. Событие отладки — это особая ситуация в отлаживаемом процессе, который заставляет операционную систему уведомлять отладчик. События отладки включают: создание процесса, создание потока, загрузку динамически подключаемой библиотеки (DLL), выгрузку DLL, отправку символьной строки вывода данных и генерацию исключительной ситуации. Если во время обработки инструкции система обнаруживает точку останова, она запускает функцию обратного вызова, определенную программистом.

Механизм работы PyDbg

1. Получение идентификатора процесса

Каждый процесс имеет свой собственный идентификатор (PID, ID процесса), назначаемый операционной системой. Для получения PID можно использовать Win32 API.

2. Получение адреса инструкции

Проверяются все списки модулей, которые отображены в адресное пространство процесса, чтобы получить адрес функции и попытаться установить точку останова.

3. Установка точки останова

Устанавливается точка останова путем замены первых двух байтов кода инструкции на CC. Отладчик сохраняет исходный код команды в списке точек останова, который управляется внутренним механизмом. Таким образом, можно легко возвратиться к исходному процессу.

4. Регистрация функции обратного вызова

Когда процесс выполняет инструкцию, установленную точкой останова, наступает событие отладки. Затем операционная система генерирует прерывание и начинает выполнение подпрограммы обработки прерывания — предварительно зарегистрированной функции обратного вызова.

5. Ожидание события отладки

Win32 API используется отладчиком для ожидания возникновения события отладки, по факту наступления которого происходит запуск функции обратного вызова. Ожидание события отладки выполняется бесконечно.

6. Наступление события отладки

Когда процесс отладки находит точку останова во время выполнения, генерируется прерывание.

7. Выполнение функции обратного вызова

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

8. Возврат к исходному процессу

По мере завершения работы функции обратного вызова программа возвращается к обычному потоку процесса.

В заключение

Пытаться использовать PyDbg, не имея представления о его работе, по меньшей мере некультурно, поэтому в статье предпринята попытка кратко описать основы механизма его работы. Материал может быть полезен для изучения реверс-инжиниринга с использованием Python.