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

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


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

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

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

Массу крэкерских инструментов, видеоуроков и статей вы сможете найти на видеокурсе от нашего сайта. Подробнее здесь.

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

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

Мы стоим на OEP.



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



Поскольку таблица 1 заканчивается в 5cad98, то начиная с 5cadd0 и заканчивая на 5cbb60 можно внести правильную таблицу.



Стоит отметить то, что перед записью новой правильной таблицы следует отступить немного от таблицы 1.
Используя скрипт, который приведен ниже, мы создадим аккуратненькую табличку №2.

После запуска скрипта, таблица 1 будет иметь такой вид:


Значение первого API , которое было там раньше, сейчас, после применения скрипта, указывает на адрес 5CADD0, который в свою очередь указывает на API:



Теперь в таблице 2 все функции упорядочены по своим библиотеками, но мы должны сохранить указатели на предыдущую область.

Сейчас сдампим снова через OLLYDUMP. Открываем ImpRec, выбираем процесс, вводим OEP, RVA и SIZE таблицы 2



Все недействительные значения – мусор, поэтому их можно отрезать (CUT THUNKS).
Вот такая получается таблица:



Остается сделать инъекцию кода в OEP для того, чтобы скопировать каждое значение таблицы 2 в таблицу 1 (это просто, так как мы оставили указатели, которые помогут нам).

pushad
mov eax, 5ca000 (начало таблицы 1)
mov ebx,[eax]

Пишем в ebx содержимое eax (в eax хранится указатель на api).

mov ebx, [ebx]
Пишем в ebx правильное значение api.

mov [eax], ebx
Прописываем api в соответствующую область таблицы 1.

inc eax

cmp eax, 5cad90
jne INICIO
popad
jmp ОЕР
прыжок на ОЕР

Увеличиваем eax и пробегаем по всей таблице 2, восстанавливая таблицу 1.


Скрипт для создания упорядоченной таблицы

----------------------------------------------------------------------------------------------------------

var it
var it2
var x
var y
var pit
var pit2
var dll
var dll1
var pitt

mov [eip], #EBFE#

INICIO:
mov pitt,5ca000
mov it,5ca000
mov it2,5cadd0

COMIENZO:

add pit,it
add pit2,it2

SEGUIMOS:

add pit,x
add pit2,y
cmp pit,5cad90
log pit
log x
log y
je FIN
cmp pit,5cad90
ja FIN

gmi [pit], MODULEBASE
log $RESULT
log dll1
cmp pit,pitt
jne NOPRIMERA

cmp $RESULT,400000
je PIRULO

cmp $RESULT,dll1
je IGUALES
mov dll, $RESULT
log dll
jmp NOPRIMERA

NOPRIMERA:
cmp $RESULT,dll
jne NOGUARDO
cmp $RESULT,400000
je NOGUARDO
mov [pit2], [pit]
mov [pit], pit2
mov x,4
mov y,4
jmp FINLOOP

NOGUARDO:
mov x,4
mov y,0
jmp FINLOOP

FINLOOP:
log pit
log pit2
jmp SEGUIMOS


IGUALES:
mov x,4
mov y,0
jmp FINLOOP

FIN:
mov [pit2],0
mov dll1,dll
sto
xor x,x
xor y,y
add pitt,4
cmp dll,400000
je SALTO

add pit2,4

SALTO:
mov pit,pitt
cmp pitt,5cad90
je FINISH
cmp pitt,5cad90
ja FINISH
log pit
log pit2
log pitt
jmp SEGUIMOS

FINISH:
MSG "TERMINAMOS"
log pitt
ret

PIRULO:
add pitt,4
jmp NOPRIMERA

----------------------------------------------------------------------------------------------------------

Хорошо… здесь скрипт заканчивается.
Выделенные (курсивные) значения нужно поменять на свои (если они отличаются от моих или если это другая программа).
Теперь я объясню некоторые моменты.

var it
var it2
var x
var y
var pit
var pit2
var dll
var dll1
var pitt

это переменные, которые мы используем, чтобы не затрагивать регистры программы

INICIO:
mov pitt,5ca000
mov it,5ca000
mov it2,5cadd0

it - начало таблицы 1
pitt – указатель на начало таблицы 1 (имеет те же значения, но увеличивается, в то время как it остаётся неизменным)
it2 - начало таблицы 2 (можете изменять его под себя)
pit - указатель в настоящее значение таблицы 1
pit2 - указатель в настоящее значение таблицы 2
x и y - инкременты pit, и pit2 соответственно
dll - значение первого dll, которое определяется в каждом цикле
dll11 - значение dll, определенное в предыдущем цикле

Я не буду давать подробное объяснение скрипта, расскажу только в общих чертах.
В скрипте используется функция GMI

gmi [pit], MODULEBASE

Она возвращает базовый адрес модуля (imagebase), будь то DLL или EXE. Результат сохраняется в переменной $RESULT.

Таким образом, скрипт берет записи одной DLL и упорядочивает их по imagebase. Когда он заканчивает работу с этой библиотекой, он создает разделитель (четыре нуля), а затем берет вторую запись и продолжает в том же духе. Одновременно при записи значения в таблицу 2, в таблице 1 сохраняется указатель на него для дальнейшей реконструкции.

После того, как таблица приведена в порядок, нужно натравить на нее ImpRec. Далее жмем FIX DUMP, но нас предупреждают, что больше нельзя добавлять секции. Это новый трюк armadillo. Тогда сделаем дамп с помощью LORDPE, а также сделаем rebuild и поменяем все характеристики секций на E0000020. После этого ImpRec без вопросов добавит необходимую секцию.



Привожу опции ImpRec:




ИНЪЕКЦИЯ:

Найдем где-нибудь пустое местечко для нашей инъекции. Я сделаю её здесь.



На EP сделаем редирект в область нашей инъекции.



Остановившись на JMP, который переходит к EP, таблица 1 должна быть заполнена примерно так



Перед тем, как вернуться к ЕР, сразу после popad мы должны вставить тот код, который испортил прыжок к инъекции:

006084F7 55 PUSH EBP
006084F8 8BEC MOV EBP,ESP
006084FA 6A FF PUSH -1
006084FC - E9 26FCEDFF JMP PIRULO_b.004E8127

Ну наконец-то, мы разобрались с импортом. Давайте запустим программу, но опять ошибка…
Это чертовы антидампы (antidumps). Мы изучим их в следующей части.

Вот так примерно выглядит антидамп в оригинале



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

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


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


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



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


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