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.

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

8 комментариев:

  1. Ну наконец-то, буду держать ссылку на этот пост и отпинывааться от вопросов )))

    Теперь уже вопрос от меня,может опишешь в другой заметке ;)

    Разрабатываю честный, не рукткит, драйвер. Также разрабатываю приложение пашущее с ним в связке,гружу его через OpenSCManager и если в XP все ок, то в Win 7 x64 пиздос. Начинает задалбывать UAC-промпт. Как собственно его победить?

    Можно конечно все настроить у себя, но меня интерисует как это по уму делается?! Ведь другие системные тулзы к примеру KIS 2010 нормально пашед с UAC и этот промпт появляется только во время запуска exe-шника, а дальше не появляется! Неужто хакают? ;)

    ОтветитьУдалить
  2. Может быть вам не хватает манифеста?
    http://www.heaventools.com/rt-how-to-add-trustinfo-statement-for-vista-application.htm
    ?

    ОтветитьУдалить
  3. Файлы к статье удалены.
    Перезалейте, пожалуйста.
    Или скиньте на емайл.

    ОтветитьУдалить
  4. Исправил. Дурацкий хостинг на rghost - 30 дней максимум хранит файл.

    ОтветитьУдалить
  5. А как на счет отладки инжекта длл, загружаемой не с диска а из памяти ? ;)

    ОтветитьУдалить
  6. Отлаживайте вначале с диска. То есть длл должна работать сама по себе. Потом добиваемся правильной загрузки из памяти и все. Надо все решать постепенно.

    ОтветитьУдалить
  7. >>Может быть вам не хватает манифеста?
    Это всего-лишь способ сказать сис.загрузчику о том, что он должен потребовать у юзера элевацию прав!
    А в том-то и замут, что когда пишешь консольную тулзу для системных нужд, то тебе не редко требуется чтото на творить, что в терминах Висты требует элевации прав! Хорошо если ты разок запустил и ладно, а если ты свою тулзу в батник закинул? Тогда кроме как отключение UAC ничего не поможет, но это самое простое, надо уже учиться и с ним дружить )

    ОтветитьУдалить
  8. И все равно я не вижу проблемы :-). Решения есть. Вы его назвали.

    ОтветитьУдалить