ОБФУСКАЦИЯ И ЕЕ ПРЕОДОЛЕНИЕ КРИС КАСПЕРСКИ АКА МЫЩЪХ Спецвыпуск: Хакер, номер #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 |