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


Окна Windows - часть 4


"Макет" сделаем по нашему стандартному шаблону, т.е. первой будет секция кода .code со смещениями в памяти и файле 1000h и 200h соответственно; второй - секция данных импорта .rdata (2000h и 400h); третьей - секция данных .data (3000h и 600h). Создаем файл data.txt:

n data.bin r cx 200 f 0 l 200 0 e 0 "BUTTON" 0 e 10 "Моё окно" 0 m 0 l 200 100 w q

Переходим к секции .rdata. Нам нужно импортировать 2 функции из модуля Kernel32.dll (GetModuleHandleA и ExitProcess) и одну функцию (CreateWindowExA) из модуля User32.dll. Напомним, что данные для импортируемых из одного модуля функций должны располагаться в одних и тех же таблицах поиска и импортируемых адресов (IAT), а для функций из разных модулей нужно использовать разные таблицы. Поэтому у нас будут по две IAT и таблицы поиска, но одна общая таблица импорта с тремя записями (по одной на каждый модуль плюс завершающая, заполненная нулями). Создание вспомогательных таблиц не должно вызвать проблем (файл rdata.txt):

n rdata.bin r cx 200 f 2000 l 200 0 a 2000 ; 1-я IAT (для Kernel32.dll) ; GetModuleHandleA db 7C 20 0 0 ; ExitProcess db 90 20 0 0 db 0 0 0 0 ; 2-я IAT (User32.dll) ; CreateWindowExA db 9E 20 0 0 db 0 0 0 0 ; таблица поиска для Kernel32.dll ; GetModuleHandleA db 7C 20 0 0 ; ExitProcess db 90 20 0 0 db 0 0 0 0 ; таблица поиска для User32.dll ; CreateWindowExA db 9E 20 0 0 db 0 0 0 0 ; Таблица импорта: 2 записи + завершающая (0) ; запись для Kernel32.dll ; смещение таблицы поиска db 14 20 0 0 db 0 0 0 0 0 0 0 0 ; смещение строки "Kernel32.dll" db 64 20 0 0 ; смещение IAT(1) db 0 20 0 0 ; запись для User32.dll ; смещение таблицы поиска db 20 20 0 0 db 0 0 0 0 0 0 0 0 ; смещение строки "User32.dll" db 71 20 0 0 ; смещение IAT(2) db 0C 20 0 0 ; завершение таблицы db 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 db "Kernel32.dll" 0 db "User32.dll" 0 db 0 0 "GetModuleHandleA" 0 0 db 0 0 "ExitProcess" 0 db 0 0 "CreateWindowExA" 0




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



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