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


Сообщения Windows - часть 4


Рассмотрим подробнее инструкцию безусловного перехода, которая на ассемблере обозначается мнемоникой JMP. Опкод можно представить следующим образом:

1110 10 s 1 &ltбайт(ы) смещения&gt

"Буквально" эта инструкция добавляет с учетом знака непосредственное значение (следующее за опкодом) к текущему значению регистра EIP. Обратите внимание на наличие бита знакового расширения s. Напомним, что если он равен 1, за опкодом следует всего один байт данных, который расширяется со знаком (т.е. старший бит этого байта заполняет 3 оставшихся старших байта). Если s = 0, за опкодом следуют 4 байта.

Как вы уже знаете, в регистре EIP находится адрес начала следующей инструкции. Таким образом, данная инструкция изменяет адрес следующей инструкции и тем самым осуществляет безусловный переход на исполнение кода где-то в другом месте. Указанный операнд является смещением этого "другого места" относительно начала следующей инструкции. Если смещение положительно, переход осуществляется "вперед"; если отрицательно (старший бит = 1), переход "назад". Сама инструкция перехода в короткой форме занимает 2 байта, поэтому смещение -2 означает переход на себя (отсчет ведется от следующей инструкции!); переведем это отрицательное число в бинарную форму: 2 = 00000010b; двоичное дополнение = 11111101b, добавив единицу, получим: -2 = 11111110b. Полная инструкция будет (s = 1):

11101011 11111110, или EB FE - то, что мы уже использовали в прошлый раз.

На этот раз нам нужно подсчитать число байтов, которые следует "перескочить" - это будет прыжок "назад", как вы уже поняли (и смещение соответственно отрицательное). В файле code.txt находим строку "параметр ExitProcess (код завершения = 0)" и заменяем ее следующим кодом:

; цикл ; параметры GetMessageA db 6a 0 db 6a 0 db 6a 0 ; 4-й параметр - адрес структуры MSG (в секции данных - 403020h) db 68 20 30 40 0 ; вызов GetMessageA (по адресу в IAT(2) 402010h) db ff 15 10 20 40 0

Подсчитаем число получившихся байтов: 17. Еще 2 займет сама команда перехода; поэтому, чтобы перейти на начало первой инструкции '6a 0', нужно добавить к значению EIP смещение -19 (11101101b = EDh). Сама же инструкция перехода будет иметь вид FEh EDh. Остаток файла должен выглядеть так:




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



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