Автор: 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":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 распакует прогу.
Удачи всем в распаковке программ!