# Глава 50

После рассмотрения двуличных Patrick’а и PeSpin эта глава может показаться простой, даже несмотря на то, что данный упаковщик не запускается ни в одной из версий OllyDbg, защищенных всеми плагинами, в том числе и наиболее эффективным из них — Olly Advanced [\[ссылка\]](https://github.com/yutewiyof/intro-cracking-with-ollydbg/blob/master/.gitbook/assets/files/50/OllyAdvanced-1.26-beta10.7z). Но запустить его в OllyDbg, на самом деле, совсем не трудно, и мы вскоре этого добьемся, чтобы у нас осталось больше времени на отдых, хе-хе. Исследовать мы будем приложенный к данному туториалу файл UnPackMe\_ReCrypt0.80.exe [\[ссылка\]](https://github.com/yutewiyof/intro-cracking-with-ollydbg/blob/master/.gitbook/assets/files/50/ReCrypt_0.80.7z).

Что ж, попытаемся запустить подопытного в OllyDbg; пользоваться будем версией отладчика, предназначенной для поиска OEP’ов.

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

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

Но у данного плагина есть еще и опция исправления бага секций, из-за которого при неправильнм значении заголовочного поля NumberOfRva показывается одна-единственная секция:

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

Хорошо, запустив программу, мы сэкономили время; посмотрим, где произошла остановка:

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

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

Теперь секции в карте памяти отображаются корректно, хотя без содействия плагина Olly Advanced это выглядело бы так:

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

И нам было бы сложно дойти до OEP, поскольку это первая секция. Конечно, мы могли бы открыть PE Editor, посмотреть размер первой секции и вручную установить BPM на все соответствующие байты в DUMP’е, но наш плагин всё упростил, хе-хе.

Нажмем RUN:

![](https://2931627293-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LnwCNY88kcGMCQxNdy6%2Fuploads%2Fgit-blob-0fa489ccd6b0acb525cafbc0f8ffce0e80d53f2b%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-801142b211704b74a5e2f73a3bfcab5fa7a4e030%2F13.png?alt=media)

После запуска программы вызывается API-функция OutputDebugStringA, обычно использующаяся для подвешивания OllyDbg длинной строкой типа `%$%$%$%$%$%$`. Хотя Olly Advanced и другие плагины предоставляют защиту от подобных трюков, анпэкми всё же не запускается. Вызов данной API-функции генерирует исключение и программа не может выполняться дальше. Посмотрим, что произойдет, если на OutputDebugStringA установить BP:

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

Поскольку мне не хочется каждый раз вводить вручную имена API-функций, то я пользуюсь второй версией плагина +BP-OLLY [\[ссылка\]](https://github.com/yutewiyof/intro-cracking-with-ollydbg/blob/master/.gitbook/assets/files/50/+BP-Olly_v2.0beta4.7z) моего друга Red’а, дающего возможность простым кликом устанавливать BP на наиболее часто используемые API-функции (в т. ч. и для VB), а также добавлять то, что нужно именно нам.

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

Поскольку в этом окне нужной нам API-функции нет, то добавим ее в список собственных, нажав на кнопку P (Personalizar):

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

Обратите внимание, что при вводе имени функции следует соблюдать регистр букв. После нажатия на кнопку G при следующем открытии этого окна в нем появится кнопка с только что введенным именем:

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

Теперь соответствующий BP можно будет устанавливать простым кликом, и нам больше никогда не придется вручную вводить имя этой API-функции для установки на нее простого брейка.

Однако запуск программы приводит всё к той же серьезной ошибке, поэтому простые BP на этой API-функции в данном упаковщике не подойдут. После перезагрузки анпэкми установим в Command Bar’е соответствующий HE и посмотрим, что это даст.

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

После удаления BP нажмем RUN:

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

Брейк сработал. Дойдем до команды RET API-функции:

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

Возврат из API-функции происходит сюда:

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

Здесь содержимое EAX сравнивается с нулем, но в данном случае оно не нулевое. Воспользуемся трассировкой для выяснения, что происходит дальше:

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

Это такой трюк: после выполнения условного перехода содержимое регистра EAX суммируется со значением, находящимся в вершине стека:

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

И стек становится таким:

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

Дальнейшая трассировка приводит к команде RET, отправляющей выполнение на адрес, который был только что сохранен в вершине стека:

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

Поскольку такого адреса не существует, возникает исключение типа "No continuable" (Продолжение невозможно). Обработчик исключений обычно исправляет такое положение дел, но в данном случае он специально не установлен, чтобы программа далее просто завершилась.

После перезагрузки анпэкми и возврата из OutputDebugStringA попробуем обнулить EAX:

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

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

Теперь переход не срабатывает, команда INC EAX увеличивает нулевое содержимое EAX на единицу, результат операции суммируется со значением из вершины стека и выполняется RET:

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

Возврат произошел в существующий адрес и ошибок не возникло. Теперь установим BPM ON ACCESS в первой секции и посмотрим, дойдем ли до OEP.

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

Так как наш OllyDbg пропатчен для остановок на OEP, то очередная остановка происходит при выполнении:

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

Это настоящая OEP и нам остается только петь и танцевать!

Сделаем Search for –> All intermodular calls:

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

Как видим, API-функций мало, поэтому и IAT маленькая:

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

На скриншоте видно, что IAT заключена между адресами 402000 и 40201C, то есть RVA IAT = 2000, Size IAT = 1C и RVA OEP = 1000. Теперь сдампим программу, а затем восстановим файл в ImpRec’е [\[ссылка\]](https://github.com/yutewiyof/intro-cracking-with-ollydbg/blob/master/.gitbook/assets/files/34/ImportReconstructor16f.7z):

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

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

При сохранении исправленного дампа к его имени добавляется, как всегда, символ подчеркивания '\_':

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

Попробуем запустить его…

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

Вот и решен наш простой упаковщик!

До встречи в 51-й главе!

Рикардо Нарваха,

\[C] Рикардо Нарваха, 26.07.06 пер. Рома Стремилов, 04.2010
