20100611

Практика отладки инжектов через WinDbg

По просьбам трудящихся, и для новичков любимого форума WASM.RU посвящается.

В данной статье будет рассмотрен прием отладки кода DLL в уже запущенном целевом процессе. Будет показано, как отлаживать инжект имея исходные коды DLL приложения. Вам понадобится заготовка DLL модуля,  среда разработки Microsoft Visual Studio (рекомендую 2003 и выше), и отладчик WinDbg. Предполагается, что читатель уже умеет настраивать проект на сборку DLL, и знает как пишутся DLL модули. Исходник модуля DLL можно взять по ссылке в конце статьи. Так же прилагаю загрузчик (тоже с исходником) инжектирующий DLL в адресное пространство процесса. Загрузчик простой, для тех, кому лень читать и писать что-либо дополнительного.

Настройте среду разработки на генерацию Debug версии DLL, в компиляторе поставьте опцию /MTd (Runtime Library - Multithread debug). Когда будет собран, модуль, без ошибок, можете приступать к чтению следующей части статьи.
Запускаем целевой процесс. Для этих целей можно использовать calc.exe. Далее запускаем WinDbg. Заходим в меню  File->Attach to Process (или просто жмем F6). Выбираем в списке calc.exe. Запоминаем ID процесса.
Далее приводится снимок экрана выбора процесса в WinDBG:

После выбора процесса, не забудем запустить его (нажимаем F5), так как после присоединения отладчика, процесс останавливается (как обычно в ntdll -> DbgBreakPoint).
У вас должно получиться следующее:

Воспользуемся загрузчиком. Загрузчик консольный, требует два параметра. Первый – ID процесса, второй – полный путь к DLL, которую будем отлаживать. Можно конечно обойтись без полного пути, если DLL лежит в системном каталоге (%WINDIR%\system32).
Запускаем:  LoaderDll.exe 7036 D:\DLLForInj.dll
Если процесс завершился без ошибок – значит DLL внедрилась успешно. Если же ошибок нет, а DLL все еще не внедрилась в процесс – то это говорит о том, что проблема с путем или именем DLL модуля. Заглянем в отладчик. Вы должны были заметить, что в исходнике есть инструкция int 3. Она позволит остановиться отладчику на нужном нам месте. Если DLL все таки загрузилась (бинго?), отладчик примет следующий вид:

Дальше можете шагать по комндам по F8 или F10 в зависимости от того, нужно ли входить вам в процедуру.
Важный момент, если вдруг у вас не появилось окна с исходным кодом, попробуйте прописать путь к символам и к исходнику. Для установки путей к символам, необходимо зайти в File->Symbol File Path (либо нажать Ctrl-S). Не забываем включить чекбокс “Reload”. Чтобы символы перезагрузились в рантайме. Чтобы установить путь к исходникам, необходимо зайти в File->Source File Path (либо нажать Ctrl-P). Если вам и это не помогает (карма?), тогда просто попробуйте открыть исходник в ручную File-Open Source File (либо нажать Ctrl-O).
Конечно, “маловато будет” ©, но я надеюсь, что данный материал будет полезен, и подтолкет новичков к более глубокому изучению такого прекрасного инструмента как WinDbg.

Удачной вам отладки.
Файлы к статье