> For the complete documentation index, see [llms.txt](https://yutewiyof.gitbook.io/intro-rev-ida-pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yutewiyof.gitbook.io/intro-rev-ida-pro/chast-10.md).

# Часть 10

Хорошо, мы узнали кое-что о **ЗАГРУЗЧИКЕ** и будем продолжать его разбирать в дальнейшем, но сейчас мы познакомимся с некоторые особенностями **ОТЛАДЧИКА**, которые дополняют друг друга.

**IDA** поддерживает множество **ОТЛАДЧИКОВ**, чтобы увидеть их, мы открываем оригинальный файл **КРЭКМИ CRUEHEAD** без патча в **IDA**.

Очевидно, мы выбираем **OVERWRITE**, если **IDA** спросит нас, хотим ли мы создать новую базу данных и затереть старую, чтобы сделать новый анализ, если у нас уже была в том же месте предыдущая база данных или файл **IDB** пропатченой программы.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL3PSX6auTe43pWr%2F10-01.png?generation=1563193614173700\&alt=media)

Мы не будем устанавливать режим **РУЧНАЯ ЗАГРУЗКА**, потому что не хотим соглашаться на все окна, которые появляются до тех пор, пока они все не загрузятся.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4LxlHD5x796g79q%2F02.png?generation=1563265896170890\&alt=media)

Очевидно, чтобы начать с самого начала между различными возможностями **ОТЛАДЧИКОВ**, мы будем выбирать для начала **LOCAL WIN32 DEBUGGER**, который будет служить отправной точкой, позже мы рассмотрим и другие отладчики.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4MG6IMI0DZ-nFKm%2F03.png?generation=1563265898643691\&alt=media)

Мы увидим некоторые возможности **ОТЛАДЧИКА** включенного в **IDA**, который имеет свои особенности и если не научиться использовать его, так как он немного отличается от остальных отладчиков, то в дальнейшем Вам будет сложно.

Я думаю, что различия возникают, потому что **IDA** начинала свой жизненный путь просто как так называемый **ЗАГРУЗЧИК** или очень хороший статический дизассемблер и с большими возможностями интерактивности для реверсинга, затем в неё был добавлен **ОТЛАДЧИК**, который принёс свои проблемы, которые были решены, но способы работать с ним иногда немного отличается от других **ОТЛАДЧИКОВ**, таких как **OLLYDBG**.

В **DEBUGGERS → DEBUGGERS OPTIONS** у нас есть опции для **ОТЛАДЧИКА**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4M_VfLLPaPYg9R2%2F04.png?generation=1563265891893142\&alt=media)

Мы будем устанавливать галочку **SUSPEND ON PROCESS ENTRY POINT** для того, чтобы останавливаться на точке входа.

Мы будем делать изменения в анализе, как мы это делали и раньше, мы будем **ПЕРЕКРАШИВАТЬ** и **ПЕРЕИМЕНОВЫВАТЬ** зоны условных переходов.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4MuE9j65VyS_aAX%2F05.png?generation=1563265919337307\&alt=media)

Здесь мы установим **BP** с помощью **F2** на переход, который принимает решение по адресу **0x401243** и мы идём к другому переходу, который мы пропатчили и также нажимаем **F2**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4NGbxVTSDCnRH1p%2F06.png?generation=1563265895500700\&alt=media)

Сейчас мы можем запустить **ОТЛАДЧИК** с помощью **DEBUGGER → START PROCESS**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4NpJwe8z8cS-ij4%2F07.png?generation=1563265903256150\&alt=media)

Это окно всегда будет появляться у нас, когда мы идём в **ОТЛАДЧИК**, чтобы отлаживать наш исполняемый файл на нашей локальной машине, так как пока мы анализируем его в **ЗАГРУЗЧИКЕ**, он никогда не выполнится на нашей машине, но сейчас если он будет выполняться в отладчике, нам всегда нужно быть осторожным выполняя такой файл, если это **ВИРУС** или что-то потенциально опасное, нужно использовать **УДАЛЕННЫЙ ОТЛАДЧИК** и выполнять его код в виртуальной машине, мы увидим это в своё время.

Поскольку изучение **КРЭКМИ CRUHEAD** более интересное занятие, чем лечение **ЛЕССИ**, мы нажимаем **YES**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4O94MJu-1GBbrCR%2F08.png?generation=1563265894151475\&alt=media)

Выше мы попросили отладчик остановиться на **ТОЧКЕ ВХОДА**, так это и произойдёт, отладчик остановится по адресу **0x401000**, если я нажму пробел то перейдём в графический режим прям как в **ЗАГРУЗЧИКЕ**.

Небесный цвет фона блоков говорит мне, что я нахожусь в **ОТЛАДЧИКЕ**, в **ЗАГРУЗЧИКЕ** же блоки белые по умолчанию.

Я перемещаю окна, прежде всего уменьшая немного часть окна **OUTPUT WINDOW**, перетаскивая его за край вниз, расширяю немного стек, чтобы видеть регистры, которые находятся выше, и слева, и нужные нам флаги.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL3ov-A-IYF6w2rP%2F10-09.png?generation=1563193605447544\&alt=media)

Здесь мы видим **РЕГИСТРЫ** и **ФЛАГИ**.

После того, как я добился для себя удобного вида, я буду сохранять его по умолчанию для ОТЛАДЧИКА через меню WINDOWS → SAVE DESKTOP выбирая галочку в DEFAULT, всегда, когда мы запускаем ОТЛАДЧИК он будет загружаться с теми настройками, которые мы сохранили и если мы хотим изменить их снова, мы можем сделать это без проблем.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL3qayDSYwg6NyyT%2F10-10.png?generation=1563193605774455\&alt=media)

Под регистрами мы видим **СТЕК**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL3sLAQpywgXvbl-%2F10-10-t.png?generation=1563193606399945\&alt=media)

Также у нас есть дизассемблированный листинг инструкций - **IDA → VIEW EIP**, а ниже **HEX VIEW** или, что то же самое, что и **HEX DUMP** в **HEX** формате.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4P94gvCQb62wWhJ%2F11.png?generation=1563265920173227\&alt=media)

В нижней части дизассемблированного листинга мы видим:

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4PKVT1_ZKIC6XF8%2F12.png?generation=1563265892718784\&alt=media)

Мы всегда будем иметь адрес памяти и **ФАЙЛОВОЕ СМЕЩЕНИЕ**, или просто **СМЕЩЕНИЕ** в исполняемом файле, если мы откроем его в **HEX** редакторе, например таком как **HXD**, то увидим

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4PcKXO0kZPjwXCT%2F13.png?generation=1563265906524908\&alt=media)

Мы видим, что в **ПО СМЕЩЕНИЮ 0x600** находятся те же самые байты.

Мы уже знаем, что **ПО УМОЛЧАНИЮ** в **ЗАГРУЗЧИКЕ** и **ОТЛАДЧИКЕ** горячая клавиша **G** сконфигурирована так, что при нажатии на неё происходит переход к адресу памяти, если я нажму **G** и введу **0x401389**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL446xjo-ya_UMaX%2F10-14.png?generation=1563193605442323\&alt=media)

Я иду в область, где был **BP**, мы видим цвета, я делаю так, чтобы байты не были видны, чтобы не загрязнять наш внешний вид программы, и я вижу, что внешний вид стал таким как мы оставили его **ЗАГРУЗЧИКЕ**, если мы реверсим, изменяем имена и так далее, здесь в **ОТЛАДЧИКЕ** все изменения сохраняются, также изменения, которые мы сделали здесь появятся в **ЗАГРУЗЧИКЕ**, так как это модуль помеченный как те, которые загружаются в **ЗАГРУЗЧИК**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4Qcno7WU5kyIwuY%2F15.png?generation=1563265923538690\&alt=media)

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL49WsvtBds5a2xv%2F10-16.png?generation=1563193611106496\&alt=media)

В **VIEW → OPEN SUBVIEW → SEGMENTS** мы видим сейчас три сегмента, которые загружает **ЗАГРУЗЧИК**, когда не активирован режим **РУЧНОЙ ЗАГРУЗКИ**, **КОД**, который загружается по адресу **0x401000**, **ДАННЫЕ (DATA)** и **ДАННЫЕ ИМПОРТА (IDATA)**, любые изменения, которые, мы сделаем с этими тремя сегментами, будут оставаться, так как они загружены в **ЗАГРУЗЧИК**, но изменения в других сегментах будут потеряны, потому что они являются модулями загруженными **ОТЛАДЧИКОМ** и они не будут сохранены в базу данных.

\=>

Одна из панелей, которую я всегда считаю очень полезной.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL4B5LsAWddr9ht1%2F10-17.png?generation=1563193605675815\&alt=media)

Я добавляю её и сохраняю снова с помощью **SAVE DESKTOP**, чтобы использовать её по умолчанию.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4RUkwP9gGNlncXM%2F18.png?generation=1563265893044440\&alt=media)

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

Нажав стрелку назад, я возвращаюсь к точке входа, где я был раньше.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL4Fmi6_60QTDjzP%2F10-19.png?generation=1563193605774646\&alt=media)

Также в меню **DEBUGGER**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4SCpA1HeuKgHStJ%2F20.png?generation=1563265895544992\&alt=media)

Я могу видеть список **BP** и идти туда, куда я хочу, кликнув на **BP** два раза.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4SMzDYnuPqZkE-r%2F21.png?generation=1563265893881071\&alt=media)

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL4L5_8GV_fhkSFt%2F10-22.png?generation=1563193605530159\&alt=media)

Так что я нахожусь сейчас на **EP** и у меня есть две установленных **BP**, так что я могу нажать клавишу **F9** для запуска программы.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL4NZrRJmasIkmyt%2F10-23.png?generation=1563193605444594\&alt=media)

Мы идём в **HELP → REGISTER** и давайте введём ключ.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL4Pt3eiSUzWX81q%2F10-24.png?generation=1563193605275875\&alt=media)

Нажимаем **OK**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4ThwaeKvBGJ9wPB%2F25.png?generation=1563265896148965\&alt=media)

Стрелка с левой стороны где будет продолжено выполнение начинает мигать, мы видим, что регистр **EAX** равен **0x72**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL4TAu5t9lQ0A3M3%2F10-26.png?generation=1563193605774379\&alt=media)

Если я наберу в панели **PYTHON CHR(0x72)**, я увижу, что это буква **r** слова **ricnar**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL4VVwFLHJSvOOSb%2F10-27.png?generation=1563193605480747\&alt=media)

И она будет сравниваться с числом **0x41**, чтобы узнать ниже ли она.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4UTkHWKkthORILV%2F28.png?generation=1563265894795743\&alt=media)

Мы можем также видеть с помощью функции **CHR(0x41)** в панели **PYTHON**, что это буква **A**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL4ZB1eM7CLMNXxz%2F10-29.png?generation=1563193605525168\&alt=media)

Но мы также можем сделать это более легким методом, для этого нужно сделать правый щелчок на числе **41H** и в списке между настройками, которые мы можем выбрать для отображения и у меня появляется символ **A**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL4aBSphPWHyzUmY%2F10-30.png?generation=1563193605753519\&alt=media)

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4VGVa-5TkhxstCY%2F31.png?generation=1563265894245912\&alt=media)

Мы видим, что сейчас идёт сравнение с символами от **A** и до **Z**, на данный момент мы не решим полностью этот крэкми, но мы видим, что **0x72** больше чем **0x41**, следовательно, **IDA** не перейдет в красный блок сообщения об ошибке. Очевидно **IDA** будет переходить в красный блок, если число будет ниже, но также его можно оценить просто увидев флаги.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4VQOJJ8UJofFpOp%2F32.png?generation=1563265894767563\&alt=media)

Здесь мы видим переход **JB**, который переходит или следует за зеленой стрелкой в **IDA**, если первое число ниже, но при этом также активируется флаг **C** (также называемый как флаг **CF** или **C**) , здесь он говорит, что переход будет осуществлен, если **C = 1**, если мы посмотрим в **IDA** на наши флаги.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL4g67CK4bnZpehZ%2F10-33.png?generation=1563193605555965\&alt=media)

Флаг **C** = **0**, поэтому переход не будет сделан и произойдет переход к красной стрелке.

Каково сейчас математическое условие, при котором активируется **ФЛАГ CARRY**?

Флаг **CARRY** даёт нам информацию о том, что что-то пошло не так в операции сравнения между беззнаковыми целыми числами, если я делаю вычитание, так как **CMP** это вычитание без сохранения результата, т.е. **0x72 - 0x41**, то результат будет равен **0x31**, что есть положительное число и там нет проблем, однако если моё значение было бы **0x30**, например уменьшив его на **0x41**, он даст мне результат -**0x11**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL4iUjipt9KUk1J4%2F10-34.png?generation=1563193605838302\&alt=media)

Это отрицательное значение и оно не принимается как результат операции с положительными числами, поэтому значение продолжает работать с ним в режиме **HEX**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4WGbdW9XyT2RsCS%2F35.png?generation=1563265894583925\&alt=media)

Оно будет равно числу **0xFFFFFFFEF** и считая его как положительное, это очень большое значение равное **4294967279** и ( in no way subtracting ) **0x30 – 0x41** равно отрицательному числу **0xFFFFFFEF**.

Как мы узнаем, учитывается знак в операции или нет?

Это зависит от вида инструкции перехода, в этом случае **JB** - это переход, который используется после **БЕЗЗНАКОВОГО** сравнени&#x44F;**\*\*, для операций с числами** СО ЗНАКОМИ **будет использоваться переход** JL\*\*.

Если я сравниваю **0xFFFFFFFF** с числом **0x40** в беззнаковом переходе, очевидно, что оно больше, так как это максимальное положительное число, но если это переход, где учитываются знаки, это число будет равно **-1** и оно будет меньше значения **0x40**.

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

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL4mj4FhXoULuMC6%2F10-36.png?generation=1563193605635825\&alt=media)

Если переход какой-либо из этой таблицы, он оценивается **БЕЗ ЗНАКА**, в то время как каждый из них имеет свой аналог как **JL** для **JB** в таблице переходов **СО ЗНАКОМ**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4X4NwqJXk7L-Fki%2F37.png?generation=1563265894592812\&alt=media)

Мы видим, что **JE** оценивает равны ли числа в обеих таблицах, потому что в этом случае знак не имеет значения, если они равны, флаг **ZF** будет активирован и в него будет помещена единица.

Мы также видим, что **JG** означает переход, если число больше, **JG** в таблице со знаком имеет свой аналог - **JA**, который совершает переход если число выше в таблице **БЕЗ ЗНАКА**.

В ежедневном анализе мы видим слишком много флагов, видим переходы **JB** и знаем, что это сравнение между положительными числами или числами **БЕЗ ЗНАКА** и что если первое число меньше второго, то будет осуществлен переход, но хорошо то, что можно видеть, что находится ниже.

Если я продолжу останавливаться на всех **BP**, я буду видеть, что я нахожусь в цикле, который читает один за одним символы моего имени и сравнивает затем их с числом **0x41**, если есть символ ниже этого числа, то покажется сообщение об ошибке, так как я ввел только буквы (**ricnar**) у нас не будет этого случая, но давайте перезагрузим процесс с помощью **TERMINATE PROCESS** и запустим с помощью **START PROCESS** снова и сейчас введем имя **22ricnar**, а ключ **98989898**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4XP9bBVdIJ-Aw-R%2F38.png?generation=1563265893579761\&alt=media)

Нажмём **ОК** и остановимся на **BP**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4XlgtER-V3SP82t%2F39.png?generation=1563265895680629\&alt=media)

Мы видим, что сейчас мой первый символ равен **0x32**, что соответствует символу **2** слова **22ricnar**.

Я вижу, что **0x22** – меньше, чем **0x41**, зеленая стрелка активируется и это означает что переход будет выполнен и мы увидим, что флаг **C** – активирован, потому что **0x32** минус **0x41** - вычитание без учета знака, результат вычитания отрицательный и это - ошибка, которая активирует флаг **C**.

Если я сделаю правый щелчок на **ФЛАГЕ C**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtu4YJuGhUokYYas99%2F40.png?generation=1563265898046273\&alt=media)

Мы можем установить его в ноль.

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

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL4ykG4ugrJOWxHe%2F10-41.png?generation=1563193605426259\&alt=media)

Если мы нажмём **RUN** отладчик снова остановится, когда сравнит следующие символ **2** из слова **22ricnar** и направится в мигающую зеленую стрелку, что приведет нас к сообщению об ошибке, мы инвертируем снова флаг **CF** помещая в него **0**.

В следующий раз он остановится в этом переходе, что соответствует буквам **ricnar**, которые больше чем **0x41** и которые не активируют флаг **CF** и они продолжают до красной стрелке.

После обмана проверки каждого символа моего имени мы переходим к финальному переходу.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL5-LBjPiwJPTVl5%2F10-42.png?generation=1563193609824029\&alt=media)

Здесь он сравнивает **EAX** и **EBX**, чтобы узнать равны ли они, но это не имеет значения, отладчик включил красную стрелку, потому что они разные и меня отправляют к сообщению об ошибке.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL518cPvIBVmJFMP%2F10-43.png?generation=1563193605934019\&alt=media)

Здесь я вижу, что они не равны, и флаг **Z** неактивный.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL53HfD3RFZRE7Ku%2F10-44.png?generation=1563193607515987\&alt=media)

Если мы активируем его, он будет менять переход и идти на зеленую стрелку в сообщение **GOOD BOY**, делаем правый щелчок на флаге **ZF** и выбираем **INCREMENT VALUE**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL55d2MtLirFYigf%2F10-45.png?generation=1563193614143557\&alt=media)

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL57sfqoXJUF-J10%2F10-46.png?generation=1563193614301483\&alt=media)

Мы сделали то же самое, что и когда мы пропатчили код, но не делая никаких изменений, а просто только меняя флаги в **ОТЛАДЧИКЕ**.

Каждый раз, когда мы не хотим инвертировать переходы напрямую, мы идём в хороший блок где мы хотим продолжать и помещаем там курсор и делаем правый клик, хотя в **IDA 6.8** присутствует **БАГ**, которая был устранён в версии **6.9**, который возникает при правый клике рушится **IDA** если это случится с вами, найдите ярлык который вам нужен по следующей ссылке:

<https://www.hex-rays.com/products/ida/support/freefiles/IDA_Pro_Shortcuts.pdf>

А в самой **IDA** идём в **OPTIONS → SHORTCUTS**.

Если у нас есть проблемы, когда мы щелкаем правой кнопкой мыши, чтобы установить **EIP** поместите курсор туда, куда Вы хотите перейти, например **0x40124C** и нажмите сочетание **CTRL + N** что является командой **SET IP**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL59zXFCQSM57aji%2F10-47.png?generation=1563193619576298\&alt=media)

И программа будет продолжена с адреса **0x40124C**, что является тем же самым, что и инвертирование флага.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjpaImZ4kRZ_UTjfWcD%2F-LjpaL5Bjthwvv8WKPl5%2F10-48.png?generation=1563193620706361\&alt=media)

До встрече в **11**-й главе.

Автор оригинального текста — Рикардо Нарваха.

Перевод и адаптация на английский язык — IvinsonCLS.

Перевод и адаптация на русский язык — Яша Яшечкин.

Перевод специально для форума системного и низкоуровневого программирования - WASM.IN

[**Источник: ricardonarvaja.info**](http://ricardonarvaja.info/WEB/IDA%20DESDE%20CERO/CURSO%20DE%20IDA%20TUTES/10-INTRODUCCION%20AL%20REVERSING%20CON%20IDA%20PRO%20DESDE%20CERO.docx)
