Современные решения

для защиты Windows приложений

и восстановления исходного кода
Автор: Сергей Чубченко. Дата публикации: 07.09.2004

Распаковываем UPX Shit v0.06


[Вступление]

Начнем с того, для чего вообще нужна данная статья. В первую очередь для того, чтобы научить начинающих исследователей кода распаковывать малоизвестный криптор под не менее странным названием UPX Shit.

PEiD

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

[Нам понадобятся]

1. Olly Debugger
2. Lord PE
3. ImpREC
4. PEiD
5. PE Rebuilder
6. Resource Rebuilder
7. Мозги

[Работа защиты]

Данный криптор отыскать в сети нельзя, им защищен только PEiD. Это не странно, так как автор криптора является главным автором PEiD’а. Так вот, что же вообще из себя представляет защита? При первой обработке EXE файла, сначала шифруется 171 байт с начала OEP. Это не что иное, как код распаковщика UPX. Затем ниже дописывается код распаковщика этих байт и байты раскриптовщика вновь шифруются. Функция дешифровки опять дописывается ниже. Таких извращений производится 17 штук, каждый раз при этом новая процедура раскриптовки вновь криптуется, а ниже дописывается раскриптовщик. Так что же из себя представляется криптовка, спросите Вы. Ниже я приведу процедуру дешифровки, чтобы все встало на свои места:

MOV EAX,PEiD.004611CB MOV ECX,15 XOR BYTE PTR DS:[EAX+ECX],7F LOOPD SHORT PEiD.004611EB JMP PEiD.004611CC

Как видите - это обычный XOR. Взглянув на это, первое что мне пришло в голову - похожесть алгоритма на многие другие шифровщики точки входа. Как ни странно, схожие идеи часто лезут в голову совершенно незнакомым друг с другом программистам. Что ж, определимся с принципом распаковки подобного. Загружаем Olly и ставим бряк на первый jmp после OEP. Он выглядит так:

004611E1 B8 CB114600 MOV EAX,PEiD.004611CB 004611E6 B9 15000000 MOV ECX,15 004611EB 803408 7F XOR BYTE PTR DS:[EAX+ECX],7F 004611EF E2 FA LOOPD SHORT PEiD.004611EB 004611F1 E9 D6FFFFFF JMP PEiD.004611CC ; ставим бряк сюда

Когда бряк сработает, код выше раскриптуется и мы увидим осмысленные инструкции. А если выражаться правильнее, то чуть выше появится подобная процедура:

004611CC B8 B6114600 MOV EAX,PEiD.004611B6 004611D1 B9 15000000 MOV ECX,15 004611D6 803408 7F XOR BYTE PTR DS:[EAX+ECX],7F 004611DA E2 FA LOOPD SHORT PEiD.004611D6 004611DC E9 D6FFFFFF JMP PEiD.004611B7

Не трудно догадаться, что процедура полностью повторяет предыдущую, только раскриптовывется другой код. Опять ставим бряк на jmp, получаем еще одну такую же процедуру и таким нехитрым методом проходим 17 процедур.

OllyDbg

Тяжело, но мы справимся. Последняя процедура раскриптовки будет выглядеть так:

00461091 B8 1F0F4600 MOV EAX,PEiD.00460F1F 00461096 B9 71010000 MOV ECX,171 0046109B 803408 7F XOR BYTE PTR DS:[EAX+ECX],7F 0046109F E2 FA LOOPD SHORT PEiD.0046109B 004610A1 E9 7AFEFFFF MP PEiD.00460F20

Данную процедуру легко отличить от предыдущих. В ней производится раскриптовка не 21 (15h), а 369 (171h) байта. Чуть Выше будет:

0046108B 61 POPAD 0046108C E9 73C4FEFF JMP PEiD.0044D504

Это стандартный переход на OEP, так как упаковщик UPX. Вообще, мой совет новичкам - упакуйте какую-нибудь программу всеми простыми упаковщиками и посмотрите, что они пишут в точку входа (EP). Это сильно облегчит Вам определение упаковщика в спорных ситуациях или когда PEiD выдает неверные данные. Но мы отвлеклись. В вышеприведенном куске кода JMP PEiD.0044D504 это и есть прыжок на оригинальную точку входа (OEP), так что можно считать, что OEP - 0044D504. Ставим бряк на 0046108C (там производится прыжок на OEP) и дампим программу с помощью Lord PE. Запускаем Lord PE, выбираем в списке процессов PEiD.exe, щелкаем правой кнопкой и выбираем пункт "Dump full". Все, теперь мы имеем нормальный дамп, правда пока не работоспособный.

Остановимся непосредственно на работе защиты. Меня лично сразу смутило то, что после кода распаковщика осталось столько нулей (байтов с кодом 00h), чтобы впихнуть аж 17 процедур криптовщика. Как ни странно, но до работы процедуры распаковщика мы можем делать с памятью этой секции практически все что угодно, так как все равно наш код в последствии будет затерт нужными байтами после распаковки программы. Но, это работает не всегда и не всегда есть столько нулей после кода распаковщика, поэтому данный криптор не всегда сможет защитить EXE файл, при этом сохраняя его работоспособность. Видимо именно поэтому автор UPX Shit (Snaker) решил не выкладывать криптор на всеобщее скачивание.

[Восстанавливаем импорт]

Надеюсь, что вы еще не закрыли Olly, так как брякнутый на OEP процесс нам еще понадобится для получения из него импорта. Запускаем ImpREC и выбираем в списке процессов "PEiD.exe". Теперь вводим найденный нами OEP в строку "OEP". Не забудем вычесть из него значение Image Base, которое как ни странно стандартно - 400000. Щелкаем по кнопке "IAT AutoSearch", затем жмем "Get Imports" и получаем нормальную таблицу импорта. Щелкаем по кнопке "Fix Dump", выбираем сдампенный EXE и получаем полноценный рабочий дамп.

ImpREC

Как ни странно, ничего нового. Импорт восстанавливается стандартно.

[Делаем ребилд]

Думаю не помешает перекомпоновать импорт и ресурсы в дампе, сделав ребилд. Для этого есть специальная программа RebuildPE, но я пользуюсь специальным плагином для PEiD, который делает аналогичную операцию. Ссылка на него пролетала на форуме PEiD’а. Открываем дамп PEiD’а в самом PEiD’е (прикольно), выбираем плагин и жмем кнопку "Rebuild".

PEiD

Все, теперь EXE файл приведен в норму. Осталось восстановить ресурсы.

[Восстановление ресурсов]

Данная процедура является на мой взгляд самой трудоемкой из всех процедур, выполняемых при распаковке простых упаковщиков. В принципе она может пригодиться для русификации программы, изменения интерфейса или более детального изучения программы в дизассемблере или декомпиляторе. В любом случае - это вершина распаковки. После восстановления ресурсов можно смело утверждать, что вы полностью восстановили EXE файл программы и теперь он больше всего похож на оригинальный после компилирования. Для восстановления ресурсов я использовал Resource Rebuilder v1.0 by Dr.Golova, который можно скачать на wasm’е. Хотя это и консольная программа - она лучшая на мой (и не только) взгляд. Запускаем из командной строки:

resrebld.exe dumped.exe .rsrc

и получаем полностью восстановленную секцию ресурсов в файле ".rsrc", который нам вскоре очень понадобится. Теперь откроем Lord PE, щелкнем по кнопке "PE Editor" и укажем путь к дампу. Далее щелкаем по кнопке "Sections", затем по очереди удаляем две последние секции ("_mackt" и ".rsrc"), для этого щелкаем по ним правой кнопкой мыши и выбираем сначала "truncate at end of section", чтобы удалить секцию, а затем "wipe section header", чтобы убрать запись о ней в заголовке файла. Такую операцию проводим с обеими секциями. А теперь жмем правую кнопку на любой секции и выбираем пункт "load section from disk..." и выбираем наш ".rsrc" файл.

Lord PE - PE Editor

Вот и все, ресурсы восстановлены. Как хорошо, что Lord PE сам исправляет Image Size, а то пришлось бы еще писать процедуру его расчета после изменения числа и размера секций.

Рано радуетесь. EXE файл опять не работоспособен, так как данными манипуляциями мы повредили импорт. Надеюсь, что у Вас еще открыт ImpREC с восстановленным ранее импортом, тогда просто жмем "Fix Dump", иначе придется повторить процедуру восстановления импорта с самого начала.

[Заключение]

Вот и распаковали мы с Вами UPX Shit. Зачем? Думаю вскоре выйдет немало подобных крипторов и полученные знания очень пригодятся. Надеюсь что данная статья помогла Вам получить ответы на многие вопросы, возникающие при распаковке программ, также мы с Вами научились восстанавливать ресурсы, что мало где описано.
Надеюсь, что данная статья Вам была полезна. Спасибо за интерес к данной статье.

Комментарии

Добавил: Zak Дата: 07.09.2004

Неплохая статья!!!!

Добавил: Admin Дата: 08.09.2004

Спасибо, старался. В общем давно была мысль описать распаковку PEiD'а, только вломы было :)


Добавление комментария


Ваше имя (на форуме):

Ваш пароль (на форуме):

Комментарии могут добавлять только пользователи,
зарегистрированные на форуме данного сайта. Если Вы не
зарегистрированы, то сначала зарегистрируйтесь тут

Комментарий: