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


Сообщения Windows - часть 5


; возврат на "цикл" (-19 байтов) db eb ed

m 0 l 200 100 w q

В файле 'header.txt' необходимо изменить лишь смещение таблицы импорта:

; Второй элемент каталога: ; смещение таблицы импорта (4 байта) db 40 20 0 0

Размер таблицы остался тем же. Файл 'make.bat' также остался без изменений. Строим новый файл wnd.exe и запускаем его.

Отличий у данного приложения по сравнению с предыдущим немного - оно также не перемещается, не изменяет размеров и не отвечает на попытки закрыть окно. Тем не менее, одно отличие все же есть: обратите внимание на форму указателя мыши в пределах окна. Он больше не принимает ждущей формы - сообщения забираются из очереди. Но они лишь копируются в одно и то же место и никак не обрабатываются.

Чтобы от сообщений был какой-то толк, их нужно не просто забирать из очереди, но и направлять соответствующему окну. Для этой цели служит еще одна функция из модуля User32.dll - DispatchMessageA. Эта функция принимает лишь один аргумент - адрес структуры MSG, содержащей соответствующее сообщение. Добавим в наше приложение эту функцию.

В секции данных никаких изменений не будет. В секцию .rdata нужно добавить после имеющихся строк строку 'DispatchMessageA', а также указать ее смещение в IAT(2) и таблице поиска в специально оставленных для этого местах. Найдем строку:

; запас для 2-й ф-ции db 0 0 0 0

- и заменим ее на следующую:

; DispatchMessageA db d6 20 0 0

Это нужно сделать в двух местах - в IAT(2) и в таблице поиска для User32.dll. В конец файла нужно добавить строку 'DispatchMessageA':

db 0 0 "GetMessageA" 0 db 0 0 "DispatchMessageA" 0

m 2000 l 200 100 w q

Теперь изменим секцию кода. В файле 'code.txt' найдем строки:

; вызов GetMessageA (по адресу в IAT(2) 402010h) db ff 15 10 20 40 0

Теперь вставим после них инструкции помещения в стек параметра и вызова функции DispatchMessageA:

; параметр DispatchMessageA - адрес MSG (403020h) db 68 20 30 40 0 ; вызов DispatchMessageA (по адресу в IAT(2) 402014h) db ff 15 14 20 40 0




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



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