Win32 в машинных кодах


Главная функция окна - часть 5


Допустим, два сравниваемых операнда равны. В результате вычитания второго операнда из первого будет установлен флаг нуля (ZF=1). Мы можем составить инструкцию, которая осуществляет переход при этом условии - код условия (ZF=1) 010, n = 0, получаем опкод 01110100 (74h), за которым следует 1 байт смещения. В то же время можно составить противоположную инструкцию - которая не делает перехода при этом условии, а делает его при ZF=0 (т.е. когда операнды не равны); для этого нужно всего лишь установить бит n = 1: 01110101 (75h).

У нас теперь есть необходимый теоретический минимум для модернизации нашего приложения путем добавления в него собственной процедуры окна. Пока она будет просто выводить MessageBox в ответ на сообщение Windows 81h (в самом начале создания окна). Скопируем созданные в прошлый раз файлы в новый рабочий каталог. Чтобы переделок было не слишком много, заменим в файле "rdata.txt" строку "DefWindowProc" на "MessageBoxA", дополнив ее нужным числом нулей (для сохранения длины прежнего названия) - благо что эта функция из того же модуля (User32.dll):

db 0 0 "TranslateMessage" 0 0 db 0 0 "MessageBoxA" 0 0 0 0 0 db 0 0 "RegisterClassExA" 0

Теперь именно ее адрес окажется в поле IAT 40201Ch. В файле "code.txt" найдите и удалите следующие строки:

; скопировать в EAX адрес функции DefWindowProcA ; (из поля IAT(2) с адресом 40201Ch) db a1 1c 20 40 0 ; скопировать адрес функции из EAX ; в поле структуры WNDCLASSEX с адресом 403048h db a3 48 30 40 0

У нас будет своя главная функция окна - копировать адрес импортированной функции не нужно. Саму же процедуру окна разместим в конце секции кода (чтобы узнать адрес процедуры, удобно использовать предварительный "черновой" проход в режиме ассемблирования). Итак, составляем функцию, добавляя код в конце файла code.txt после вызова ExitProcess:

; вызов ExitProcess (по адресу в IAT(1) 402004h) db ff 15 4 20 40 0 ;----------------------------------------------- ; Процедура окна




Начало  Назад  Вперед



Книжный магазин