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

7 Mul (muLtiply)

Команда MUL выполняет целочисленное умножение операндов без учета их знаковых разрядов. Для этой операции необходимо наличие двух операндов-сомножителей, размещение одного из которых фиксировано (регистр EAX), а другого задается операндом в команде.

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

До выполнения команды MUL значение регистра ECX = 00000009, EAX = FFFFFFF7, как показано на рисунке 1.15.

Рисунок 1.15 – Registers window

Затем нужно выделить строку с командой MUL ECX щелчком левой кнопкой мыши и нажать F7. Значение регистра ECX 00000009 умножится на значение регистра EAX FFFFFFF7 без учёта знаков их значений, а результат 8FFFFFFAF сохранится в EDX:EAX. В данном случаи регистр EAX не смог вместить все значение и поэтому 8 попала в регистр EDX, как показано на рисунке 1.16, в таких случая говорят, что результат содержится в EDX:EAX, то есть два регистра используются как один двойного размера.

Рисунок 1.16 Registers window

В случаи с командой MUL DWORD PTR DS: [405000] происходит умножение значения ячейки памяти по адресу 405000 на значение регистра EAX, а результат помещается в EDX:EAX без учета знаков операндов.

8 Imul (Integer muLtiply)

Команда IMUL выполняет целочисленное умножение операндов с учетом их знаковых разрядов. Команда IMUL позволяет использовать больше одного операнда.

Для разбора команды требуется в программе OllyDbg открыть файл Crackme.exe. В открывшейся программе в окне Disassembler window в самом начале находится команда PUSH 0. При помощи окна Assemble необходимо заменить эту команду на IMUL EBP, DWORD PTR [ESI+74], FF800002. При нажатие кнопки Assemble в нижней части окна Assemble, как показано на рисунке 1.17, появится сообщение об ошибке - Unknown identifier.

Рисунок 1.17 – Окно Assemble

Это происходит из-за того, что в программе OllyDbg к числам, которые начинаются с букв, нужно слева приписывать ноль. Поэтому перед числом FF800002 необходимо поставить ноль, как показано на рисунке 1.18.

Рисунок 1.18 – Окно Assemble

В этом примере в команде используются три операнда: содержимое регистра ESI+74 умножается на число FF800002 с учетом знаков, а результат сохраняется в регистре EBP. До выполнения команды в регистре ESI содержится адрес 401000, а в регистре EBP 0012FFF0, как показано на рисунке 1.19.

Рисунок 1.19 Registers window

Примечание: регистры могут содержать другие значения.

Теперь необходимо выделить в окне Disassembler window строку с командой IMUL EBP, DWORD PTR [ESI+74], 0FF800002 щелчком левой кнопки мыши, и нажать F7. В окне Dump при помощи операции Go to можно увидеть, что по адресу ESI+74, то есть 401074 содержится значение C7000000, это же значение показано на рисунке 1.20.

Рисунок 1.20 Dump

При умножении C7000000 на FF800002 получится С69С8001 8E000000. Поскольку EBP не может вместить его полностью то при выполнении команды в нём остаётся только то, что поместилось, и как показано на рисунке 1.21 – это 8E000000, а остальное отбрасывается.

Рисунок 1.21 Registers window

Команда IMUL EDX, DWORD PTR [EBP-18] перемножит содержимое по адресу регистра EDX на содержимое по адресу регистра EBP минус 18, результат будет сохранен в регистре EDX и при необходимости урезан до размера 4 байта.

Команда IMUL EBX перемножит содержимое по адресу регистра EBX на содержимое по адресу регистра EAX, результат будет сохранен в EDX:EAX.

Основной способ для умножения больших чисел - использовать IMUL только с одним операндом, так как в этом случае результат сохраняется в EDX:EAX, то есть он может быть двойного размера, чего нельзя добиться при использовании двух или трёх операндах, соответственно, данную возможность следует применять для маленьких чисел.