> 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-02.md).

# Глава 2

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

## Системы счисления

Наиболее часто используемыми системами счисления являются двоичная, десятеричная и шестнадцатеричная.

Основное, что о них нужно знать:

* ДВОИЧНАЯ: представляется символами 0 и 1, и поэтому называется двоичной.
* ДЕСЯТЕРИЧНАЯ: представляется десятью символами (от 0 до 9), и поэтому называется десятеричной.
* ШЕСТНАДЦАТЕРИЧНАЯ: представляется символами от 0 до F (0-9, а также A, B, C, D, E и F, то есть 16 символов в итоге).

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

Существуют не слишком приятные математические формулы, которые мы не будем использовать, для конвертации чисел из одной системы в другу. Настоящий крэкер использует для этого "Windows-калькулятор", что гораздо быстрее и проще и избавляет от работы со степенями, суммами и прочим при конвертации чисел.

Открываем калькулятор и подготавливаем его для работы.

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

Теперь идём в меню "View", чтобы включить инженерный режим.

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

Здесь мы видим, что по умолчанию стоит десятеричная система счисления. Сбоку можно изменить её на одну из трёх: шестнадцатеричную (HEX), восьмеричную (OCT) и двоичную (BIN).

Восьмеричная система, использующая 8 символов, не слишком используется в крэкинге, но если потребуется, то в калькуляторе такая опция есть.

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

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

Теперь переводим калькулятор в шестнадцатеричную систему счисления, и введённое число автоматически конвертируется в него.

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

Таким образом, видимо, что 55 в десятеричной системе – это 37 в шестнадцатеричной.

При этом появились неиспользованные в десятеричной системе счисления клавиши с символами A, B, C, D, E, F, чтобы мы могли их вводить.

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

## Положительные и отрицательные шестнадцатеричные числа

Это понять гораздо сложнее, поэтому начнём издалека. Как в шестнадцатеричной системе можно представить отрицательное число, если мы не можем использовать для это цели минус как в традиционной десятеричной системе? Как представить в шестнадцатеричном формате, например, -1?

Рассмотрим эту проблему, и надеюсь, что всё станет понятно.

Если у нас есть возможность писать шестнадцатеричные числа от 00000000 до FFFFFFFF, то как нам представлять отрицательные числа?

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

Положительные числа будут идти от 00000000 до 7FFFFFFF, а отрицательные – до 80000000.

### Положительные

```
000000000 всё равно, что 0 в десятеричной
000000001 всё равно, что 1 в десятеричной
.........................................
.........................................
7FFFFFFF всё равно, что 2147483647 в десятеричной ( и это максимальное положительное число)
```

### Отрицательные

```
FFFFFFFF всё равно, что -1 в десятеричной
FFFFFFFE всё равно, что -2 в десятеричной
.........................................
.........................................
80000000 всё равно, что -2147483648 в десятеричной (и это максимальное отрицательное число)
```

Можно попробовать узнать в Command Bar значение 7FFFFFFF в десятеричной системе, для чего используется вопросительный знак, после которого идёт собственно само значение.

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

Справа видим, что получили соответствующее десятеричное значение, которое равно 2147483647, то есть всё в порядке.

Теперь когда хотим выяснить, является ли значение 80000000 отрицательным, видим, что не показываются результаты для значений после 7FFFFFFF (это баг в Command Bar), поэтому как же нам выяснить его значение в OllyDbg?

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

Для этого есть маленький трюк.

Идём в регистры и выделяем EAX.

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

Теперь нажимаем на правую кнопку мыши и выбираем "MODIFY".

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

Нам показывается окно, с помощью которого мы можем поместить в EAX нужное нам значение, хотя также это окно полезно для совершения различного рода конверсий. В первом поле задаётся шестнадцатеричное значение, которое мы хотим сконвертировать, а во втором появляется соответствующее значение в десятеричной.

В данном случае видим, что 80000000 соответствует десятеричному -214783648.

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

Если хотим убедиться, что FFFFFFFF это десятеричное -1.

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

Таким образом, в окне модификации регистра мы можем легко проверять значение отрицательных числе, после чего можем выйти, нажав "Cancel", не изменив на самом деле регистр никаким образом.

## ASCII-символы

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

В таблице, скопированной (хе-хе) из "Теории ассемблера" (Caos Reptante), можно видеть десятеричное значение и соответствующие ему шестнадцатеричное и символьные значения. Например, если нужно использовать символ пробела в Олли, то можем применить 20 (hex) или 32 (dec).

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

В остальных случаях мы можем узнать символьное значение шестнадцатеричного числа с помощью Command Bar:

`? 45`

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

Видим, что 45 соответствует заглавное букве "E", и если поищем число 45 в средней колонке вышеприведённой таблицы, то убедимся, что это и есть шестнадцатеричное значение буквы "E".

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

Также в OllyDbg есть окно DUMP, где находится колонка с ASCII-символами. Давайте посмотрим, увидим ли мы какие-нибудь из них в крэкми 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-3529fcf8289be3bed0418e09ac5eb9bb6c850ee6%2F23.png?alt=media)

Видим, что сбоку от колонки, отображающей шестнадцатеричные значения, есть колонка ASCII, где можно видеть соответствующие им текстовые строки, состоящие из ASCII-символов.

## Что такое стек или "куча"

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

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

Это и есть основная черта стека. Письмо помещается на верх кучи, и оно же будет тем, которое уйдёт самым первым.

В дальнейшем мы рассмотрим, как работать в OllyDbg со стеком.

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

Хорошо, думаю, что на этот раз достаточно. В третьей главе мы рассмотрим, что такое регистры и флаги, и для чего они предназначаются.

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