DotFix :: Портал разработки и защиты программ
Главная
Программы
Статьи
Разное
Форум
Контакты
Автор: GPcH. Дата публикации: 07.09.2004

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

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

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



Служит он, как можно догадаться из названия, для усложнения распаковки 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 штук, каждый раз при этом новая процедура раскриптовки вновь криптуется, а ниже дописывается раскриптовщик. "Так что же из себя представляется криптовка?", спросите Вы. Ниже я приведу процедуру дешифровки, чтобы все встало на свои места:

CODE NOW!

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



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

CODE NOW!

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 ; ставим бряк сюда



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

CODE NOW!

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 процедур.



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

CODE NOW!

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) байта. Чуть Выше будет:

CODE NOW!

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 и получаем полноценный рабочий дамп.



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

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

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



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

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

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

CODE NOW!
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 сам исправляет Image Size, а то пришлось бы еще писать процедуру его расчета после изменения числа и размера секций.

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

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

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

Комментарии
Добавил: Zak Дата: 07.09.2004

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

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

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


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

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

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

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

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



04.09.2011 Долгожданный релиз VB Decompiler. Масса улучшений декомпиляции Native Code. Значительно расширенна и обновлена справочная система на русском и английском языках.
20.12.2010 DotFix Software поздравляет наших клиентов и посетителей сайта с наступающим Новым Годом и рождеством! Желаем приятно провести праздники и успехов в новом году!
28.11.2010 Выпущена новая версия защиты DotFix NiceProtect. Основные изменения коснулись обфускатора Delphi программ. Теперь имеется полная поддержка Tab и Page контролов на формах, что обеспечивает максимальную совместимость обфускации с Delphi XE программами.
21.10.2010 Обновлен декомпилятор Visual Basic программ до версии 8.1. Декомпиляция P-Code программ становится все более идеальной, также проделана большая работа по улучшению анализа Native Code и .NET приложений.
16.09.2009 Полностью обновлен движок сайта! Теперь все ссылки имеют читаемый понятный вид, разного рода глюки на страницах убраны. И теперь сайт полноценно работает на второй версии нашего движка.
Архив новостей
Яндекс цитирования

Движок сайта: DotFix Engine v0.2
Администрация сайта: