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

6 Mov (moVe operand)

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

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

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

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

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