warning
Статья имеет ознакомительный характер и публикуется в образовательных целях. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Продолжим нашу экскурсию по разным экзотическим протекторам и их внутреннему миру. На этот раз нам попался достаточно редкий тип защиты — ElecKey, поэтому мы поступим с ним более сурово, чем обычно. Мы не будем ограничиваться патчами, проксями и рекомендациями, как писать собственные декрипторы, а просто возьмем и снимем защиту начисто.
Предположим, у нас имеется некое нативное приложение, исполняемый код которого зашифрован или запакован с высокой степенью энтропии. Detect It Easy выдает о протекторе следующую информацию:
PE64
Operation system: Windows(10)[AMD64, 64-bit, GUI]
Linker: Microsoft Linker(14.44.35221)
Compiler: Microsoft Visual C/C (19.44.35221)[C ]
Language: C
Tool: Microsoft Visual Studio(2022, 17.14)
Sign tool: Windows Authenticode(2.0)[PKCS #7]
Protector: ElecKey(2.00.X)
(Heur)Protection: Generic[Stack-push address near EP Section #0 (".text") has RWX]
(Heur)Packer: Generic[Last section EP Sections like ElecKey Section #0 (".text") compressed High entropy]
Требуется снять с программы протектор, получив работоспособный код, прозрачный для реверса и патчинга. Поскольку программа на нашем компьютере запускается и работает полнофункционально, у нас есть все шансы, что эту задачу можно решить при помощи дампа. «Хакер» уже публиковал статьи о том, как это сделать, да и в моих предыдущих статьях мы неоднократно дампили приложения из отладчика x64dbg при помощи плагина Scylla. Попробуем и на этот раз пойти тем же путем, благо программа запускается под отладчиком и позволяет себя прервать.
К сожалению, этот план дает сбой уже на стадии автоопределения IAT.

Можно было бы поискать IAT руками, но, похоже, корень проблемы кроется в неправильной точке входа OEP, поэтому начнем с ее поиска. Для начала попробуем прервать программу и по стеку возвратов отследить верхний вызов из нее.

Загрузим сдампленный вариант в IDA и посмотрим на этот вызов в дизассемблированном коде.

Очень похоже на стартовый код приложения на C. Посмотрим в IDA, откуда вызывается эта процедура.

Похоже, адрес в сдампленном коде EC596C (RVA=25596C) и есть искомая точка входа программы. Этот адрес можно было бы получить через трассу или поставив точку останова на секцию ., содержащую расшифрованный исполняемый код, но оба этих способа имеют определенные нюансы. Поэтому если можно найти точку входа путем теоретических изысканий в IDA, то проще сделать именно так.
Что ж, вводим правильный OEP в соответствующее поле окна Scylla и видим, что теперь и автопоиск IAT работает, и импорты в нем похожи на настоящие.

Убираем из списка импортов последние невалидные, дампим программу и фиксим полученный дамп. К сожалению, чуда не произошло: сдампленная программа не запускается (и даже не грузится в отладчик x64dbg), вылетая с ошибкой C000007B (НЕКОРРЕКТНЫЙ ФОРМАТ ОБРАЗА). Явно Scylla что‑то нахимичила при дампе, и беда в том, что «Майкрософт» не предусмотрел никаких наводящих подсказок, чем именно формат образа не подходит под высокие стандарты его загрузки.
Более‑менее толковая статья об этом есть на сайте DataDump, и, прочитав ее, мы попробуем прикинуть, что в сдампленном модуле не так.
Откроем исходную и сдампленную программы в CFF Explorer и сравним карты секций.

Видно, что размеры секций поменялись, причем Scylla добавила свою собственную секцию, в которую поместила восстановленный по ее усмотрению IAT. Вроде по размерам все сходится, причем, похоже, все данные находятся на своих местах. Однако внушает подозрения пустая маленькая секция . размером всего 0x200 байт. При дампе Scylla почему‑то делает ее пустой и пересекающейся со следующей за ней секцией ., что превращает образ в однозначно некорректный.

Правда, после фикса эта секция восстанавливается (что видно на предыдущем скриншоте), но при этом возможны какие‑то необратимые изменения. Обычно операционная система на подобные чудачества Scylla смотрит благосклонно, но это не отменяет проблемы в нашем случае — сдампленный и пофиксенный образ она упорно отказывается загружать. И даже для того, чтобы понять, почему именно, нужно совершить слишком много сложных телодвижений, ныряя в недра ядра, чего совсем не хочется делать для снятия относительно простого протектора.
Давай задумаемся: а нужно ли вообще реконструировать импорт в нашем случае? Возможно, мы ломимся в открытую дверь? Действительно, IAT находится в секции ., которая никак не зашифрована и не запакована. Если в заголовке сдампленного модуля руками поменять указатель IAT с восстановленного на исходный, а потом загрузить модуль в дизассемблер IDA, то код вызова импортируемых функций на первый взгляд кажется вполне работоспособным. Более того, судя по всему, кроме расшифровки секции ., после дампа изменений в остальных секциях не наблюдается, даже размеры примерно сохраняются с точностью до выравнивания.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
