Rambler's
Top100

Ручная распаковка UPX версий ниже 1.20 или как снять Scrambler

Автор: FEUERRADER
Дата: 24.05.2003
Раздел: Reverse Engineering

Ручная распаковка UPX версий ниже 1.20 или как снять Scrambler

Эта статья - основана на статье "Ручная распаковка UPX", автора WBR, Spawn (WWW.REVERSING.NET) Инструменты: TRW2000 или SoftIce, Win32Dasm, LordPE Deluxe by Y0da, ImpREC 1.4.2+ by MackT, uCF, HIEW by SEH

Предисловие: однажды я задумался: "А почему это версии UPX<1.20 не распаковываются автоАНпакерами?". Непорядок! Решил не парить мозги и опробывать метод ручной распаковки для UPX. Набрел на статью, указанную выше, но немного разочаровался в ней. Как мне показалось, статья написана несколько мутновато (я имею ввиду для новичков)...вот решил исправить этот недостаток. Попробую описать процесс распаковки понятным даже для новичков в RE.

Исследование: конечно, UPX - простейшей пакер, не криптер, поэтому распаковка - наглядная и понятная. Возьмем для распаковки прогу Active Phone Server 9.18 (туториал по взлому). ЕХЕ упакован UPX 0.72. Сам себя этот UPX не распаковывает + автоматические анпакеры виснут на этой версии. Итак, во-первых найдем OEP (оригинальная точка входа в программу). Сунем aon.exe в Win32Dasm (версию 9.0 можно найти тут). Теперь в главном меню Search->FindText. Пишем текст для поиска строки в дизассемблированном тексте: "popad"
То есть ищем инструкцию конца процедуры распаковки самого EXEшника. Нажимаем FIND 1 раз, ищем подобные строки:


:0042A18A 240F        and al, 0F
:0042A18C C1E010      shl eax, 10
:0042A18F 668B07      mov ax, word ptr [edi]
:0042A192 83C702      add edi, 00000002
:0042A195 EBE2        jmp 0042A179

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042A173(C)
|
:0042A197 61          popad        <<- вот она POPA-конец распаковки ЕХЕ
:0042A198 E99BDBFDFF  jmp 00407D38 <<- JMP OEP!
:0042A19D 55          push ebp
:0042A19E 50          push eax
:0042A19F 58          pop eax

Если нет подобного - жми FIND, пока не найдешь, но после POPAD обязательно должен быть JMP. Итак, OEP=407D38h. Теперь надо зациклить программу. Есть для этого 2 способа: 1) исправить исходный код в ЕХЕ 2) исправить исходный код "на лету".

1 способ. В HIEW вводим 0ffset=42A195h (9D98h). Заменяем инструкцию перехода на JMP 0042A198 (опкод EBFE). Если инструкция больше 2 байт, то забиваем остальное NOP'ами. То есть:
Было: E99BDBFDFF
Стало: EBFE909090

2 способ. В отладчике: BPX 42A198. При прерывании: a eip; jmp eip. Нажать F5. Прога зациклена.

Снимаем дамп: запускаем зацикленную прогу (если не использовался 2 способ). Запускаем LordPE, ищем в списке процессов upx.exe, щелкаем правой кнопкой, далее full dump. Загружаем полученный дамп в PE Editor. Пропишем точку входа, расчитывается она так: OEP-ImageBase. У нас это будет: 407D38h - 400000h = 7D38h. Дамп практически готов, но запускать его еще нельзя.

Следующим шагом при распаковке является восстановление импорта.
В ImpREC выбираем из списка процессов нашу зацикленную прогу. ImpREC имеет полезную функцию - IAT AutoSearch, используем ее. Для этого введем найденный нами OEP (7D38h) и нажмем кнопку. Получаем ответ "Found something!" с пояснением, что типа не факт, что результат правильный. Давим "Get Import" и смотрим что получилось. Хотя автоматический поиск иногда и ошибается, бывает это в основном при нахождении импорта у программ запакованных, чем-нибудь покруче, чем UPX. Сейчас можно убить зацикленную прогу, чтобы не мешалась в памяти, она нам больше не нужна. Теперь вставим импорт в наш дамп. Посмотрим в PE Editor-e, по какому адресу в дампе находится Import Table - это адрес 00020000h. Перейдем обратно в IMPREC, снимем галку с add new section и впишем RVA таблицы импорта (00020000h) и жмем Fix dump. Теперь дамп полностью восстановлен, это теперь распакованная программа. Можно заниматься ее отладкой.

Вроде бы все, но ведь не зря статья называется "Как снять scrambler". Скрэмблер для UPX - это такая тулза, которая в файле, упакованном UPX, заменяет все слова "UPX" и всё, что с ним связано. Снимать scrambler-просто. Для этого я пользую HIEW. Открываю пакованный файл. Далее заменяю название секций (их 3) на
UPX0
UPX1
.rsrc
Обычно после скрэмблера секции называются так:
CODE
TEXT
.rsrc
Далее после номера версии (напр. 1.20 или 1.24) пишем байты: нулевой байт+три байта слова UPX+восклицательный знак+байт $OC. Если сделать все правильно, то сам UPX с параметром -d распакует прогу.

Удачи всем в распаковке программ!



Все права защищены ©  2003 
...::FEUERRADER::...




Rambler's Top100