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


Класс окна - часть 5


n code.bin r cx 200 f 1000 l 200 0 a 1000 ; параметр GetModuleHandleA = 0 db 6a 0 ; вызов GetModuleHanldeA (по адресу в IAT(1) 402000h) db ff 15 0 20 40 0 ; скопировать описатель из EAX по адресу 403054h db a3 54 30 40 0 ; скопировать в EAX адрес функции DefWindowProcA ; (из поля IAT(2) с адресом 40201Ch) db a1 1c 20 40 0 ; скопировать адрес функции из EAX ; в поле структуры WNDCLASSEX с адресом 403048h db a3 48 30 40 0 ; параметр для RegisterClassExA - ; адрес WNDCLASSEX (403040h) db 68 40 30 40 0 ; вызов RegisterClassExA (в IAT(2) - 402020h) db ff 15 20 20 40 0 ; параметры для CreateWindowExA ; дополнительное число (0) db 6a 0 ; описатель модуля (сохранен по адресу 403054h) db ff 35 54 30 40 0 ; описатель меню (0) db 6a 0 ; описатель окна-владельца (0) db 6a 0 ; высота окна db 68 0 1 0 0 ; ширина окна db 68 50 1 0 0 ; координата y db 68 0 1 0 0 ; координата x db 68 50 1 0 0 ; стиль окна db 68 0 0 cf 10 ; адрес имени окна (403010h) db 68 10 30 40 0 ; адрес имени класса (403000h) db 68 0 30 40 0 ; расширенный стиль окна (0) db 6a 0 ; вызов CreateWindowExA (по адресу в IAT(2) 40200Ch) db ff 15 c 20 40 0 ; цикл ; параметры GetMessageA db 6a 0 db 6a 0 db 6a 0 ; 4-й параметр - адрес структуры MSG (403020h) db 68 20 30 40 0 ; вызов GetMessageA (по адресу в IAT(2) 402010h) db ff 15 10 20 40 0 ; параметр TranslateMessage - адрес MSG (403020h) db 68 20 30 40 0 ; вызов TranslateMessage (по адресу в IAT(2) 402018h) db ff 15 18 20 40 0 ; параметр DispatchMessageA - адрес MSG (403020h) db 68 20 30 40 0 ; вызов DispatchMessageA (по адресу в IAT(2) 402014h) db ff 15 14 20 40 0 ; возврат на "цикл" (-41 байт) db eb d7 ; параметр ExitProcess (код завершения = 0) db 6a 0 ; вызов ExitProcess (по адресу в IAT(1) 402004h) db ff 15 4 20 40 0

m 1000 l 200 100 w q

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

; Здесь начинается первый элемент каталога: ; смещение таблицы экспорта (4 байта) db 0 0 0 0 ; размер таблицы экспорта (4 байта) db 0 0 0 0 ; Второй элемент каталога: ; смещение таблицы импорта (4 байта) db 50 20 0 0 ; размер таблицы импорта (4 байта) db 3c 0 0 0

Имя исполняемого файла можно изменить, скажем, на "class.exe" (в файле make.bat). Строим приложение и запускаем его.

Мы получили почти нормальное окно. Поэкспериментируйте с ним сами. "Почти нормальное" потому, что при его закрытии приложение все равно не завершается - его опять нужно "прибивать" из менеджера задач. Чтобы программа завершалась при закрытии его главного окна, нам придется написать собственную главную функцию окна и реализовать в ней эту возможность. Но этим мы займемся уже в другой раз.




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



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