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


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


m 0 l 200 100 w q

Осталось лишь добавить PE-заголовок. Сначала скопируем его шаблон (header.txt) в рабочий каталог, а затем слегка его подправим. Потребуются изменения всего в трех местах. Самое главное - нужно изменить подсистему: вместо графической (2) поставить консольную (3). Собственно, это единственное, чем консольные приложения отличаются от графических! Находим в шаблоне строки:

a 9C ; Подсистема: 2 - графическая, 03 - консольная (2 байта)

Сразу после нее должно быть:

db 03 00

Теперь надо указать расположение таблицы импорта. Находим строку:

; Здесь начинается первый элемент каталога:

За ней должен следовать текст:

; смещение таблицы экспорта (4 байта) db 0 0 0 0 ; размер таблицы экспорта (4 байта) db 0 0 0 0 ; Второй элемент каталога: ; смещение таблицы импорта (4 байта) db 20 30 0 0 ; размер таблицы импорта (4 байта) db 28 0 0 0

Наконец, мы поменяли местами секции .data и .rdata (хотя в принципе этого можно было и не делать). Находим начало второй секции:

; вторая секция

И заменяем оставшийся текст на следующий:

db '.data' 0 0 0 db 0 2 0 0 db 0 20 0 0 db 0 2 0 0 db 0 4 0 0 db 0 0 0 0 0 0 0 0 0 0 0 0 db 40 0 0 c0 ; ; третья секция db '.rdata' 0 0 db 0 2 0 0 db 0 30 0 0 db 0 2 0 0 db 0 6 0 0 db 0 0 0 0 0 0 0 0 0 0 0 0 db 40 0 0 40

m 0 l 200 100 w q

Вот и все. В файле сборки (make.bat) секции также должны идти в соответствующем порядке:

@echo off debug &lt header.txt &gt report.lst debug &lt code.txt &gt&gt report.lst debug &lt data.txt &gt&gt report.lst debug &lt rdata.txt &gt&gt report.lst copy /b header.bin+code.bin+data.bin+rdata.bin cnsl.exe

Проверив файл отчета report.lst, можно запускать cnsl.exe. Если вы запускаете его не из консоли, создаваемое окно будет мелькать - закрываться сразу после завершения программы. Поэтому можно запустить сначала консоль командной строки DOS и уже из него - наше приложение, набрав его имя (и путь, если требуется).

Еще одно примечание - в консольных приложениях используется кодировка DOS. Поэтому если вы набрали текст для вывода в Блокноте и на русском, то в консольном окне прочесть его не сможете - в Windows используется другая кодировка (ANSI).

На самом деле, возможности текстового вывода шире, чем можно было бы подумать. Попробуйте в качестве примера использовать такой файл data.txt:

n data1.bin r cx 200 f 0 l 200 0 a 0 db 0 0 0 0 db c9 cd cd cb cd cd bb 0a 0d db ba 20 20 ba 20 20 ba 0a 0d db c7 c4 c4 d7 c4 c4 b6 0a 0d db ba 20 20 ba 20 20 ba 0a 0d db c8 cd cd ca cd cd bc 0a 0d 0

m 0 l 200 100 w q

Чтобы пример работал правильно, надо еще подправить кодовую секцию - там, где строка:

; длина строки = 30 (1Eh)

надо заменить

db 6a 1e

на

db 6a 2e

Впрочем, это лишь подсказка - экспериментируйте сами!




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



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