
- •Лабораторная работа №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)
3 Lods (lOaD String)
Команда LODS извлекает элемент из ячейки памяти (чаще на нее указывает регистр ESI) в один из регистров (чаще регистр EAX).
Для разбора команды необходимо открыть в программе OllyDbg файл Crackme.exe.
Ввести четыре команды: MOV ESI, 0040365C; MOV EDI, 0040369C; MOV ECX, 4; LODS, как показано на рисунке 1.8.
Рисунок 1.8 – Disassemble window
В окне Dump можно увидеть, что по адресу 0040365С находятся 4 байта – 654E616D. Далее необходимо выделить строку с командой MOV ESI, 0040365C, нажать F7. Выполнить трассировку до команды LODS включительно. После выполнения этой команды 4 байта - 654E616D будут загружены в регистр EAX, как показано на рисунке 1.9.
Рисунок 1.9 – Register window
Можно применить префикс REP перед инструкцией LODS для автоповтора, пока счётчик ECX не достигнет нуля. При выполнении цикла REP LODS (F7), в окне подсказки оказываются текущие значения регистров ECX, ESI и содержимое ячеек памяти, которые будут загружены в регистр EAX при следующем повторе, как показано на рисунке 1.10.
Рисунок 1.10 – Disassemble window
После выполнения цикла REP LODS, значение ECX стало равным нулю и в регистр EAX будет помещено окончательное значение – 44746E69, как показано на рисунке 1.11.
Рисунок 1.11 – Register window
Есть ещё команды LODSW и LODSB для загрузки 2-байтовых (WORD) и 1-байтных (BYTE) значений соответственно.
4 Stos (stOre String)
Команда STOS сохраняет элемент из регистра EAX в ячейку памяти.
Для разбора команды необходимо открыть в программе OllyDbg файл Crackme.exe. Ввести четыре команды: MOV ESI, 0040365C; MOV EDI, 0040369C; MOV ECX, 4; STOS, как показано на рисунке 1.12.
Рисунок 1.12 – Disassemble window
При трассировании данного примера, когда очередь доходит до команды STOS, в окне подсказки, показанном на рисунке 1.13, появляется текущее значение регистра EAX и адрес, по которому будет сохранено это значение.
Рисунок 1.13 – Disassemble window
В данном примере значение регистра EAX равно 44746E69, поэтому в окне Dump, как показано на рисунке 1.14, по адресу 0040369С будет именно это значение.
Рисунок 1.14 – Dump
Можно использовать префикс REP для автоповторения и существуют двухбайтовая и однобайтная команды: STOSW и STOSB, соответственно.
5 Cmps (CoMPare String)
Команда без префиксов осуществляет сравнение ячеек, указанных в источнике (ESI) и приёмнике (EDI).
Команда CMPS может работать с элементами размером в байт, слово, двойное слово.
Для разбора команды необходимо открыть в программе OllyDbg файл Crackme.exe. Далее ввести четыре команды: MOV ESI, 0040365C; MOV EDI, 0040369C; MOV ECX, 4; CMPS. OllyDbg дизассемблирует данную команду как CMPS DWORD PTR DS:[ESI],DWORD PTR ES:[EDI]. В окне подсказки, на рисунке 1.15 отображаются значения, подлежащие сравнению.
Рисунок 1.15 – Disassemble window
Если значения равны и в результате получаем ноль, а это значит, что флаг Z будет установлен, как показано на рисунке 1.16.
Рисунок 1.16 – Register window
Так как операция сравнения влияет на состояние флага Z, можно использовать префикс REPE или REPZ для цепочечного сравнения до тех пор пока не истощится счётчик ECX или флаг Z не окажется сброшен.
Далее инициализация: ECX = 10H. При использовании префикса REPE, как показано на рисунке 1.17, цикл прервется, когда ECX станет равен нулю или же по состоянию флага Z - любое из этих условий приведёт к завершению цикла.
Рисунок 1.17 – Disassemble window
Затем выполняется трассировка до строчки с командой REPE. Значения в обеих ячейках оказываются равны, что приводит к установке флага Z. Установленный флаг Z сигнализирует команде REPE, что пока не нужно прерывать цикл. Затем необходимо нажать F7. Далее F7 нажимается пошагово до тех пор, пока операнды не окажутся разными. В данном случае это не должно произойти пока не истощится счётчик ECX. Все 16 двойных слов оказались равными в обеих цепочках, цикл завершился бы по условию ECX = 0, а не раньше.
Задание:
Выполнить извлечение элемента из ячейки памяти.
Копировать данные из одного адреса в другой, на примере.
Выполнить трассировку для каждой из цепочечных команд.
Требования к зачету:
Уметь без организации внешнего цикла обрабатывать последовательности элементов фиксированной длины.
Уметь сохранять элемент из регистра EAX в ячейку памяти.