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


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


Как получить описатель приложения, мы уже знаем - он будет возвращен в регистре EAX после успешного вызова GetModuleHandle. Это значение нужно скопировать из EAX по адресу памяти 403054h. Вспомним, что для копирования данных между регистром EAX и памятью используется инструкция с опкодом 101000dw и четырьмя байтами адреса памяти (это мы рассматривали в самой первой статье). В данном случае направление копирования - из EAX в память (d = 1), используется полный регистр (w = 1); вся инструкция будет иметь вид: A3 54 30 40 00.

Обратите внимание на особенность главной процедуры окна: хотя в данном конкретном случае мы используем импортируемую функцию, ее будет вызывать сама система, а не мы. Поэтому передавать ей параметры нам не придется; нужно лишь указать ее адрес в соответствующем поле структуры WNDCLASSEX (по адресу 403048h). Получить же этот адрес (импортированный) можно из второй IAT по адресу 40201Ch. (Если бы мы сами написали эту процедуру, мы знали бы ее адрес непосредственно). Таким образом, нам нужно скопировать значение из одного места в памяти (по адресу 40201Ch) в другое (по адресу 403048h). Поскольку нет непосредственной инструкции, производящей эту операцию, придется воспользоваться посредником в виде того же регистра EAX, и использовать две последовательные команды: копируем значение из [40201Ch] в EAX (A1 1C 20 40 00), затем из EAX в [403048h] (A3 48 30 40 00).

Теперь структура WNDCLASSEX инициализирована, и можно передать ее адрес функции RegisterClassExA (этот аргумент у функции единственный): 68 40 30 40 00 (поместить адрес в стек); FF 15 20 20 40 00 (вызвать функцию по адресу в IAT). После успешного завершения этой функции новый класс окна зарегистрирован, и мы можем использовать его имя ("MYCLASS" - можно было использовать и другое имя) в вызове CreateWindowExA. Дальнейший код нам уже известен.

Единственный момент - описатель экземпляра приложения теперь находится в памяти, а не в EAX, поэтому нужно использовать инструкцию косвенного помещения значения в стек (по адресу памяти). Ее мы рассматривали в статье "Простейшее приложение": 11111111 Mod 110 R/M. Используем непосредственный 4-байтный адрес после байта ModR/M (R/M = 101 при Mod = 0): FF 35 54 30 40 00. Полностью файл code.txt будет выглядеть следующим образом:




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



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