|
||||||||||||||||||||||||||||||||||||||
Автор: 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 штук, каждый раз при этом новая процедура раскриптовки вновь криптуется, а ниже дописывается раскриптовщик. "Так что же из себя представляется криптовка?", спросите Вы. Ниже я приведу процедуру дешифровки, чтобы все встало на свои места:
Как видите - это обычный XOR. Взглянув на это первое, что мне пришло в голову - похожесть алгоритма на мою программу DotFix FakeSigner. Как ни странно, схожие идеи часто лезут в голову совершенно незнакомым друг с другом программистам. Что ж, определимся с принципом распаковки подобного. Загружаем Olly и ставим бряк на первый jmp после OEP. Он выглядит так:
Когда бряк сработает, код выше раскриптуется и мы увидим осмысленные инструкции. А если выражаться правильнее, то чуть выше появится подобная процедура:
Не трудно догадаться, что процедура полностью повторяет предыдущую, только раскриптовывется другой код. Опять ставим бряк на jmp, получаем еще одну такую же процедуру и таким макаром проходим 17 процедур. ![]() Тяжело, но мы справимся. Последняя процедура раскриптовки будет выглядеть так:
Данную процедуру легко отличить от предыдущих. В ней производится раскриптовка не 21 (15h), а 369 (171h) байта. Чуть Выше будет:
Это стандартный переход на 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’е. Хотя это и консольная прога - она лучшая на мой (и не только) взгляд. Запускаем из командной строки:
и получаем полностью восстановленную секцию ресурсов в файле ".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. Думаю, что данная статья помогла Вам получить ответы на многие вопросы, возникающие при распаковке программ, также мы с Вами научились восстанавливать ресурсы, что мало где описано. Надеюсь, что данная статья Вам пригодится. Спасибо за интерес к данной статье.
|
|
| |||||||||||||||||||||||||||||||||||