- •Лабораторная работа №6 «Команды работы с данными»
- •Раздел 1
- •«Команды перемещения данных»
- •1 Nop (No Operation)
- •2 Push (push operand onto stack)
- •3 Pop (pop operand from the stack)
- •4 Pushad (push All general Double word registers onto stack)
- •5 Popad (pop All general Double word registers from the stack)
- •6 Mov (moVe operand)
- •9 Lea (Load Effective Address)
- •10 Xchg (Exchange Register/Memory with Register)
- •Раздел 2 «Математические команды»
- •1 Inc (inCrement operand by 1)
- •2 Dec (deCrement operand by 1)
- •3 Add (adDition)
- •4 Adc (aDdition with Carry)
- •5 Sub (suBtract)
- •6 Sbb (SuBtract with Borrow)
- •7 Mul (muLtiply)
- •8 Imul (Integer muLtiply)
- •9 Div (diVide unsigned)
- •10 Idiv (Integer diVide)
- •11 Xadd (eXchange and add)
- •12 Neg (neGate operand)
3 Pop (pop operand from the stack)
Данная команда является обратной по отношению к команде PUSH. Она применяется для восстановления содержимого вершины стека в регистр, ячейку памяти или сегментный регистр.
Для разбора команды необходимо открыть в программе OllyDbg файл Crackme.exe. В открывшейся программе в окне Disassembler window в самом начале находится команда PUSH 0. При помощи команды Assemble вместо выше указанной необходимо ввести команду POP EAX, как показано на рисунке 1.10.
Рисунок 1.10 – Окно Assemble
Эта команда берёт первое значение из стека и помещает его в регистр EAX, после этого то значение, которое шло следующим, становится верхним.
До выполнения команды стек будет содержать по адресу 12FFC4 значение 7C816D4F, как показано на рисунке 1.11.
Рисунок 1.11 – Stack window
Регистр ESP указывает на 12FFC4, что является адресом верхнего значения, содержащегося в стеке. Затем, выделив строку с командой POP щелчком левой кнопки мыши, необходимо нажать клавишу F7. Теперь в стеке верхнее значение – 7C910738 находится по адресу 12FFC8, как на рисунке 1.12.
Рисунок 1.12 – Stack window
Теперь регистр ESP указывает на 12FFC8, а регистр EAX содержит значение 7C816D4F.
4 Pushad (push All general Double word registers onto stack)
Эта команда помещает содержимое регистров в стек в следующей последовательности: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI.
Для разбора команды необходимо открыть в программе OllyDbg файл Crackme.exe. В открывшейся программе в окне Disassembler window в самом начале находится команда PUSH 0. Требуется заменить данную команду при помощи окна Assemble на команду PUSHAD. Затем нужно выделить строку с командой PUSHAD и нажать F7, как показано на рисунке 1.13.
Рисунок 1.13 – Disassemble window
На рисунке 1.14 отображено состояние регистров до выполнения команды PUSHAD.
Рисунок 1.14 – Состояние регистров до выполнения команды PUSHAD
После выполнения команды значения в стеке, как видно из рисунка 1.15, размещаются в указанном ранее порядке.
Рисунок 1.15 – Изменение значений в Stack window
5 Popad (pop All general Double word registers from the stack)
Команда POPAD по принципу работы является обратной команде PUSHAD и используется для восстановления всех 32-разрядных регистров. Комбинация PUSHAD-POPAD часто используется, когда нужно за раз сохранить содержимое всех регистров, потом совершить какие-то другие операции, меняющие значение регистра и стека, а затем восстановить их изначальное состояние с помощью команды POPAD.
Для разбора команды необходимо открыть в программе OllyDbg файл Crackme.exe. В открывшейся программе в окне Disassembler window в самом начале находится команда PUSH 0. Требуется заменить ее на команду PUSHAD. После выполнения этой команды, в окне Disassembler window нужно выделить строку с командой NOP, как показано на рисунке 1.16, и при помощи окна Assemble ввести команду POPAD, далее нажать клавишу F7.
Рисунок 1.16 – Disassembler window
Поскольку стек уже содержит значения регистров, то выполнение этой команды возвратит его в изначальное состояние. Эти изменения показаны на рисунке 1.17.
Рисунок 1.17 – Изменение значений в Stack window
Теперь стек такой же, как и был до выполнения команды PUSHAD, а регистры восстановили свои значения.
