ОБФУСКАЦИЯ И ЕЕ ПРЕОДОЛЕНИЕ

КРИС КАСПЕРСКИ АКА МЫЩЪХ

Спецвыпуск: Хакер, номер #066, стр. 066-008-2

[как говорят медики], СПИД — это еще не приговор. То же самое с обфускацией. Далеко не каждый обфускатор использует продвинутые методики «запутывания», поэтому не нужно высаживаться на измену, когда слышишь это слово.

В простейшем случае полиморфный генератор просто «накачивает» программу кучей ничего не значащих команд типа nop, xchg reg,reg, никогда не выполняющимися переходами типа xor reg,reg/jnz junk, где xor — значимая команда, а junk — «мертвый код».

or ch, ch ; «мусор», не воздействующий на регистр ch, но воздействующий на регистр флагов, однако это воздействие перекрывается последующим xor

xor eax,eax ; потенциально значимая команда

seto bl ; «мусор», устанавливающий bl в 1, если есть переполнение, а после xor его всегда нет

repne jnz short loc_43409A ; «мусор», передающий управление, если не ноль, но после xor флаг нуля всегда установлен, плюс бессмысленный префикс repne

rep jnp short loc_43408D ; «мусор», передающий управление, если нечет, но после xor флаг четности всегда установлен

jo short loc_434094 ; «мусор», передающий управление, если флаг переполнения установлен, а он сброшен xor

xchg ebx,ebx ; «мусор», обмен регистров ebx местами

Не слишком сложный скрипт для IDA PRO найдет все явно незначимые команды и пометит их как «мусорные» или же вовсе удалит. Ильфак уже давно написал highlighter — плагин, предназначенный как раз для этой цели. Распространяется в исходных текстах на бесплатной основе: www.hexblog.com/ida_pro/files/highlighter.zip.

Впрочем, эта бесплатность весьма условна. Чтобы скомпилировать плагин, нужен IDA SDK, причем не какой-нибудь, а только последней версии. Другими словами, большинству пользователей IDA Pro не удастся скомпилировать его, но не стоит впадать в расстройство: точно такую же штуку можно реализовать и самостоятельно, используя язык скриптов, встроенный в IDA Pro. Потратишь буквально полчаса (сам язык подробно описан в книге «Образ мышления — IDA PRO», ее электронную версию можно бесплатно скачать с сервера ftp://nezumi.org.ru).

[более сложные обфускаторы] «перемешивают» код, закручивая поток управления в запутанную спираль условных/безусловных переходов, использующих технику «перекрытия» команд. Некоторые байты принадлежат сразу двум, а в некоторых случаях и трем (!) машинным инструкциям, что «ослепляет» дизассемблеры, заставляя их генерировать неполный и неправильный листинг.

Однако в интерактивном режиме (хвала IDA Pro) все-таки можно дизассемблировать код, но очень уж утомительно. Лучше воспользоваться трассером, генерирующим листинг реально выполняемых машинных команд. Заодно избавляемся от части мусора и «мертвого» кода.

фрагмент листинга, сгенерированный IDA Pro. демонстрация техники «перекрытия» машинных команд, используемой обфускаторами

.adata:0043400E loc_43400E: ; CODE XREF: .adata:00434023j

.adata:0043400E ; .adata:loc_43401A j

.adata:0043400E mov eax, 0EBB907EBh

.adata:00434013

.adata:00434013 loc_434013: ; CODE XREF: .adata:loc_43401Dj

Назад на стр. 066-008-1  Содержание  Вперед на стр. 066-008-3
ttfb: 2.9540061950684 ms