Ручная троянизация приложений под windows

Внедрение не во сне, а на яву


Вот и подошли вплотную к внедрению. Создадим бациллу, выводящую простое диалоговое окно перед запуском дрозофилы. Открываем FAR или любой другой редактор и пишем. А что мы, собственно, пишем?

Поскольку это не совсем обычный файл, транслятор должен знать с какого адреса начинать ассемблирование. Мы решили внедряться в дрозофилу со смещения 300h, так? Базовый адрес загрузки равен 1000000h, следовательно, первый байт бациллы соответствует адресу 1000300h. Так и запишем: "ORG1000300h". ORG – это директива, отвечающая за базирование файла.

Еще необходимо указать "USE32", чтобы FASM знал, что это 32-разрядный код. Вот, собственно, и все отличия от нормальных файлов. Дальше можно кодить как обычно. Ах да, чуть было не забыл. Ведь это notepad.exe под Windows NT и, следовательно, ASCII-функций в нем нет, а импортировать их вручную нам лениво. Поскольку, FASM не поддерживает уникода, перекодировку приходится осуществлять самостоятельно. В FAR'е для этого можно набросать следующий макрос: "' Right ' , 0 ," (одинарная кавычка, стрелка влево, одинарная кавычка, запятая, ноль, запятая), который будет преобразовывать ASCII строки в UNICODE. Правда, только на английском языке. Для русского все намного более заморочено. Проще всего взять notepad.exe, записать в нем строку, сохранить, как уникод, и вставить получившийся файл в исходный текст при помощи db.

Законченный текст программы может выглядеть например так:

org    1000300h             ; адрес начала бациллы в памяти

use32                      ; 32-разрядный код

       pushad               ; сохраняем все регистры

       xor eax,eax          ; EAX := 0

       push eax             ; uType

(диалог с кнопкой ОК)

       push caption         ; указатель на заголовок

       push text            ; указатель на текст в окне

       push eax             ; hWnd (нет владельца)



       call dword [1001204h]      ; MessageBoxW

       popad                ; восстанавливаем регистры


       jmp 100299Eh         ; передаем управление WinMain

       ret                  ; возвращаемся в стартовый код

caption db 'h',0,'e',0,'l',0,'l',0,'o',0,0,0

text db 'I',0,' ',0,'l',0,'o',0,'v',0,'e',0,' ',0,'y',0,'o',0,'u',0,0,0

Листинг 3  исходный текст простейшей бациллы, признающийся в любви

Ассемблируем программу FASM'ом и на выходе получаем двоичный файл (для определенности пусть это будет inject.bin). Запускаем HTE, открываем notepad.exe и тут же открываем inject.bin (<F3> (open), "inject.bin). При помощи shift'а выделяем весь код бациллы и ждем <Ctrl-Ins> для копирования в буфер обмена. Переключаемся на notepad.exe (<Alt-2>), находясь в hex-режиме подводим курсор к смещению 300h и нажимаем <Shift-Ins>, чтобы вставить. Сохраняем изменения по <F2> и… открываем пиво. Первый этап внедрения завершен. Теперь можно послушать Burning Point, собраться с мыслями и немного расслабиться.



Рисунок 8 вставка бациллы в дрозофилу

И вот наступает последний решительный этап: перехват управления у WinMain, точка вызова которой, как мы помним, лежит по адресу 1006571h. Переводим HTE в дизассемблерный режим (<F6> (mode), pe/image), жмем <F5> (goto) и говорим: "1006571h". Теперь нажимаем <Ctrl-A> (Assemble) и вводим "CALL 1000300h", где 1000300h — адрес начала бациллы. Кстати говоря, HIEW для этой цели непригоден, поскольку неправильно ассемблирует код и все летит к черту. Во всяком случае, версия 6.09 ведет себя именно так, а более поздние не проверял. Зачем платить деньги за коммерческий HIEW, когда есть и бесплатные HEX-редакторы не хуже!?

HTE все ассемблирует правильно, но переходить к бацилле по перекрестной ссылке наотрез отказывается, считая, что ее нет. Ну нет — и не надо. Нажимаем <F2> (save), чтобы изменения возымели силу и выходим по <F10>.



Рисунок 9 перехват управления у WinMain

C замираем сердца запускам notepad.exe и… Оторвать мыщъх'у хвост это работает, выдавая симпатичное диалоговое окно:



Рисунок 10 сообщения от бациллы


Содержание раздела