_|________ ______|_ ____: /_ ____\ :______ __|____ _____|____|_________ | | \__ \_ |___ | |_ / / _| (_________________/_________________) TEAM-53 TUTORiALS PACK NUMBER EiGHTTEEN Ручная распаковка UPX * Введение * Начинаем работать... * Снятие дампа и нахождение OEP * Восстановление импорта * Заключение Введение Цель данной статьи объяснить начинающим "анпакерам" основы этого интересного занятия. Что позволит (я надеюсь!) после разобраться и в более сложных защитах. UPX - это отличный пакер выполняемых файлов, поддерживает множество форматов: PE, ELF, ... А главное распространяется по лицензии GNU, т.е абсолютно бесплатен. Скачать UPX можно здесь {http://upx.sourceforge.net} Хочу сразу заметить =UPX не является протектором EXE= и, что с какой-то из версий, у UPX появился ключ -d , который позволяет распаковать запакованную программу. Но в некоторых случаях воспользоваться встроенным распаковщиком не удастся. Например, если сделать некоторые изменения в заголовке PE. Вот об этих случаях мы и поговорим. В качестве цели я выбрал сам компрессор UPX. Исследование я проводил, используя операционную систему Windows XP и следующие инструменты: * SoftIce v4.x (из driver studio 2.6) или HIEW * Дизассемблер IdaPro 4.15 * LordPE 1.31 by yoda (FREEWARE) - в качестве дампера и pe editor-а * ImpREConstructor v1.4.2+ by MackT, uCF - для восстановления импорта. Начинаем работать... Итак, начнем. То, что upx.exe запакован UPXом можно не сомневаться, просто посмотрите любым вьювером заголовок файла, там будет такая строчка 1.20 UPX! Сейчас его можно спокойно распаковать самим UPX. Сделаем так, чтобы это было не возможным - запустите LordPE и выберите rebuild pe - upx.exe. LordPE изменил выравнивание у секций, и несколько оптимизировал заголовок. После такой обработки при попытке распаковать, UPX выдает "not packed by UPX" - то чего мы и добивались. Теперь этот файл спасет только ручной анпак. Снятие дампа и нахождение OEP Чтобы найти OEP загружаем UPX в IDA. Получили такой листинг: UPX1:00433340 public start UPX1:00433340 start: UPX1:00433340 pusha ; здесь началась распаковка, ищем popa UPX1:00433341 mov esi, offset dword_41E000 UPX1:00433346 lea edi, [esi-1D000h] UPX1:0043334C push edi UPX1:0043334D or ebp, 0FFFFFFFFh Пролистаем несколько страниц вниз, и вот в самом конце start-а нашли: UPX1:0043348E popa UPX1:0043348F jmp loc_41F141 ; переход на распакованную программу 41F141h - это оригинальная точка входа, запишем ее. Теперь остается только поставить бряк в SICE на 43348F и зациклить программу, либо проделать тоже самое только через HIEW. Теперь снимаем дамп. Переходим в LordPE, ищем в списке процессов upx.exe, делаем full dump. Далее, загружаем _дамп_ в PE Editor и пропишем точку входа 41F141h - 400000h = 1F141h Дамп практически готов, но запускать его еще нельзя. Восстановление импорта Следующим шагом при распаковке является восстановление импорта. Для этого используем ImpREC, ну или Revirgin , правда последний не работает под XP. В ImpREC выбираем из списка процессов UPX. ImpREC имеет полезную функцию - IAT AutoSearch, используем ее. Для этого введем найденный нами OEP и нажмем кнопку. Получаем ответ "Found something!" с пояснением, что типа не факт, что результат правильный. Давим "Get Import" и смотрим что получилось. Хотя автоматический поиск иногда и ошибается, бывает это в основном при нахождении импорта у программ запакованных, чем-нибудь покруче, чем UPX :) Если не верите мне на слово , проверьте в SICE , что творится по адресам, которые выдал IMPREC [0001F141h] - [0001F141h+148] Замечу, что Import восстановился нормально сразу, нет необходимости в дальнейшем трейсе. Все это потому что UPX, как я уже говорил, не является протектором, и поэтому импорт в отличие от злого Asprotect-а не портит. Сейчас можно прибить UPX, чтобы не мешался в памяти, он нам больше не нужен. Теперь вставим импорт в наш дамп. Посмотрим в PE Editor-e, по какому адресу в дампе находится Import Table - это адрес 00034344h. Перейдем обратно в IMPREC, снимем галку с add new section и впишем RVA таблицы импорта (00034344h) и жмем Fix dump. Все - UPX повержен!!! :) Хочу сказать, большое спасибо Kola за написание статьи "Исследование защиты на основе ASProtect", которая была взята за основу при написании этой статьи. WBR, Spawn