Вот и подошли вплотную к внедрению. Создадим бациллу, выводящую простое диалоговое окно перед запуском дрозофилы. Открываем 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 ; восстанавливаем регистры