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


Простейшее приложение - часть 7


Таблица импорта

Таблица импортируемых адресов должна находится в самом начале секции. При загрузке она должна быть идентична таблице поиска. В процессе загрузки система заполняет поля этой таблицы адресами соответствующих функций. Таким образом, мы должны указать в инструкциях вызова функций именно эти адреса.

Теперь мы можем составить нужные для нашего приложения данные. Разместим их в секции .rdata (со смещением 2000h относительно адреса загрузки). Создадим файл rdata.txt. Это как раз тот случай, когда могут оказаться полезными два прохода, чтобы узнать относительные взаимные смещения различных таблиц. Учтите, что все смещения должны указываться относительно базового адреса загрузки. Я приведу здесь уже готовый вариант:

n rdata.bin r cx 200 f 2000 l 200 0 a 2000 ; 1 IAT db 2A 20 0 0 0 0 0 0 ; 2 IAT db 38 20 0 0 0 0 0 0 ; имя 1 модуля db "User32.dll" 0 0 ; имя 2 модуля db "Kernel32.dll" 0 0 ; имя 1 функции db 0 0 "MessageBoxA" 0 ; имя 2 функции db 0 0 "ExitProcess" 0 ; таблица поиска 1 db 2A 20 0 0 0 0 0 0 ; таблица поиска 2 db 38 20 0 0 0 0 0 0 ; таблица импорта: ; 1 модуль ; указатель на 1 таблицу поиска db 46 20 0 0 ; 2 пустых поля db 0 0 0 0 0 0 0 0 ; указатель на имя 1 модуля db 10 20 0 0 ; указатель на 1 IAT db 0 20 0 0 ; 2 модуль ; указатель на 2 таблицу поиска db 4E 20 0 0 ; 2 пустых db 0 0 0 0 0 0 0 0 ; указатель на имя 2 модуля db 1C 20 0 0 ; указатель на 2 IAT db 08 20 0 0 ; последняя запись - все нули

m 2000 l 200 100 w q

Теперь мы можем закончить и кодовую секцию. Адрес функции MessageBoxA будет находиться в поле первой IAT по адресу 402000, используем в инструкции ModR/M с непосредственным смещением (Mod = 00, R/M = 101; затем следуют 4 байта адреса, где находится операнд):

11111111 00 010 101 , или FF 15 00 20 40 00.

Аналогично адрес функции ExitProcess будет по адресу 402008, а инструкция выглядит так: FF 15 08 20 40 00.

Составим файл code.txt:

n code.bin r cx 200 f 100 l 200 0 a 100 ; помещаем в стек параметры MessageBoxA db 6a 00 db 68 00 30 40 00 db 68 a0 30 40 00 db 6a 00 ; вызываем MessageBoxA db ff 15 00 20 40 00 ; помещаем в стек параметр (0) db 6a 00 ; вызываем ExitProcess db ff 15 08 20 40 00




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