Введение в крэкинг с нуля, используя OllyDbg - Глава 50

  • На форуме работает ручное одобрение пользователей. Это значит, что, если Ваша причина регистрации не соответствует тематике форума, а также Вы используете временную почту, Ваша учётная запись будет отклонена без возможности повторной регистрации. В дальнейшем - пожизненная блокировка обоих аккаунтов за создание мультиаккаунта.
  • Мы обновили Tor зеркало до v3!
    Для входа используйте следующий url: darkv3nw2...bzad.onion/
  • Мы вновь вернули telegram чат форуму, вступайте, общайтесь, задавайте любые вопросы как администрации, так и пользователям!
    Ссылка: https://t.me/chat_dark_time

AnGel

Администратор
Команда форума

AnGel

Администратор
Команда форума
27 Авг 2015
3,413
2,025
После рассмотрения двуличных Patrick’а и PeSpin эта глава может показаться простой, даже несмотря на то, что данный упаковщик не запускается ни в одной из версий OllyDbg, защищенных всеми плагинами, в том числе и наиболее эффективным из них — Olly Advanced. Но запустить его в OllyDbg, на самом деле, совсем не трудно, и мы вскоре этого добьемся, чтобы у нас осталось больше времени на отдых, хе-хе. Исследовать мы будем приложенный к данному туториалу файл UnPackMe_ReCrypt0.80.exe.

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

f1cf23b93445be22195d213611b2efd2.png

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

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

304bbeea05df10bde9c5f6ad2c4e5a7d.png

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

c7140b94f04023b582095983bf4f8042.png

49568e8d4949a95efa08167c58ec853b.png

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

550190c259cbcfe2ab07445ad703edde.png

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

Нажмем RUN:

998533c7a03b7c437c4aabff849a2fa3.png

Привет и чау! И это в сверхзамаскированном OllyDbg! Разберемся, что же произошло; посмотрим лог, ответив на сообщение и подождав немного, если это потребуется:

c03315637a5d5f0c1849b2e63125a20d.png

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

7e5fc368477a2847d9368a5229d0cd41.png

Поскольку мне не хочется каждый раз вводить вручную имена API-функций, то я пользуюсь второй версией плагина +BP-OLLY моего друга Red’а, дающего возможность простым кликом устанавливать BP на наиболее часто используемые API-функции (в т. ч. и для VB), а также добавлять то, что нужно именно нам.

0c12c0d8a6e426359314ac8a3bac6d9f.png

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

11f5dfaf1e10ed2b13b6149e39f88b1b.png

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

e1dd354b80e8022c9b728e4670115441.png

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

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

4db72d01c40d2862e298511c700e1822.png

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

f1e41858989a7420035ada6529d1354b.png

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

23ba850c1f05c01ba66ecd484dde0ba5.png

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

8ffabf8060cbf8bd6c2e3bc3306ca6e5.png

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

7d36c827eb371d0bb795f1f5f0596bab.png

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

d81dbd7662f796637f99ab2d40766d61.png

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

63cb9248177f72f52a2cecb134e75dbe.png

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

32c4c75feb681c8f56a6fa6b0b6ff91e.png

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

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

679dce898307c93bbab28a4087dd7077.png

eff2e880f0591da223438d563f1c80f0.png

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

1fa9197f5c5e596727ce45261f4ab377.png

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

fb9bcfe767df64d45e54ee55ab876c5f.png

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

7e4372f0250c930c7e905bbbed12171e.png

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

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

13d700a604a042869723c7b70904f29d.png

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

6c288ab8e73d6a49d6ea6ccea0ceab5f.png

На скриншоте видно, что IAT заключена между адресами 402000 и 40201C, то есть RVA IAT = 2000, Size IAT = 1C и RVA OEP = 1000. Теперь сдампим программу, а затем восстановим файл в ImpRec’е:

26f2b587b322afb2b78ce6ada7402fcb.png

bef1780e86261ce774fdb7910a459f2d.png

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

0c475891444f0b1427035a3a49388445.png

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

412d1d7bb7c40b7aa1be8bce32a8daaf.png

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

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

Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
 

О нас

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

    Dark-Time 2015 - 2024

    При поддержке: XenForo.Info

Быстрая навигация

Меню пользователя