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


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


n rdata.bin r cx 200 f 3000 l 200 0 a 3000 ; Таблица импортируемых адресов: до загрузки ; идентична таблице поиска ; будущий адрес GetStdHandle db 55 30 0 0 ; будущий адрес WriteFile db 64 30 0 0 ; будущий адрес ExitProcess db 70 30 0 0 ; завершение таблицы нулями db 0 0 0 0 ; Таблица поиска ; смещение строки с именем GetStdHandle db 55 30 0 0 ; смещение строки с именем WriteFile db 64 30 0 0 ; смещение строки с именем ExitProcess db 70 30 0 0 ; завершающие нули db 0 0 0 0 ; Таблица импорта ; строка для импорта из Kernel32.dll: ; смещение таблицы поиска db 10 30 0 0 ; 2 пустых поля db 0 0 0 0 0 0 0 0 ; смещение имени модуля db 48 30 0 0 ; смещение таблицы импортируемых адресов db 0 30 0 0 ; завершение таблицы - пустая строка (20 нулевых байтов) 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 0 0 "GetStdHandle" 0 db 0 0 "WriteFile" 0 db 0 0 "ExitProcess" 0

m 3000 l 200 100 w q

Переходим к секции кода. Освежим знания по инструкциям: "короткая" команда помещения в стек 6Ah + 1 байт, "длинная" - 68h + 4 байта; команда вызова функции - опкод 0FFh, байт ModR/M 15h, указывающий, что операнд находится в памяти по 4-байтному адресу, который включен в инструкцию. Обратите внимание, что для помещения в стек числа 0FFFFFFF5h мы можем использовать "короткий" вариант инструкции со знаковым расширением, т.к. это на самом деле отрицательное число, представимое в виде 1 байта (-11 = 0F5h. Функцию WriteFile мы вызываем непосредственно после функции GetStdHandle, значит, нужный нам описатель файла будет находиться в регистре EAX; поэтому в этот раз придется использовать также инструкцию помещения в стек значения регистра EAX (если помните, это 50h). Указатели на нужные нам функции будут находиться после загрузки в соответствующих полях IAT, по адресам 403000h, 403004h и 403008h. Итак, файл code.txt:

n code.bin r cx 200 f 0 l 200 0 a 0 ; параметр для стандартного вывода db 6a f5 ; вызов GetStdHandle db ff 15 0 30 40 0 ; параметры для WriteFile: ; не используется - 0 db 6a 0 ; адрес переменной для числа выведенных символов db 68 0 20 40 0 ; длина строки = 30 (1Eh) db 6a 1e ; адрес выводимой строки db 68 4 20 40 0 ; содержимое регистра EAX db 50 ; вызов WriteFile db ff 15 4 30 40 0 ; параметр кода завершения (0) db 6a 0 ; вызов ExitProcess db ff 15 8 30 40 0




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



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