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

# Часть 17

[\[Используемые материалы\]](https://github.com/yutewiyof/intro-rev-ida-pro/tree/e1367e11cc661f3d69c02ae5f733b7dd168bc5ab/.gitbook/assets/files/17.zip)

Мы добрались до **17**-й главы и предполагается, что, по крайней мере, Вы должны были попробовать решить это упражнение.

[http://ricardonarvaja.info/WEB/INTRODUCCION AL REVERSING CON IDA PRO DESDE CERO/EJERCICIOS/](http://ricardonarvaja.info/WEB/INTRODUCCION%20AL%20REVERSING%20CON%20IDA%20PRO%20DESDE%20CERO/EJERCICIOS/)

Оно очень простое. Мы должны распаковать файл из примера, как мы делали это в предыдущих частях, а затем, отреверсить его, чтобы найти для него решение, и, если это возможно, сделать кейген в **PYTHON**.

В этой главе мы будем действовать немного по другому. Я буду распаковывать файл удаленно на виртуальную машину **VMWARE WORKSTATION** с установленной системой **WINDOWS 10**.

Главная машина для удаленной отладки, это та, где запущенна **IDA**. В данном случае, это машина с **WINDOWS 7**. Но это могут быть любые системы, а не только **WINDOWS**. Например **LINUX**, **IOS** и т.д. где есть установленная **IDA**.

Все ограничения, которые произойдут при удаленной распаковке, будут такими же, как если бы программа отлаживалась напрямую в **WINDOWS 10**, так как оттуда запускается упакованный файл, который в этой части называется **PACKED\_PRACTICA\_1.EXE**.

Чтобы было быстрее читать и понимать, отсюда и далее, главную машину, где установлена **IDA**, я буду называть "**ОСНОВНОЙ**", а образ системы **WINDOWS 10**, который запускаю в **VMWARE** буду называть "**ЦЕЛЕВОЙ**".

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

В **ЦЕЛЕВОЙ** системе находится упакованный файл. Я также должен скопировать из каталога, где у меня установленна **IDA** в **ОСНОВНОЙ** системе, сам сервер. Так как моя система **WINDOWS 10** - **64**-битная, а упакованная программа – **32**-битная, то я должен запустить **32**-битый сервер. Он называется **WIN32\_REMOTE.EXE**.

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

Копируем также исполняемый файл **PACKED\_PRACTICA\_1.EXE** в **ОСНОВНУЮ** систему, чтобы выполнить **ЛОКАЛЬНЫЙ** анализ и открываем этот файл в **ЗАГРУЗЧИКЕ**. Я устанавливаю галочку в **MANUAL LOAD**, для того, чтобы **IDA** проанализировала файл и загрузила все его секции.

Сейчас мы находимся в **ЗАГРУЗЧИКЕ**, который показывает мне **EP** упакованной программы. Пока мы ещё не запускали **ОТЛАДЧИК**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjqtEP2kV1qNtJHVrED%2F-LjqtGX2JJmmeXTPWwGj%2F17-03.png?generation=1563215341975602\&alt=media)

Очень важно не переименовывать **IDB** файл. Другими словами, это означает, что если исполняемый файл называется **PACKED\_PRACTICA\_1.EXE** в **ОСНОВНОЙ** системе, то при анализе он будет сохранять **IDB** файл в ту же самую папку, и он должен называться **PACKED\_PRACTICA\_1.IDB**, и никак по другому, потому что так начнутся проблемы с распознаванием какой удаленный процесс принадлежит исполняемому файлу анализируемого локально.

Сейчас, давайте запустим удаленный сервер **WIN32\_REMOTE.EXE** в **ЦЕЛЕВОЙ** системе.

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

Этот файл запускает удаленный сервер **IDA** и будет слушать **IP** адрес и порт, который мы ему назначим. В моём случае, **IP** равен **10.80.65.157**, а порт **23946**. Скопируйте данные, которые сервер показывает для Вас.

Теперь поменяем тип отладчика на **REMOTE WINDOWS DEBUGGER**.

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

В **PROCESS OPTIONS** я устанавливаю **IP** адрес и **ПОРТ** сервера **IDA**. Т.к. процесс ещё не создан, то мы не сможет подсоединиться к нему с помощью отладчика. Также, нам нужно отлаживать файл с самого начала. Мы должны исправить пути, которые **IDA** показывает здесь, чтобы они совпадали с расположением исполняемого файла в **ЦЕЛЕВОЙ** системе.

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

В моём случае, распакованный файл в **ЦЕЛЕВОЙ** системе находится на **РАБОЧЕМ СТОЛЕ** и полный путь для моей системы будет - **C:\USERS\ADMIN\DESKTOP\PACKED\_PRACTICA\_1.EXE**

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjqtEP2kV1qNtJHVrED%2F-LjqtGXB2GtnDoRVg4BU%2F17-07.png?generation=1563215352325402\&alt=media)

Поэтому давайте отредактируем эти три поля для ввода пути.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjttkJvbq8Uocl4jWiJ%2F-Ljtty70lTtUPE9_tQ8Y%2F08.png?generation=1563265865484615\&alt=media) Сейчас, если нажмём кнопку **START PROCESS**, то **IDA** остановится на **EP** упакованного файла в **РЕЖИМЕ ОТЛАДЧИКА**.

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

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

Сейчас, в **СЕГМЕНТАХ** давайте посмотрим на первую секцию кода после заголовка.

В моём случае, я вижу, что она начинается по адресу **0x231000** и заканчивается по адресу **0x238000**.

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

Если мы просто сделаем **SEARCH FOR TEXT**, чтобы найти инструкцию **POPAD** или **POPA**, в этом случае, найдём ту инструкцию, которая выполняется до перехода в **OEP**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjqtEP2kV1qNtJHVrED%2F-LjqtGXKv5kR8K3u-3VU%2F17-11.png?generation=1563215342338626\&alt=media) ![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjqtEP2kV1qNtJHVrED%2F-LjqtGXM6laU2bNUloX3%2F17-12.png?generation=1563215342735537\&alt=media)

Здесь, мы уже знаем, что **OEP** находится по адресу **0x23146E**, но я могу найти её по другому. Я устанавливаю **BP** на **ВЫПОЛНЕНИЕ**, который охватывает всю первую секцию.

Теперь иду в начало секции по адресу **0x231000**.

Здесь я вижу данные, которые принадлежат заголовку. Очевидно, адреса не совпадают из-за рандомизации. **IB** не равна **0x400000**, но **VIRTUAL SIZE** такой же, как и был, и равен **0x7000** байт, т.е. размер секции в памяти совпадает, так как она начинается по адресу **0x231000**, а заканчивается по адресу **0x238000**. Это разница и составляет **0x7000** байт.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjqtEP2kV1qNtJHVrED%2F-LjqtGXOK28Zk8LVBxVt%2F17-13.png?generation=1563215342062492\&alt=media)

Теперь, в начале секции, я устанавливаю **BP** с помощью **F2**. В моём случае, это адрес **0x231000** или соответствующий адрес, который на Вашем компьютере имеет размер **0x7000**.

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

Я удаляю все другие **BP**. Но оставляю только один этот и нажимая **F9**, для того, чтобы запустился отладчик.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjqtEP2kV1qNtJHVrED%2F-LjqtGXSvHokFeWlo3Za%2F17-15.png?generation=1563215342122698\&alt=media)

Отладчик останавливается здесь и совпадает с адресом, который мы видели ранее, который принадлежит **OEP**. Сейчас удаляю **BP**, чтобы исчез красный фон.

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

Теперь, делаю правый щелчок в левом нижнем(верхнем?) углу, чтобы **ПОВТОРИТЬ АНАЛИЗ**.

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

В этом случае, отладчик оставляет этот блок таким, как будто это блок того же **СТАБА**. Поэтому отладчик не поместил префикс **SUB\_**, а оставил префикс как **LOC\_**.

Сейчас, я исправляю скрипт для дампа в **PYTHON**, для того, чтобы он показывал мне мою настоящую **IB** и конец файла.

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

Другими словами, **IB** в моём случае, находится по адресу **0x230000**, а её конец **0x23B000**.

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

Здесь, я меняю значения в скрипте и запускаю его через **FILE → SCRIPT → FILE**.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjqtEP2kV1qNtJHVrED%2F-LjqtGXcY1WDrZGO19CW%2F17-20.png?generation=1563215342294827\&alt=media)

Отладчик сохраняет дамп в этой папке, так как скрипт запускается на **ОСНОВНОЙ** машине.

Я открываю этот файл с помощью **PEEDITOR** и выбираю пункт **DUMPFIXER**.

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

Теперь меняю расширение файла на **EXE**.

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

Вот у него появляется такая же иконка, как и у сжатого файла. Сейчас, открываю **SCYLLA** в **ЦЕЛЕВОЙ** системе и копирую туда сдампленный файл **PACKED.EXE**.

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

Пришло время нажать на кнопку **IAT AUTOSEARCH**.

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

Я меняю поле **OEP** на значение **0x23146E**, которое мы нашли.

И вижу, что после нажатия **IAT AUTOSEARCH** и **GET IMPORTS**, остаётся только одна **НЕДЕЙСТВИТЕЛЬНАЯ** запись.

Складывая **IB** с адресом недействительной записи, получаю

**Python>hex(0x230000+0x20D4) 0x2320D4**

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjqtEP2kV1qNtJHVrED%2F-LjqtGXmkFseE7jo-6ye%2F17-25.png?generation=1563215342585086\&alt=media)

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

Видим, что этот указатель имеет ссылки.

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

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

Теперь посмотрим куда он ведёт.

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

Видим, что он заканчивается тем, что приходит в блок с инструкцией **RET**.

Для нас, настоящих хакеров, это не проблема. Так как указатель ведёт в фиксированное значение программы, которое равно **RET**, то это не **API** функция, поэтому на неправильной записи делаю **ПРАВЫЙ ЩЕЛЧОК → CUT THUNK** для удаления записи из **IAT**.

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

Сейчас, я нажимаю **FIX DUMP** на **PACKED.EXE** и у меня получается файл **PACKED**\_**SCY.EXE**, однако он не запускается. Это происходит потому, что в дампе не перераспределены адреса, которые были созданы во время выполнения, которые не принадлежат **IAT** и всегда меняются при запуске. Поэтому, я буду удалять рандомизацию. Я открываю **PACKED**\_**SCY.EXE** в **IDA** с помощью **MANUAL LOAD**, загружаю заголовок и перехожу в него.

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

В заголовке есть поле **DLL CHARACTERISTICS**. У Вас значение будет отличаться от нуля, потому что я уже изменил его.

![](https://333516620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Ljp8Kl9OQ2AqdU_D0G8%2F-LjqtEP2kV1qNtJHVrED%2F-LjqtGXy1fapjaUfeYXI%2F17-31.png?generation=1563215342613110\&alt=media)

Из меню **EDIT → PATCH PROGRAM → CHANGE WORD** меняем этот байт на нуль.

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

И потом сохраняем изменения с помощью **APPLY PATCHES TO INPUT FILE**.

Вот и всё ребята.

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

Наш файл из примера теперь распакован. В **18**-той главе мы начнём его реверсить.

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

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

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

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

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

08.10.2017

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