Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа8.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
237.57 Кб
Скачать

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, а не раньше.

Задание:

  1. Выполнить извлечение элемента из ячейки памяти.

  2. Копировать данные из одного адреса в другой, на примере.

  3. Выполнить трассировку для каждой из цепочечных команд.

Требования к зачету:

  1. Уметь без организации внешнего цикла обрабатывать последовательности элементов фиксированной длины.

  2. Уметь сохранять элемент из регистра EAX в ячейку памяти.