По просьбам трудящихся, и для новичков любимого форума 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.
Удачной вам отладки.
Файлы к статье
Подписаться на:
Комментарии к сообщению (Atom)
Ну наконец-то, буду держать ссылку на этот пост и отпинывааться от вопросов )))
ОтветитьУдалитьТеперь уже вопрос от меня,может опишешь в другой заметке ;)
Разрабатываю честный, не рукткит, драйвер. Также разрабатываю приложение пашущее с ним в связке,гружу его через OpenSCManager и если в XP все ок, то в Win 7 x64 пиздос. Начинает задалбывать UAC-промпт. Как собственно его победить?
Можно конечно все настроить у себя, но меня интерисует как это по уму делается?! Ведь другие системные тулзы к примеру KIS 2010 нормально пашед с UAC и этот промпт появляется только во время запуска exe-шника, а дальше не появляется! Неужто хакают? ;)
Может быть вам не хватает манифеста?
ОтветитьУдалитьhttp://www.heaventools.com/rt-how-to-add-trustinfo-statement-for-vista-application.htm
?
Файлы к статье удалены.
ОтветитьУдалитьПерезалейте, пожалуйста.
Или скиньте на емайл.
Исправил. Дурацкий хостинг на rghost - 30 дней максимум хранит файл.
ОтветитьУдалитьА как на счет отладки инжекта длл, загружаемой не с диска а из памяти ? ;)
ОтветитьУдалитьОтлаживайте вначале с диска. То есть длл должна работать сама по себе. Потом добиваемся правильной загрузки из памяти и все. Надо все решать постепенно.
ОтветитьУдалить>>Может быть вам не хватает манифеста?
ОтветитьУдалитьЭто всего-лишь способ сказать сис.загрузчику о том, что он должен потребовать у юзера элевацию прав!
А в том-то и замут, что когда пишешь консольную тулзу для системных нужд, то тебе не редко требуется чтото на творить, что в терминах Висты требует элевации прав! Хорошо если ты разок запустил и ладно, а если ты свою тулзу в батник закинул? Тогда кроме как отключение UAC ничего не поможет, но это самое простое, надо уже учиться и с ним дружить )
И все равно я не вижу проблемы :-). Решения есть. Вы его назвали.
ОтветитьУдалить