
- •Лабораторная работа №8 «Дополнительные команды»
- •Раздел 1
- •«Команды логических операций»
- •4 Not (not operand)
- •5 Test (test operand)
- •Раздел 2
- •1 Циклы
- •Раздел 3 «Команды обработки цепочечных данных»
- •1 Movs (moVe String)
- •2 Rep (rePeat)
- •3 Lods (lOaD String)
- •4 Stos (stOre String)
- •5 Cmps (CoMPare String)
1 Циклы
Для реализации циклов можно использовать различные команды.
Инициализация счётчика повторов значением 15H: MOV ECX,15h.
Счётчик уменьшается на 1 при каждом повторе: метка_начала_цикла
DEC ECX.
Произвольные команды, в конце нужно добавить проверку на равенство нулю или любому другому условию завершения цикла: CMP ECX,0
JNE метка_начала_цикла.
При первой проверке на равенство нулю, в счётчике будет значение 14h, так как один раз DEC ECX уже выполнено. Значение 14H не равно 0, цикл повторится снова и снова, пока значение счётчика не достигнет значения 0.
В дальнейшем для разборки циклов можно использовать более компактную форму цикла с целью оптимизации по размеру:
XOR ECX,ECX
ADD ECX,15
NOP
NOP
метка_начала_цикла:
DEC ECX
; тело цикла
NOP
NOP
NOP
NOP
TEST ECX,ECX
JNE метка_начала_цикла.
Для разбора цикла необходимо открыть в программе OllyDbg файл Crackme.exe. Записать, начиная с адреса 00401000 код ранее приведенного цикла, добавив в него метки и тело, как показано на рисунке 1.1.
Рисунок 1.1 – Disassembler window
Выделить строку с командой XOR ECX,ECX и нажать F7. После выполнения команды счетчик ECX обнуляется, как показано на рисунке 1.2.
Рисунок 1.2 – Register window
Далее требуется нажать клавишу F7, чтобы выполнить команду ADD ECX,15 – значение счетчика становится 15H, как показано на рисунке 1.3, то есть в этом случае задано количество повторов.
Рисунок 1.3 – Register window
Далее нужно нажать F7, таким образом, последовательно выполняя команды начиная с команды NOP по адресу 00401005. Выполнив команду DEC ECX, значение счётчика ECX сократиться до значения 14H. Необходимо продолжить трассировку до команды TEST ECX, ECX: проверяет значение счётчика на предмет равенства нулю. Так как счётчик ещё не равен нулю, флаг Z не устанавливается и, следовательно, выполняется условный переход JNZ - он передаёт управление на адрес 401007. Далее счётчик снова уменьшается - на этот раз до значения 13H. И так продолжить трассировать пока счетчик не достигнет значения 0. При нулевом значении счётчика, сравнение на ноль устанавливает флаг Z. Поэтому переход JNZ больше не выполняется. Повторное нажатие на F7 выводит из цикла, как показно на рисунке 1.4.
Рисунок 1.4– Disassembler window
Команда LOOP служит для уменьшения значения счётчика ECX, проверки на равенство нулю и перехода по заданному адресу.
Для разбора команды необходимо открыть в программе OllyDbg файл Crackme.exe. Записать, начиная с адреса 00401000 код цикла:
XOR ECX,ECX
ADD ECX,15
NOP
NOP
NOP
NOP
NOP
NOP
NOP
LOOP 401007
как показано на рисунке 1.5.
Рисунок 1.5 – Disassembler window
Затем выделить строку по адресу 00401000 и в контекстном меню, которое показано на рисунке 1.6, выбрать команду New origin here.
Рисунок 1.6 – Контекстное меню строки команды (Disassemble window)
Значение регистра EIP устанавливается в 00401000, таким образом, программа готова к исполнению начиная с указанного адреса. Далее следует нажать F7 - снова счётчик ECX сначала инициализируется значением 0, потом ему присваивается значение 15H. Трассировка продолжается вручную до команды LOOP. Также как и раньше, осуществляется переход на адрес 401007, так как счётчик ещё не равен нулю, счётчик уменьшился на 1 - теперь в ECX хранится значение 14H. Когда счётчик, наконец, при трассировке достигает нуля, цикл не будет повторяться.
Задание:
Выполнить реализацию цикла при помощи команды LOOP и трассировку программы, используя методические указания.
Требования к зачету:
Показать выполнение цикла при помощи команды LOOP.
Уметь выполнять трассировку программы.
Сохранить измененную программу.