Двойные нули после строк, как
m 2000 l 200 100 w q
Двойные нули после строк, как и ранее, предназначены для выравнивания по четным адресам. Для удобства выпишем здесь адреса полей IAT, в которых после загрузки приложения на исполнение будут находиться адреса соответствующих функций (это не адреса самих функций - это адреса, по которым будут размещены адреса этих функций!)
- GetModuleHandle - 402000h ExitProcess - 402004h;
- CreateWindowExA - 40200Ch GetMessageA - 402010h;
- DispatchMessageA - 402014h;
- TranslateMessage - 402018h;
- DefWindowProcA - 40201Ch;
- RegisterClassExA - 402020h.
Теперь можем заняться секцией данных. Как и ранее, там будут две строки - имя класса окна и заголовок окна, за ними - место для структуры MSG, а за ней расположим структуру WNDCLASSEX. Обратите внимание, что необязательно располагать данные вплотную друг к другу (в данном случае) - нам просто нужно следить, чтобы они не перекрывали друг друга, и знать их адреса в памяти (в т.ч. и адреса отдельных полей структур). Поэтому может оказаться удобным и здесь использовать "два прохода" в режиме ассемблирования, чтобы нужные смещения были вычислены автоматически. Я приведу уже готовый файл data.txt (нужные адреса указаны в скобках):
n data.bin r cx 200 f 3000 l 200 0 a 3000 ; имя класса окна db "MYCLASS" 0
a 3010 ; заголовок окна db "Моё окно" 0
a 3020 ; структура MSG (28 байт)
a 3040 ; структура WNDCLASSEX: ; размер структуры db 30 0 0 0 ; стили класса окна db 0 0 0 0 ; (403048h) адрес главной функции окна db 0 0 0 0 ; дополнительные байты класса db 0 0 0 0 ; дополнительные байты окна db 0 0 0 0 ; (403054h) описатель экземпляра приложения db 0 0 0 0 ; описатель ресурса значка db 0 0 0 0 ; описатель ресурса курсора db 0 0 0 0 ; фон окна db 6 0 0 0 ; адрес имени меню db 0 0 0 0 ; адрес имени класса окна db 0 30 40 0 ; описатель ресурса мелкого значка db 0 0 0 0
m 3000 l 200 100 w q
Не забудьте, что пустые строки должны быть на своих местах - их нельзя удалять. Значения для размера структуры, адреса имени класса, а также фона окна уже указаны в секции данных. Однако, значения для еще двух обязательных полей - описатель экземпляра приложения и адрес главной процедуры окна - будут известны лишь после загрузки программы на исполнение, и мы должны предусмотреть инициализацию соответствующих полей (по адресам в памяти 403048h и 403054h) в секции кода.
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий