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


Шаблон оконного приложения - часть 4


m 0 l 400 100 w q

Файл "code.txt" также претерпел изменения. В начале изменяется размер сохраняемого файла (тоже до 400h). Целесообразно "собирать" секцию в debug по "родному" смещению (1000h), чтобы при черновом проходе можно было сразу определить нужный адрес главной функции окна.

n code.bin r cx 400 f 1000 l 400 0 a 1000 ; параметр GetModuleHandleA = 0 db 6a 0 ; вызов GetModuleHandleA (по адресу в IAT(1) 402000h) db ff 15 0 20 40 0 ; скопировать описатель из EAX по адресу 403054h db a3 54 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

После вызова GetMessageA нужно проверить возвращенное функцией значение. Если EAX не равен 0, выполняется обычная последовательность действий с вызовом TranslateMessage и DispatchMessageA и последующим возвратом на начало цикла. Если же возрвращен 0, нужно перескочить этот участок кода прямо на вызов функции ExitProcess. Для сравнения используется инструкция 100000sw с байтом Mod111R/M; напомним, что она содержит второй операнд в виде непосредственного значения в коде самой инструкции (в данном случае, это число 0). Мы сравниваем содержимое всего регистра EAX, поэтому w = 1; но непосредственное значение помещается в одном байте - потом оно будет расширено до 4 байтов, поэтому s тоже равен 1. Первый операнд находится в регистре (Mod = 11), код EAX - 000. Результирующая инструкция:




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



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