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

Раздел 3 «Команды обработки цепочечных данных»

Цель работы:

Изучить способы обработки цепочек байтов при помощи цепочечных команд.

Методические указания:

Для подготовки лабораторной работы использовать:

  • программу OllyDbg;

  • исполняемый файл – Crackme.exe.

  • методические указания по лабораторной работе.

Для работы со строками, или цепочками символов или чисел предусмотрен ряд специальных команд: MOVS- пересылка строки, CMPS - сравнение двух строк, SEAS - поиск в строке заданного элемента, LODS - извлекает элемент из ячейки памяти, STOS - сохраняет элемент из регистра EAX в ячейку памяти. Использование этих команд сопряжено с некоторыми трудностями, так как процессор, выполняя эти команды, неявным образом использует ряд своих регистров.

Стоит подчеркнуть, что строки, обрабатываемые рассматриваемыми командами, могут находиться в любом месте памяти: в полях данных программы, в системных областях данных, в ПЗУ, в видеобуфере.

1 Movs (moVe String)

Команда MOVS копирует данные из одного адреса в другой. Адрес источника хранится в регистре ESI, адрес приёмника - в EDI. Команда может работать с элементами размером в байт, слово, двойное слово.

Для разбора команды необходимо открыть в программе OllyDbg файл Crackme.exe. Сначала необходимо инициализировать регистр ESI адресом ячейки, содержимое которой нужно скопировать (источник), и регистр EDI - адресом ячейки, в которую нужно осуществить копирование (приёмник). Для этого нужно ввести две команды MOV ESI,0040366C и MOV EDI,0040369C, как показано на рисунке 1.1.

Рисунок 1.1 – Disassemble window

Чтобы посмотреть содержимое обеих ячеек в окне дампа непосредственно перед копированием, можно задать Go to – Expression = 0040366C и 0040369С соответственно для двух команд. Есть более простой способ: выделить команду MOV ESI,0040366C и в контекстном меню, которое показано на рисунке 1.2, выбрать команду - Follow in dump - Immediate constant.

Рисунок 1.2 – Контекстное меню строки команды (Disassemble window)

В окне Dump, которое изображено на рисунке 1.3, выделено содержимое ячейки, адрес которой указан в источнике (ESI). Приёмник (EDI) содержит 00000000 - сюда будет скопировано содержимое ячейки-источника.

Рисунок 1.3 – Dump

Далее необходимо выделить строку с командой NOP по адресу 0040100A и заменить на команду MOVS. Команда не нуждается в явном указании параметров, но программа OllyDbg дизассемблирует её как MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] для наглядности. Последовательно необходимо выполнить все три команды (F7) - в приёмнике теперь находятся 4 байта (6C674100), как показано на рисунке 1.4.

Рисунок 1.4 – Dump

Команда MOVS копирует четырехбайтные значения, то есть DWORD, из-за чего этой команде соответствует ещё одна мнемоника - MOVSD. Существуют ещё команды MOVSW и MOVSB, копирующие 2 байта (WORD) и 1 байт (BYTE) соответственно.

2 Rep (rePeat)

Команда REP в силу специфики своей работы называется префиксом. Он имеет смысл только при использовании цепочечных операций, заставляя их циклически выполняться и тем самым без организации внешнего цикла обрабатывать последовательности элементов фиксированной длины.

Для разбора команды необходимо открыть в программе OllyDbg файл Crackme.exe.

Далее ввести четыре команды: MOV ESI, 0040365C; MOV EDI, 0040369C; MOV ECX, 4; REP MOVS как показано на рисунке 1.5.

Рисунок 1.5 – Disassemble window

Затем выделить строку с командой: MOV ESI, 0040365C и нажать F7. Далее выполнить трассировку до команды REP MOVS.

Данный префикс указывает, что текущую команду нужно выполнить ECX количество раз. Фактически счётчик ECX уменьшается при каждом повторе, как и в обычном цикле. Таким образом, REP MOVS копирует уже не строго 4 байта, а массив размером 4 * ECX байт, ведь каждый раз указатели ESI и EDI сами увеличиваются на 4. Адрес источника (ESI) - 0040365C, а приёмника (EDI) - 40369C.

В окне Dump на рисунке 1.6 выделено содержимое ячейки, адрес которой указан в источнике (ESI).

Рисунок 1.6 – Dump

После выполнения команды REP MOVS первые 4 байта были успешно скопированы в приемник EDI, как показано на рисунке 1.5, но цикл должен выполняться пока ECX не достигнет нуля. На данном этапе в ECX уже хранится значение 3, а указатели ESI и EDI уже увеличились на 4, указывая, таким образом, на следующие 4 байта, которые будут скопированы как только снова будет нажата клавиша F7.

Рисунок 1.5 – Dump

Далее необходимо последовательно нажимать F7 , при этом еще раз выполняется команда REP MOVS. Следующие 4 байта перемещаются, как показано на рисунке 1.6 и счётчик ECX уже равен 2.

Рисунок 1.6 – Dump

Затем нужно нажимать клавишу F7 до того пока значение регистра ECX не станет равным нулю. Команда MOVS выполнилась 4 раза, благодаря префиксу REP, тем самым, переместив цепочку из 16 байт из одного массива в другой, как показано на рисунке 1.7.

Рисунок 1.7 – Dump