Написание очень простого отладчика - PullRequest
6 голосов
/ 12 июня 2009

Можно ли написать программу под окнами, которая приведет к разрыву потока удаленного процесса (остановке выполнения в этом потоке) при достижении предварительно определенного адреса?

Я экспериментировал с Windows Debug API, но он кажется очень ограниченным, когда дело касается установки точек останова. Функция DebugBreakProcess показалась многообещающей, но я не могу найти примеров того, как использовать этот вызов API.

Ответы [ 2 ]

12 голосов
/ 12 июня 2009

Вам нужно использовать WriteProcessMemory для записи точки останова (на x86, код операции 0xCC) по адресу. На x86, когда отладчик достигает этой точки в коде, 0xCC сгенерирует исключение int 3. Это подхватывается вашим отладчиком WaitForDebugEvent вернет DEBUG_EVENT с установленным EXCEPTION_DEBUG_EVENT.

Затем вам нужно исправить этот адрес обратно в исходный код, прежде чем продолжить. Если вы хотите снова разорвать соединение, вам нужно выполнить один шаг, а затем повторно ввести код операции точки останова. Для одиночного шага необходимо установить флаг одиночного шага в EFlag в контексте потока.

DebugBreakProcess используется для создания удаленного прерывания процесса, который вы отлаживаете - его нельзя использовать для прерывания в произвольной точке кода.

1 голос
/ 12 июня 2009

Майкл прав - также, если вы хотите разорвать произвольный процесс в отладчике после того, как вы подключили его (т. Е. Если пользователь неожиданно нажал «Break on process»), стандартным способом является создание удаленный поток, чья процедура выдает int3.

...