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

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


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

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

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

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

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

Некоторые уточнения к первой части

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

В этот раз таблица начинается с 3C8310,



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

Что ж, теперь диапазон сменился на 3C8308-3C9094 ;)



Настоящее местожительство нашей таблички - в секции rdata, которая начинается с 5CA000



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



Мы будем искать, где меняются байты по адресу 3C8ED8 и так пойдем шаг за шагом. Выделим строку и просмотрим дамп (FOLLOW IN DUMP -> SELECTION)



В дампе мы увидим байты, которые нужно отследить.



Сразу после FF 15 (call) идут байты D8 8E 3C 00 – их мы отметим и поставим HARDWARE BPX ON WRITE.



Продолжим выполнение программы, и будем смотреть, когда произойдет остановка.
Всего лишь 2 раза – на второй раз происходит сохранение конечного значения.



Здесь выполняется запись содержимого ECX в EAX



Точно: [ecx] 3C8ED8 в [eax] 4E8148. Смотрим выше и видим, что есть цикл:



Немного потрассируем, чтобы понять смысл цикла.
В этом месте в EDX формируется значение, где будет происходить сохранение:

 00DE516B        031481                  ADD EDX, DWORD PTR DS: [ECX+EAX*4]
 
После этого вызова регистр EAX содержит указатель таблицы:

 00DE51B3        FF1495 38B7DE00         CALL DWORD PTR DS: [EDX*4+DEB738]
 


Далее выполняется чтение значения новой таблицы, которое помещается в ECX:

 00DE51C7        8B8D F0E6FFFF           MOV ECX,DWORD PTR SS:[EBP-1910]
 
Здесь идет чтение байтов из ECX в EAX:

 00DE51D6        8B85 D4D0FFFF           MOV EAX,DWORD PTR SS:[EBP-2F2C]
 00DE51DC        8B8D D0D0FFFF           MOV ECX,DWORD PTR SS:[EBP-2F30]
 00DE51E2        8908                    MOV DWORD PTR DS:[EAX],ECX
 00DE51E4        E9 4DFFFFFF             JMP 00DE5136
 
Обратите внимание на эту строчку:

 00DE5149        8B8D 30E8FFFF           MOV ECX, DWORD PTR SS: [EBP-17D0]
 
Здесь



в ECX помещается нехороший адрес



Посмотрим, что он делает дальше:

 00DE516B    031481          ADD EDX,DWORD PTR DS:[ECX+EAX*4]
 
В сумме всегда используется FC9А40 как базовое значение. Запись происходит в EDX, который окончательно дает значение, где он будет сохранять следующие байты таблицы.
Давайте посмотрим, что находится по адресу FC9A40:



Хм, там есть таблица, первое значение которой - 104B (что могло бы быть 40104B), и если опустимся ниже, то увидим



0E 81 48, или же 4E8148 - место, где мы поместили бряк, чтобы отследить изменение байтов. Кажется, что это таблица, указывающая на адреса программы, которые берут значение таблицы IAT, будь то call или jmp, и будут изменены.

Уже что-то… Трассируем дальше:

 00DE51CD    8D0481          LEA EAX,DWORD PTR DS:[ECX+EAX*4]
 
Здесь, беря за основание 3C8310 (которое является началом IAT), формируются байты, которые отвечают за изменения предыдущего входа. У нас есть два места: где происходит чтение таблицы, которая будет меняться, и чтение соответствующего раздела импорта.

Сейчас поставим HARDWARE BREAKPOINT ON EXECUTION в начало этого цикла и уберем все предыдущие бряки.

 00DE5136 8B85 E4D0FFFF MOV EAX, DWORD PTR SS: [EBP-2F1C]
 


Перезапускаем программу, жмем F9 и после чего прервемся в начале цикла

 00DE51C7    8B8D F0E6FFFF   MOV ECX, DWORD PTR SS:[EBP-1910]
 
Здесь идет чтение начала таблицы.
Давайте попробуем скопировать таблицу, начиная с 3C8310, в начало секции rdata, где она должна быть.



Делаем бинарную копию (BINARY COPY), открываем секцию rdata и вставляем (BINARY PASTE).



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



Теперь эта таблица скопирована в нужное место. Сейчас необходимо изменить указатель на таблицу с 3C8310 на 5CA000



Меняем на 5CA000



Дополнительно ставим HARDWARE BREAKPOINT ON WRITE на случай, если кто-то попробует изменить это значение.
Теперь поставим BPM ON WRITE на секцию code, чтобы остановиться на OEP, а также не забудьте снять HARDWARE BPX ON EXECUTION в начале цикла.

Поскольку OEP был 4E8120, идем туда и ставим HARDWARE BPX ON EXECUTION



Запускаем программу (F9).

Ну, вот мы и очутились на OEP.



Как видите, наш CALL имеет более правильный вид. ;)
Наша таблица теперь на нужном месте, и программа работает, как положено.



Вот видите, устрашающий трюк разрушения таблицы был снят заменой всего 4 байт.
В следующей части, мы увидим, как найти магический прыжок, чтобы восстановить таблицу, выполним dump и проверим, нуждается ли он в большом количестве секций для нормальной работы.




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



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


Комментарии к статье: Распаковка Армадилло с IAT Elimination (часть 2)

leon 04.01.2005 15:50:42
А вообще можно сдампить прогу если я не имею серийника для проги?
---
estet 06.01.2005 02:29:22
НЕ понял...
А у кого они есть?!?! ;)
---

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



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


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