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

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

AnGel

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

AnGel

Администратор
Команда форума
27 Авг 2015
3,411
2,025
Если вы загрузили главы 46 и 47 сразу после их появления, то, возможно, не читали добавленное к ним позднее примечание:

После того, как была написана 46 глава и еще не было завершено решение Patrick’а, я заметил, что эти туториалы слишком сложны для уровня, до которого мы дошли, так что если вам главы 46 и 47 покажутся очень сложными, то советую оставить их до тех времен, когда вы будете более подготовлены, а сейчас сразу перейти к 48 главе, соответствующей тому уровню, на котором мы остановились.

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

Так уж вышло, что когда я занялся Patrick’ом, то сначала решил его простым методом (упомянутым в конце 47-й главы) и посчитал, что он легок до неприличия. Как следствие, данные главы оказались труднее прежних и пришлось добавить процитированное выше примечание.

В этой главе мы рассмотрим упаковщик PeSpin 1.304 Full, о котором уже существуют достаточно хорошие туториалы. На самом деле, написать еще не существующий туториал практически невозможно, так как ресурс CracksLatinoS содержит очень хорошие статьи почти обо всех упаковщиках.

В PeSpin дойти до OEP очень просто.

958bc6e9271ee303fdda1b46686fe54c.png

Сейчас анпэкми остановлен на его EP. Мы будем пользоваться Parcheado 5 — версией OllyDbg, которая предназначена для поиска OEP’ов.

35d0d0902da67953e7aff795e4bae40c.png

Открыв карту памяти, установим MEMORY BREAKPOINT ON ACCESS в первой секции после заголовка. Этот брейк равнозначен ON EXECUTION, поскольку, как помните, пропатченная для поиска OEP’ов версия отладчика в данном случае останавливается только при выполнении, а не при чтении или записи.

f188d470cd611e3b8b61ed5b74ae33cb.png

Следует убедиться, что все галки во вкладке Exceptions окна Debugging options установлены:

485a7cafd35027cf57727b0957668d35.png

После нажатия на RUN можно пойти спокойно пить кофе:

67a6deb2b14542209c3eb9cccd63bea1.png

Как следует напившись кофе, хе-хе, обнаружим, что остановка произошла на непохожем на OEP месте, а значит, от команд исходной OEP ничего не осталось из-за украденных байтов:

9c54dfaca27bc158a7caf21c294628d4.png

Посмотрим стек:

efd6f77abc7690c68f096fa212c6f30e.png

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

d6e3e792ba4b30de7679c143422c4b37.png

Кроме того, если сделаем Search for –> All intermodular calls, то найдем очень мало вызовов API-функций:

582517eab9de55ae3b84ad81cc172513.png

Посмотрим один из них:

44170072b9f50576190f126c0bd0e723.png

23dfe1f971cf3ef4a0c43696a06887bf.png

Дойдя до косвенных переходов на API-функции, заглянем в IAT:

a424db00be0c18ab85db7e2f8e671941.png

Здесь виден конец IAT’а — 460F28. Теперь поднимемся выше:

bf57432da736e9832294937dc4598fd0.png

Похоже, это переадресовочные элементы. Чтобы проверить, принадлежат ли они IAT’у, посмотрим их референсы:

93472e40d746634f46cc2b6ab20f09a2.png

Поиск ничего не дает, но если подняться еще выше, то станет ясно, что это всё-таки часть IAT’а. Таким образом, в PeSpin используется и переадресация.

bb69dea563f92171781e25dfe374146f.png

Начало IAT’а находится по адресу 460818. Мы еще вернемся к этому месту, когда будем исправлять IAT, а сейчас займемся возвращением украденных байтов; чуть выше ложной OEP для них как раз есть подходящая нулевая область:

2383032cbe0fba41c00385a5483d661e.png

Перезагрузим программу и посмотрим состояние стека:

b77d61475ef51e79d715db63ecbd68e1.png

Здесь видно, что перед запуском анпэкми адрес вершины стека равен 12FFC4 (так на моем компьютере). Это означает, что при прибытии к истинной OEP вершина стека должна находиться по тому же адресу, то есть в 12FFC4. Обычно первой командой программы является PUSH EBP, которая записывает значение в следующую ячейку стека (12FFC0), поэтому найдем ее в дампе и установим на ней HARDWARE BPX ON WRITE. Такое рассуждение логично, но оно может и не дать результатов, если упаковщик обнаруживает аппаратные брейкпоинты или, для осложнения поиска OEP, меняет адреса стека.

a4c09cb4a9463e5f1529a8acc9cfde31.png

После установки брейка нажмем RUN:

1b332632db4738d23754a8fd74f52ce1.png

Первая остановка произошла здесь, но данная инструкция скорее всего принадлежит распаковщику. Нажмем F9 еще раз:

ff5a7b39ca55998ceb814296fdee2d07.png

Теперь остановились на PUSH EBP, что весьма похоже на команду из OEP. Чтобы проверить это предположение, воспользуемся, хе-хе, трассировкой. Конечно же, JMP’ы нас не интересуют, так как они не влияют на состояние регистров или стека.

590a7d39b2738f707d95692df36edd1c.png

100fc22d55a879c251a6b99c229e5168.png

e2b68470a082c629184f3db9a31b975c.png

Здесь встречается необычная комбинация команд: сначала выполняется PUSH, а затем только что записанное в стек значение суммируется с константой:

2265be7b9a1e5280e567150c589401a0.png

После выполнения инструкции ADD значение в стеке оказывается 450E60, поэтому данная комбинация равнозначна PUSH 450E60.

7aa82ea09271e933811c318fedd502fb.png

Затем этот трюк повторяется, но уже вместо PUSH 4292C8:

532e690339c521f3d2e84a64a40d8816.png

Далее идет еще одна подходящая инструкция:

f27b896afa2742dcfe60f9516366d26c.png

И еще парочка:

e342b300788485d4d82ad9b562759e76.png

1e0848f17aaf2f3f1d2e8ccc96dcd356.png

Продолжим:

f101c58c5bf8575589a2ff1f23bd1ae8.png

53b905599bc8bd464b7063a346cabc6a.png

0aaec6f4ef0b0fb38c78005f78e166a3.png

8a7851ab5f752f48c4c5f6c7f1beb642.png

9abb5977d731385f0cfbe7c34aeb6dfc.png

7a7e791c5a7550827fea3cf5a8362df5.png

Сейчас мы просто скопируем этот CALL, а потом, при восстановлении IAT’а, посмотрим, относится ли он к какой-нибудь API-функции.

a6fabc998e35773217df1c2373c4f228.png

8734f3c5f9111d736b629c0b7fd901e1.png

441837ab908ede4864d461fff0b9b6d0.png

f6c0a0d5aa77037cf968f0946593d138.png

d930bd5fad20956635fdf146e73eb0d6.png

99ac3d5d147073eab37d7e5fff769aa0.png

22a6b3e52106313dfb272510a1bdc7f5.png

90e37d4cea78f8f1492ec79282c40b01.png

Переход на ложную OEP завершает трассировку, а мы тем временем узнали список украденных байтов, хе-хе.

25f93155593de4178568a856f4ac70a8.png

Скопируем их в область OEP:

060240895cbbe5153077d0a97f2bc32b.png

Они байт-в-байт заполнили нулевую область, так что теперь украденные байты возвращены, хотя мы даже не приступали к сдампливанию. В следующей главе мы будем разбираться с IAT’ом.

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

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

О нас

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

    Dark-Time 2015 - 2022

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

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

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