> For the complete documentation index, see [llms.txt](https://backoftut.gitbook.io/intro-cracking-with-ollydbg/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://backoftut.gitbook.io/intro-cracking-with-ollydbg/ch-03.md).

# Глава 3

## Для чего же нужны регистры и что это такое?

Процессору нужны помощники для выполнения программ. Таковыми и являются регистры: когда необходимо выполнить какую-либо инструкцию, например, которая складывает содержимое двух ячеек памяти, процессору нужно разместить содержимое одной из них в регистре, а затем сложить то, что в нём находится с содержимым другой ячейки. Это один из примеров использования регистров.

ESP указывает на самое верхнее значение стека, посмотрим это на примере крэкми от Cruehead’а [\[ссылка\]](https://github.com/yutewiyof/intro-cracking-with-ollydbg/blob/master/.gitbook/assets/files/1/ollydbg01-Crackme.7z).

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-2fdecc41f64d0f22903cbe44f41fdad5635cff46%2F1.png?alt=media)

ESP равняется 12FFC4, и если посмотрим в OllyDbg на стек,

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-69ec4c413d69d0912e5c6aedf3fcf2e15319d713%2F3.png?alt=media)

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

EIP – это другой очень важный регистр, который указывает на инструкцию, выполняющуюся в данный момент.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-ecc9cfd53f6d1c3e89a40c059ad701054c219e52%2F5.png?alt=media)

Видим в листинге, что при загрузке крэкми адресом первой выполняемой инструкции является 401000, и очевидно, что именно это значение и содержится в EIP.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-1e0beb8f8089ede0997906587ae87fa318099ee3%2F7.png?alt=media)

Если нажать на F7, то выполнится первая инструкцию и наступит очередь второй.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-769a638285fb873f20b3259c674b7847c3b6b748%2F9.png?alt=media)

Теперь EIP равен 401002, и в листинге видим, что первая инструкция выполнилась и находимся сейчас на второй.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-452034ccac2f09ab1aead044a0800604f71d8d32%2F11.png?alt=media)

Другие регистры могут содержать различные значения и служить для помощи процессору в выполнении инструкций.

Вспомним, где OllyDbg показывает значения регистров:

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-10996d11ce0d52673c4fd8ba118db0259404f4fc%2F13.png?alt=media)

Взглянув туда, узнаём, что существуют EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI y EIP.

Они называются 32-х битными регистрами.

OllyDbg отображает их содержимое в шестнадцатеричной форме. Например, минимальное значение EAX может быть равно 00000000, а максимальное – FFFFFFFF, что в двоичной системе счисления будет 11111111111111111111111111111111.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-bb3a230451ca674dc2f16014bedcce002976e7c0%2F15.png?alt=media)

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-38ce6e6666c42c4dc1d1ab54a0fb677a7cd9ee09%2F17.png?alt=media)

Видим, что есть 32 бита, каждый из которых может быть равен 0 или 1, поэтому регистры и называются 32-х битными.

В ассемблере можно обращаться к частям этих 32-х битных регистров.

Рассмотрим пример работы с регистрами, чтобы немного попрактиковаться в OllyDbg.

Изменим значение EAX на то, которое нужно нам, в данном случае это 12345678. Открываем OllyDbg, где загружен крэкми Cruehead’а (хотя там может быть и что-то другое).

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-ad6963e2d491287b1628e3f819ceb06881752c70%2F19.png?alt=media)

В открывшемся окне пишем в поле "Hexdecimal" 12345678.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-1e227fc23ddd9c0b619585c2a5e419a3d5d1d367%2F21.png?alt=media)

Вот так:

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-232a3aced4f57943bb03fd7c0beb89631b7cbaef%2F23.png?alt=media)

Потом нажимаем OK.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-4619aa127469a3a77c833ea99b42aaa096889437%2F25.png?alt=media)

Видим, что теперь в регистре нужное значение. OllyDbg выделяет изменённые значения красным цветом.

При желании можно использовать часть EAX, в данном случае AX будет 16-ти битным регистром, например, в примере выше в нём будет находится 5678, в чём можно убедиться, напечатав в Command Bar

`? AX` (знак вопроса также служит для нахождения значения выражения или регистра).

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-5c797a391e5b4e39fd9d179e63fc5a9255674454%2F27.png?alt=media)

После нажатия клавиши ENTER.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-3c82e4b61cd0183babd1588015b583f71d384fe2%2F29.png?alt=media)

видим пресловутые 5678, т.е. AX содержит последние четыре цифры EAX. Также существуют AL и AH, значения которых также можно посмотреть в OllyDbg.

`? AL`

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-c52f9f27a39d8b1f046f8bf9c284f52ccc44f4fe%2F31.png?alt=media)

`? AH`

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-b538fd22d1a4f2ef98884942d32db9a0c7e3822f%2F33.png?alt=media)

Или если EAX = 12345678, то AX – это последние 4 цифры.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-bcbdaf0d1767d1e8a21e7d033dfac00dbdfa4da6%2F35.png?alt=media)

AH – это 5 и 6 цифры, а AL – это две последние.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-054f3ae0e52078fa71383bed198a9e4db254dae4%2F37.png?alt=media)

Таким же образом EBX делится на BX, BH и BL, равно как подобное деление существует и почти для всех остальных регистров.

## Как изменить значение регистров

Как мы увидели, в OllyDbg можно изменять значения регистров. Всё, что мы сделали с регистром EAX применимо и к другим регистрам: отметьте регистр, значение которого вы хотите изменить, затем кликните по правой кнопке и нажмите "Modify". Единственное исключение - это EIP, указывающий на инструкцию, которая должна выполнится.

Чтобы изменить его, сделайте следующее: поскольку EIP всегда указывает на инструкцию, которая должна выполниться, то просто выбираем новую инструкцию в листинге.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-ddcd016385fee0c2687271a96939d43634e9ef8f%2F39.png?alt=media)

После того, как отметили, например, 40101A, кликаем правую кнопку мыши -> "New origin here", и EIP изменится на 40101A, и таким образом, программа продолжит выполнение именно с этого места.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-bf85256fa2b6476f56ab3d5acbd62afe12c56368%2F41.png?alt=media)

Как видим, EIP содержит 40101A.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-2d03a5a2b70051eb2022990fa807d689b4c73025%2F43.png?alt=media)

## Что такое флаги?

Как мы увидели в первой главе, в OllyDbg под регистрами находятся флаги.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-c872e64582e153add5e3d693ff588b23eff9cb85%2F45.png?alt=media)

Видим, что флаги бывают C P A Z S T D и O.

Видим, что они могут иметь только два значения: ноль или один. Определённые инструкции при выполнении могут изменять их значение.

Мы собираем рассмотреть следующие флаги:

### 1. Флаг "O" или флаг переполнения

Этот флаг активируется, когда в результате операции изменяется знак и возвращается неправильное значение.

Рассмотрим в OllyDbg следующий пример, как обычно используя крэкми Cruehead’а.

Меняем таким же, как и раньше, образом значение EAX на 7FFFFFFF, которое является максимальным положительным.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-51dac8918b1c40a528d42b969635ebb484cd14f1%2F47.png?alt=media)

Теперь прибавим 1, из-за чего сумма превысит максимальное положительное число, потому что, как мы знаем, 80000000 соответствует числу отрицательному.

Для этого вызовем окно, где можно писать инструкции.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-d9158e542bd95a1dee979d0f3a61fb0af52f704b%2F49.png?alt=media)

В нём пишем `ADD EAX, 1`.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-b0d5a74d8bedea633ced9068a40fc736304a5863%2F51.png?alt=media)

После нажатия на кнопку "ASSEMBLE" увидим, что инструкция по адресу 401000 изменится на ту, которая была введена.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-f6bd07bd7c5aeb4402bd9f3fd0ce2cc7bc234e92%2F53.png?alt=media)

`ADD EAX, 1`, как мы узнаем, когда будут перечисляться и объясняться инструкции, прибавляет к EAX число 1 и сохраняет в этом же регистре полученное значение.

До выполнения этой строки с помощью F7 флаг "O" равен нулю.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-04da4c16fadf43d7930f18890ee27d8fcfe19f52%2F55.png?alt=media)

Если выполнить данную строку с помощью F7, чтобы увидеть, что произойдёт, то в EAX окажется 80000000 и знак числа будет изменён.

Флаг "O" станет активным и будет показывать 1, то есть, что результат выполненной инструкции превзошёл максимально возможный результат. Назначения этого флага – показывать когда это происходит.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-c37793df9333a0d564093c1d471e1dff055354b6%2F57.png?alt=media)

### 2. Флаг "A" или дополнительный флаг переноса.

Имеет схожее назначение при выполнении операция с другими форматом, поэтому сейчас он нам не интересен.

### 3. Флаг "P" или флаг чётности

Данный флаг активируется, когда результат выполнения инструкция в двоичной форме содержит чётное количество единиц, например, 1010, 1100 или 1111000.

Чтобы опробовать его, у нас уже есть заданная в OllyDbg инструкция "ADD EAX, 1", и чтобы выполнить это строку снова, выделим строку 401000, кликнем правую кнопку мыши и выберем "New orgin here", чтобы вернуться назад, и теперь, если нажмём F7, выполнится инструкция, которую мы задали – "ADD EAX, 1".

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-7242b23da95a7018354f4f0f3610c4650f12d02e%2F59.png?alt=media)

Сейчас у нас в EAX содержится значения 00000000, а флаг "P" равен 1 (как результат выполнения предыдущей инструкции), посмотрим, что случится, когда прибавим к EAX 1.

Нажимаем F7.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-2194b5c92ecdd27869ff46aa4dd48ffcbce68667%2F61.png?alt=media)

Видим, что "P" стал равен 0, так как результат, содержащийся в EAX, равен в двоичной форме 1, что в двоичной форме содержит всего лишь одну единицу, то есть нечётное количество.

И снова кликаем на "ADD EAX, 1", а потом правой кнопкой мыши и выбираем "New origin here", чтобы снова прибавить 1. Нажимаем F7.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-e7e18c371f54beef2b8d71ac7aaf16563362e6ba%2F63.png?alt=media)

Видим, что в EAX, содержавшем прежде значение 1, теперь находится 2, что в двоичной форме равно 10. Число единиц опять нечётно и флаг "P" неактивен. Повторим процесс с прибавлением единицы ещё раз.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-e61b4f8f18a5c226c0e2cefdaa5d39b5a2de7608%2F65.png?alt=media)

Теперь в EAX содержится значение 3, что в двоичной форме равно 11, и сейчас результат содержит чётное количество единиц, а флаг чётности стал активен.

Вот мы и познакомились с тем, как работает вышеуказанный флаг: если результат выполнения инструкции содержит в двоичной форме чётное количество единиц, то флаг активен.

### 4. Флаг "Z" или флаг нуля

Это один из самых известных и используемых в крэкинге флагов, который становится активным, когда результатом выполнения инструкции является ноль.

Вернёмся к нашей инструкции "ADD EAX, 1" по адресу 401000 (клик правой кнопкой мыши – "New origin here"), но сделаем значение EAX равным FFFFFFFF, что равно десятиричному -1, поэтому когда нажмём F7 и запустим "ADD EAX, 1", результатом -1 + 1 будет ноль и флаг "Z" должен стать активным.

Видим, что после нажатия F7 EAX содержит ноль, а раз результат – ноль, то флаг Z активен и равен 1.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-872c63f60a0d20843af229c568114815ffe0252e%2F67.png?alt=media)

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-cfee7af18028d2e499caa505d3809125237cfce4%2F69.png?alt=media)

Думаю, теперь стало ясным, что данный флаг активен, когда результат инструкции равен нулю. Различные способы достичь этого мы узнаем позже.

### 5. Флаг "S" или флаг знака

Этот флаг равен 1, когда результат операции отрицателен. Что посмотреть его в действии, изменим значение EAX на FFFFFFF8, что равно -8 в десятиричной форме.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-6d7164616409ab0e3204060155089503de422073%2F71.png?alt=media)

С помощью "New origin here" и кнопки А7 можно снова выполнить "ADD EAX, 1". Результатом будет FFFFFFF9, то есть -7 в десятиричной форме, которое является отрицательным числом, поэтому флаг знака должен стать активным.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-398adc3d452ccaa0e951beefc6d9b809ffba3120%2F73.png?alt=media)

Нажимаем F7 и после выполнения инструкции активируется флаг "S", который теперь равен 1, то есть ясно, что отрицательный результат его активирует.

### 6. Флаг "C" или флаг переноса

Активен, когда превышается максимальное значение, которое может содержать регистр, например, если поместим в EAX значение FFFFFFFF и прибавим 1, то увидим, что флаг переноса стал равен 1.

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-3aa3fab49caa0bd9c6113492a1b8dbef832d5b0e%2F75.png?alt=media)

### 7. Флаги T, D и I

Я не буду объяснять их назначение сейчас, так как это достаточно сложная тема, и пока нам они не слишком интересны. Пока мы будем рассматривать более простые инструкции, а эту тему оставим на потом.

Таким образом, мы получили представление о каждом регистре и в каких случаях активируются флаги. С помощью этой информации мы можем начать изучение инструкций одну за другой, так как пока мы только видели инструкцию ADD.

Если вам ещё что-то осталось непонятным, попрактикуйтесь в изменении значений флагов с помощью использованной нами инструкции "ADD EAX, 1", а затем переходите к следующей части данного "Введения..."

Очень важно, чтобы вы поняли основную суть, так что не колебайтесь попрактиковаться и перечитать этот материал ещё раз.

\[C] Рикардо Нарваха, пер. Aquila
