
- •Лабораторная работа №8 «Дополнительные команды»
- •Раздел 1
- •«Команды логических операций»
- •4 Not (not operand)
- •5 Test (test operand)
- •Раздел 2
- •1 Циклы
- •Раздел 3 «Команды обработки цепочечных данных»
- •1 Movs (moVe String)
- •2 Rep (rePeat)
- •3 Lods (lOaD String)
- •4 Stos (stOre String)
- •5 Cmps (CoMPare String)
Лабораторная работа №8 «Дополнительные команды»
Раздел 1
«Команды логических операций»
Цель работы:
Научиться использовать логические команды для работы с операндами на уровне битов.
Методические указания:
Для подготовки лабораторной работы использовать:
программу OllyDbg;
исполняемый файл – Crackme.exe.
методические указания по лабораторной работе.
Наряду со средствами арифметических вычислений, система команд микропроцессора имеет также средства логического преобразования данных. Под логическими понимаются такие преобразования данных, в основе которых лежат правила формальной логики. Формальная логика работает на уровне утверждений истинно и ложно. Для микропроцессора это, означает 1и 0 соответственно. Для компьютера язык нулей и единиц является родным, но минимальной единицей данных, с которой работают машинные команды, является байт. Однако, на системном уровне часто необходимо иметь возможность работать на предельно низком уровне - на уровне бит.
Логические операции представлены булевыми операторами NOT (инверсия), AND (конъюнкция), OR (дизъюнкция) XOR (исключающее ИЛИ). К логическим командам можно отнести и команду неразрушающей проверки TEST. Все логические операции являются поразрядными: выполняются независимо для всех битов операндов.
1 AND (logical AND)
Команда AND используется для логического умножения двух операндов. Результатом этой операции над двумя битам является 1, если они оба равны 1, и 0 во всех остальных случаях. Результат помещается по адресу первого операнда.
Таблица результатов для операции AND:
1 and 1 = 1;
1 and 0 = 0;
0 and 1 = 0;
0 and 0 = 0.
Для разбора команды необходимо в программе OllyDbg открыть файл Crackme.exe. В открывшейся программе в окне Disassembler window в самом начале находится команда PUSH 0. При помощи окна Assemble следует заменить эту команду на AND EAX, ECX. Значение регистра EAX равно 00003500, регистра ECX – 00001200, как показано на рисунке 1.1.
Рисунок 1.1 – Registers window
Примечание: значения регистров могут быть другими, в этом случае следует изменить их вручную.
Следующий шаг – выделить строку с командой AND EAX, ECX щелчком левой кнопки мыши, нажать F7. Значение регистра EAX, как видно на рисунке 1.2, станет равным 00001000.
Рисунок 1.2 – Registers window
Чтобы сделать эту операцию вручную, нужно перевести оба числа в двоичный вид: 3500 в двоичном виде будет равно 11010100000000, а 1200 в двоичном виде будет равно 01001000000000. При использовании процедуры AND побитно получится: 1 and 0 = 0, 1 and 1 = 1 и так далее, в итоге получится 01000000000000. Этот двоичный результат эквивалентен - шестнадцатеричному 1000.
2 OR (logical OR)
Команду OR можно использовать для работы с операндами на уровне битов. Результатом этой операции над двумя битам является 1, если один или оба равны 1, и 0 во всех остальных случаях. Результат помещается по адресу первого операнда.
Таблица результатов для операции OR:
1 and 1 = 1;
1 and 0 = 1;
0 and 1 = 1;
0 and 0 = 0.
Для разбора команды необходимо открыть в программе OllyDbg файл Crackme.exe. В открывшейся программе в окне Disassembler window в самом начале находится команда PUSH 0. При помощи окна Assemble нужно заменить эту команду на OR EAX, ECX. Значение регистра EAX равно 00003500, регистра ECX – 00001200.
Примечание: значения регистров могут быть другими, в этом случаи требуется их изменить вручную.
Далее необходимо выделить строку с командой OR EAX, ECX щелчком левой кнопки мыши, и нажать F7. Значение регистра EAX станет равным 3700, как показано на рисунке 1.3.
Рисунок 1.3 – Registers window
Чтобы сделать эту операцию вручную, нужно перевести оба числа в двоичный вид: 3500 в двоичном виде будет равно 11010100000000, а 1200 в двоичном виде будет равно 01001000000000. Для этого необходимо применить процедуру AND побитно: 1 or 0 = 1, 1 or 1 = 1 и так далее, в итоге получится 11011100000000. Этот двоичный результат эквивалентен - шестнадцатеричному значению - 3700.
3 XOR
Команду XOR используется для выполнения операции логического исключающего ИЛИ двух операндов. Результатом этой операции над двумя битам является 1, если один и только один из двух битов равен 1, и 0 во всех остальных случаях. Результат помещается по адресу первого операнда.
Таблица результатов для операции XOR:
1 and 1 = 0;
1 and 0 = 1;
0 and 1 = 1;
0 and 0 = 0.
Для разбора команды необходимо открыть в программе OllyDbg файл Crackme.exe. В открывшейся программе в окне Disassembler window в самом начале находится команда PUSH 0. При помощи окна Assemble требуется заменить эту команду на XOR EAX, ECX. Значение регистра EAX равно 00003500, регистра ECX – 00001200.
Примечание: значения регистров могут быть другими.
Далее необходимо выделить строку с командой XOR EAX, ECX щелчком левой кнопки мыши, и нажать F7. Значение регистра EAX станет равным 2700, как показано на рисунке 1.4.
Рисунок 1.4 – Registers window
Чтобы сделать эту операцию вручную, нужно перевести оба числа в двоичный вид: 3500 в двоичном виде будет равно 11010100000000, а 1200 в двоичном виде будет равно 01001000000000. Далее необходимо применить процедуру XOR побитно: 1 or 0 = 1, 1 or 1 = 0 и так далее, в итоге получится 10011100000000. Этот двоичный результат эквивалентен - шестнадцатеричному значению - 2700.