Се­год­ня мы раз­берем­ся с нес­тандар­тным про­тек­тором ElecKey и пос­мотрим, как защита при­ложе­ния может быть ском­про­мети­рова­на. Попут­но выяс­ним, почему стан­дар­тные инс­тру­мен­ты дам­пинга не справ­ляют­ся с этой задачей, най­дем обходной путь и напишем неболь­шой демонс­тра­цион­ный скрипт.

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, отку­да вызыва­ется эта про­цеду­ра.

Вызов процедуры в IDA
Вы­зов про­цеду­ры в IDA

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

Что ж, вво­дим пра­виль­ный OEP в соот­ветс­тву­ющее поле окна Scylla и видим, что теперь и авто­поиск IAT работа­ет, и импорты в нем похожи на нас­тоящие.

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

Бо­лее‑менее тол­ковая статья об этом есть на сай­те DataDump, и, про­читав ее, мы поп­робу­ем при­кинуть, что в сдам­плен­ном модуле не так.

От­кро­ем исходную и сдам­плен­ную прог­раммы в CFF Explorer и срав­ним кар­ты сек­ций.

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

Прав­да, пос­ле фик­са эта сек­ция вос­ста­нав­лива­ется (что вид­но на пре­дыду­щем скрин­шоте), но при этом воз­можны какие‑то необ­ратимые изме­нения. Обыч­но опе­раци­онная сис­тема на подоб­ные чудачес­тва Scylla смот­рит бла­гос­клон­но, но это не отме­няет проб­лемы в нашем слу­чае — сдам­плен­ный и пофик­сенный образ она упор­но отка­зыва­ется заг­ружать. И даже для того, что­бы понять, почему имен­но, нуж­но совер­шить слиш­ком мно­го слож­ных телод­вижений, ныряя в нед­ра ядра, чего сов­сем не хочет­ся делать для сня­тия отно­ситель­но прос­того про­тек­тора.

Да­вай задума­емся: а нуж­но ли вооб­ще реконс­тру­иро­вать импорт в нашем слу­чае? Воз­можно, мы ломим­ся в откры­тую дверь? Дей­стви­тель­но, IAT находит­ся в сек­ции .rdata, которая никак не зашиф­рована и не запако­вана. Если в заголов­ке сдам­плен­ного модуля руками поменять ука­затель IAT с вос­ста­нов­ленно­го на исходный, а потом заг­рузить модуль в дизас­сем­блер IDA, то код вызова импорти­руемых фун­кций на пер­вый взгляд кажет­ся впол­не работос­пособ­ным. Более того, судя по все­му, кро­ме рас­шифров­ки сек­ции .text, пос­ле дам­па изме­нений в осталь­ных сек­циях не наб­люда­ется, даже раз­меры при­мер­но сох­раня­ются с точ­ностью до вырав­нивания.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии