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

6 Mov (moVe operand)

Команда MOV применяется для различного рода пересылок данных, при этом, несмотря на всю простоту этого действия, необходимо помнить о некоторых ограничениях и особенностях выполнения данной операции:

  • направление пересылки в команде MOV всегда справа налево, то есть из второго операнда в первый;

  • значение второго операнда не изменяется;

  • лишь один из операндов может быть сегментным регистром.

Для разбора команды, нужно открыть в программе OllyDbg файл Crackme.exe. В открывшейся программе в окне Disassembler window в самом начале находится команда PUSH 0. С помощью окна Assemble необходимо заменить эту команду на команду MOV EAX, EBX. До выполнения MOV EAX, EBX значение EAX – 00000000, а EBX7FFD7000, как показано на рисунке 1.18.

Рисунок 1.18 Registers window, до выполнения команды MOV EAX, EBX

В окне Disassembler window необходимо выделить строку с командой MOV EAX, EBX и нажать клавишу F7. Значение регистра EBX переместиться в регистр EAX, как показано на рисунке 1.19, при этом значение регистра EBX не изменится.

Рисунок 1.19 Registers window, после выполнения команды MOV EAX, EBX

Так же при помощи команды MOV можно переслать значение из регистра CL в регистр AL (AL - это две последних цифры регистра EAX и CL - две последних цифры регистра ECX). Для разбора команды необходимо заново открыть в программе OllyDbg файл Crackme.exe. В открывшейся программе в окне Disassembler window в самом начале находится команда PUSH 0. При помощи окна Assemble требуется заменить эту команду на команду MOV AL, CL. Для выполнения команды следует нажать клавишу F7. Изменения в состоянии регистров до и после выполнения команды, показаны на рисунке 1.20.

Рисунок 1.20 – Изменение значений в Registers window

Также можно переместить содержимое какого-либо регистра в нужную ячейку памяти или наоборот. Так, к примеру, требуется переместить содержимое по адресу 405000 в регистр EAX. Для этого снова необходимо открыть в программе OllyDbg файл Crackme.exe. В окне Dump при помощи операции Go to можно просмотреть содержимое ячейки памяти по адресу 405000. И как показано на рисунке 1.21 - содержимое ячейки памяти - 00100000.

Рисунок 1.21 – Dump

Следующий шаг – это замена при помощи окна Assemble команды PUSH 0 на MOV EAX,DWORD PTR DS:[405000]. Затем, выделив строку с командой NOP по адресу 401005, показанной на рисунке 1.22, нажимается клавиша F7. Для перемещения четырех байтов используется слово DWORD, для перемещения двух байтов - WORD, а слово BYTE - для перемещения одного байта.

Рисунок 1.22 Disassembler window

Так как в памяти содержимое хранится в перевёрнутом виде, то в регистр EAX попадёт 00001000, как показано на рисунке 1.23.

Рисунок 1.23 – Registers window

Для того чтобы записать значение по данному адресу (405000), необходимо ввести команду MOV DWORD PTR DS:[405000],EAX.

Команда MOV AX,WORD PTR DS:[405008] перемещает два байта из памяти по адресу 405008 в регистр AX, остальная часть регистра EAX остается неизменной.

Команда MOV AL, BYTE PTR DS:[405008] перемещает один байта из памяти по адресу 405008 в регистр AL, остальная часть регистра EAX остается неизменной.

7 MOVSX (MOVe with Sign-Extension)

Команда MOVSX копирует содержимое второго операнда, который может быть регистром или адресом памяти, в первый (который должен быть в два раза больше, чем второй), заполняя остальные биты слева значением самого значимого бита второго операнда.

Для разбора команды необходимо открыть в программе OllyDbg файл Crackme.exe. В открывшейся программе в окне Disassembler window в самом начале находится команда PUSH 0. При помощи окна Assemble нужно заменить эту команду на команду MOVSX EAX, BX. Далее выделив строку, с измененной командой нажать F7, как показано на рисунке 1.24.

Рисунок 1.24 – Disassembler window

В данном случаи значение регистра EAX – 00000000 и BX – 5000.

Примечание: значение регистра BX может отличаться от этого.

После выполнения команды в регистр AX скопировался BX, который содержал 5000. Итоговое значение регистра EAX стало 00005000, как показано на рисунке 1.25.

Рисунок 1.25 Registers window

Остальные байты заполнились нулями, так как 5000 - это положительное 16-битное число. Если бы регистр BX имел отрицательное значение (8000), то биты заполнились бы отрицательным значением FFFF. Числа от 0000 до 7FFF являются положительными, а все, что выше до FFFF – отрицательными.

8 MOVZX (MOVe with Zero-Extend)

Команда MOVZX похожа на предыдущую, но в данном случае свободные байты просто заполняются нулями и не зависит от того, является ли второй оператор положительным или нет.

Для разбора команды необходимо открыть в программе OllyDbg файл Crackme.exe. В открывшейся программе в окне Disassembler window в самом начале находится команда PUSH 0. При помощи окна Assemble сделать замену этой команды на команду MOVZX EAX, BX. До выполнения команды регистр EAX содержит значение 00000000, а BX 8000, это показано на рисунке 1.26.

Рисунок 1.26 – Registers window

Далее необходимо выделить строку с командой NOP по адресу 00401003 и нажать клавишу F7, для выполнения команды. Значение регистра EAX станет равным 00008000, как показано на рисунке 1.27, несмотря на то, что регистр BX имел отрицательное значение.

Рисунок 1.27 – Registers window