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


Консольное приложение - часть 4


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

Начнем с секции данных. Их немного - в начале секции (по смещению 2000h, который после загрузки превратится в виртуальный адрес 402000h) разместим переменную в 4 байта для вывода количества записанных байтов. Сразу за ней (по адресу 402004h) будет выводимая текстовая строка. Набираем файл data.txt:

n data.bin r cx 200 f 0 l 200 0 a 0 ; 4 байта для числа выведенных байтов db 0 0 0 0 ; выводимая строка db "Greetings from console window" 0a 0d 0

m 0 l 200 100 w q

Числа 0Ah и 0Dh после строки являются ASCII-символами перехода на новую строку; сама строка должна завершаться нулем.

Теперь надо заняться секцией импорта. Нам нужно импортировать три функции, и все из модуля Kernel32.dll: GetStdHandle, WriteFile и ExitProcess. В начале секции, как обычно, таблица импортируемых адресов (IAT); на этот раз она имеет, по числу функций, 3 поля и четвертое нулевое. Сразу вслед за IAT расположим таблицу поиска, тем более, что они при загрузке должны быть идентичны. Затем будет таблица импорта, содержащая одну запись для единственного импортируемого модуля и одну завершающую нулевую запись (общий размер 28h байт). Затем последуют строки с именами модуля и функций. Здесь удобно использовать два прохода в режиме ассемблирования - при "черновом" содержимое структур можно просто заполнять нулями (сохраняя лишь размер полей), а для второго "чистового" прохода подставить из полученного файла отчета нужные значения. Для этой же цели лучше выбрать для "сборки" образа в debug то же смещение, что и у загруженной в память секции (в данном случае - 3000h; файл rdata.txt):




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



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