Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Распаковка Армадилло с IAT Elimination (часть 6)

Обсудить статью на форуме

Хорошая подборка видеоуроков, инструментов крэкера, книг и статей - здесь.

Автор: R.Narvaja / estet / MARcoDEN <--- / estet@hotbox.ru / --->

«РАЗБОРКИ С АНТИДАМПАМИ»

Начнем изучение шаг за шагом. Для начала поставим HARDWARE BREAKPOINT на один из прыжков антидампа, например, здесь:



Жмем RUN и через несколько секунд остановимся там, где нам нужно.



Теперь мы будем исследовать.
Для начал взглянем в область дампа (FOLLOW IN DUMP) прыжка. Тут мы видим соответствующие байты.



Первый байт E9 оставим в покое и сконцентрируемся на остальных четырех, которые определяют адрес антидампа.



Выделим эти 4 байта (A1 4B 36 01) и поставим HARDWARE BPX ON WRITE. В этом случае имеется единственный выбор Byte, но это не имеет значения. После установки бряка перезапустим программу (CTRL+F2).





Ага, первая остановка. Смотрим в дампе:



Видно, что байты изменились.

Откроем меню DEBUG и выберем HARDWARE BREAKPOINTS. В открывшемся окне найдем тот бряк, который мы поставили в прошлый раз на запись 4-х байтов и нажмем рядом с ним кнопку FOLLOW.



В окне дампа мы увидим искомые байты



Как мы уже знаем, эти 4 байта - A1 4B A8 01.

На этой строке команда REP копирует содержимое ESI в EDI

77C12F43 F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]

В окне регистров ESI и EDI имеют такие значения:



Это означает, что наши 4 байта должны быть немного выше адреса, на который указывает ESI. Щелкнем правой кнопкой мыши на регистре ESI и выберем FOLLOW IN DUMP. Давайте искать наши байты.



Сейчас они здесь. Теперь мы должны отловить тот момент, когда их будут копировать, поэтому выделяем A1 и ставим HARDWARE BPX ON WRITE -> BYTE



Перезапустим программу, чтобы найти область, где сохраняются эти знаменитые 4 байта.
Итак, первая остановка. Это не то, что нам нужно



Далее здесь



Если мы взглянем на дамп области EDI



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

Здесь



На предыдущей строке

00DE325B 8908 MOV DWORD PTR DS:[EAX],ECX

Мы видим, что копируется ECX, который содержит наши байты, в область EAX, в которой у нас был HARDWARE BPX ON WRITE





Удалим все HARDWARE BPX ON WRITE, а вместо этого поставим на строке

00DE325B 8908 MOV DWORD PTR DS:[EAX],ECX

новый бряк HARDWARE BPX ON EXECUTION



Если приглядеться, что можно увидеть две одинаковые строчки, которые мы должны отследить, поэтому поставим HARDWARE BPX ON EXECUTION и на второй строке тоже.



После сохранения направляемся в начало цикла (DE317C). Немного потрейсим



В этом месте происходит чтение



Посмотрим, откуда он читает





Хм, он читает таблицы (а мы знаем, что программисты armadillo любители таблиц).
Посмотрим чуть выше.



Ха, непосредственно перед тем местом, где мы сейчас находимся, мы видим в таблице адрес 427947, в котором находится антидамп, где были первые 4 искомых байта



427947 содержит знаменитый байт A1, которой мы разыскивали, и хотя оставшаяся часть 4 байтов не совпадет (потому что мы перезапускали программу), мы видим, что это указатель на байты, которые должны быть изменены.



Рядом с таблицей находятся байты, которые он будет сохранять по этому адресу. И если мы посмотрим выше, то увидим, что это те самые байты.

Здесь есть еще две записи - место, где будет изменен прыжок по адресу 427960, но мы должны выяснить, чему они соответствуют.



Мы видим, что следующая запись является адресом, куда будет выполняться прыжок.
Посмотрим, жмем CTRL+G и введем 0341С51B. Что тут у нас:



Чуть выше расположена процедура



Она уже скопировала прыжок возврата. Результаты сохраняются в:



По адресу 0341C51B имеются байты FD 00 B4 2C, которые представляют собой прыжок, который возвращает управление обратно в исполняемый файл, Смотрим



Вот они:



Это и есть прыжок возврата, о котором мы только что говорили.

Он сохраняется в том месте, где мы поставили второй бряк.





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



Следующая запись 0341С565. Посмотрим, что у нас там.

Это и есть процедура антидампа. Только отсутствует прыжок возврата.



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

Мы должны попытаться обнаружить, где сохраняется вся процедура антидампа.

Поставим HARDWARE BPX ON WRITE в той самой таблице, где находятся наши байты (42 79 47)



Надо поймать момент сохранения байтов, т.к. я почти уверен в том, что в этот же самый момент будет сохраняться процедура антидампа.



Перезапускаем программу.

Добравшись до этого места, посмотрим, что здесь происходит.
А здесь как раз сохраняются наши байты:







Удалим предыдущий HARDWARE BPX ON WRITE и поставим HARDWARE BPX ON EXECUTION в этом месте.





Опять цикл… он начинается с DE24B5. Будем трейсить:



Немного ниже мы видим, что происходит удаление адреса возврата.





Здесь



идет чтение базового адреса секции антидампа



Нам это пригодится, так как, изменив это значение, мы сможем поместить секцию антидампа туда, куда хотим (как мы делали с таблицей импорта).

Мы видим, что это значение вызывается в нескольких местах. Выделим эту строчку и сделаем FIND REFERENCES TO -> ADDRESS CONSTANT



Тем самым мы найдем места, в которых происходит обращение к базовому адресу.



В нашем цикле константа считывается по адресу DE251E. Теперь поставим HARDWARE BPX и продолжим далее.

Нужно найти свободное место в exe-файле или установить указатель на новую секцию, которую мы можем добавить, но все же лучше будет, если удастся найти место внутри файла.

Секция .data заполнена только наполовину, и в нее можно поместить не более 187F0 байт, в то время, как размер секции антидампа равен 20000 (на самом деле, чуть меньше)





Но, тем не менее, мы попробуем разместить туда секцию антидампа.

Здесь начинается пустая область:



И заканчивается в конце секции.

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





Изменим адрес в окне дампа на 62A800.



Удалим все бряки и поставим только один бряк на OEP.
В итоге, останавливаемся на OEP.



Взглянем на антидамп, который мы изучали ранее



Как видите, мы перенаправили прыжки. Осталось скопировать секцию антидампа через BINARY COPY, а затем вставить BINARY PASTE куда нужно, но мы подойдем к этому вопросу более тщательно.



Поставим HARDWARE BPX ON WRITE на указатель и перезапустим программу, чтобы отследить, когда в первый раз вносится базовый адрес.



Также поставим бряк, где меняется адрес антидампа, и снова перезапустим.

Первый раз остановимся здесь, продолжим дальше (F9).





Тоже ничего неинтересного, продолжаем…

Здесь



Создается пустая секция. В следующий раз остановимся здесь.



Тут секция заполняется. Значит, нам нужно остановиться на второй раз, т.к. нам не нужно, чтобы создавалась новая секция. Поэтому ставим HARDWARE BPX ON EXECUTION здесь:





Оставим только бряк на OEP. Перезапустим программу.
Остановимся здесь:



Изменим значение регистра EAX. Но если посмотреть чуть выше, то мы увидим, откуда берется это значение:



Поэтому мы должны изменить и EBP-1988



EBP-1988 равен 12D3C0. Посмотрим дамп по этому адресу.


Меняем на 062А800



и не забываем про EAX



Надеюсь, что это сработает ;) , и мы благополучно дойдем до OEP.

Да, мы остановились на OEP, как и предполагалось. Теперь посмотрим на первый антидамп, который мы изучали.



Как и положено, указатель направлен внутрь исполняемого файла, а конкретнее сюда:



Здесь находится перенаправленная процедура антидампа и прыжок возврата в файл.

Запустим программу (F9) и посмотрим, будет ли она работать.

Но тут возникает конфликт, так как эта область используется программой:



Это означает, то мы выбрали не ту секцию для размещения антидампа. Единственное, что нам остается - выбрать другую область или создать новую.

Здесь есть еще одно местечко:





Но сначала надо убедиться в том, что это область никем не используется.
Перед запуском выделим ее в окне дампа и поставим туда BPM ON ACCESS, чтобы определить возможное обращение к ней.



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



Поставим HARDWARE BPX, где показано выше, чтобы перенаправить антидамп.


Меняем на 68BА70



Удаляем все бряки, кроме ОЕР и запускаем программу (F9). Теперь взглянем на антидамп.



Прыжок ведет сюда:



Вроде, все замечательно. Продолжим выполнение программы.



Да-да! Мы побороли и антидампы!

ПОДВЕДЕМ ИТОГИ

Запускаем программу и на первом exception ставим HARDWARE BPX, где меняется базовый адрес антидампа.



Хотя значения будут различными, мы все равно остановимся здесь:



Меняем указатель на нашу секцию:



Сейчас удалим предыдущий бряк и поставим два других, чтобы восстановить таблицу импорта с помощью скрипта arma.txt



Надеюсь, вы помните, где находится «магический» прыжок? Правильно, в DE43A5. А по адресу DE51C7 мы должны поменять указатель на начало таблицы.

Запускаем скрипт arma.txt. Как только он завершит работу, окажемся тут:



Теперь в окне дампа надо изменить указатель на начало таблицы (в моем случае это 5CA000).





Ставим только один бряк на OEP и запускаем программу.



После остановки на ОЕР проверим первый антидамп.



Он ведет сюда:



Все нормально. Сейчас нужно скопировать импорт из 3С81С8 в 5СА000.





Удалим бряк с OEP и запустим второй скрипт (arma2.txt)
Как только он закончит работу, можно дампить.



После снятия дампа изменим характеристики секций через LORDPE.



И сделаем rebuild.



Сейчас, не закрывая процесс hypersnap, откроем ImpRec, выберем его и введем необходимые данные.



Жмем Get Imports. Далее выберем SHOW INVALID и CUT THUNKS. Все, можно нажимать FIX DUMP.



Хорошо. Теперь откроем исправленный дамп в Olly и сделаем редирект на инъекцию.



Впишем инъекцию



Вуаля!



Если программа запустилась, значит, вы все сделали правильно.

ЗАМЕЧАНИЕ: В новых версиях armadillo OLLYDBG обнаруживается, и программа закрывается. Но поскольку обнаружение выполняется по имени процесса, то можно просто переименовать OLLYDBG.EXE, тем самым, предотвратив обнаружение.

Уфф, наконец-то! Но ведь оно стоило того, не так ли?


Автор: Ricardo Narvaja
Перевод: Estet
Редактор: MARcoDEN



Обсуждение статьи: Распаковка Армадилло с IAT Elimination (часть 6) >>>


Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS