Автоматический подбор сигнатур


Доброе здрасте!

Речь в статье пойдёт о необычных антивирусных сигнатурах для PE-файлов.

Например, такие продукты как Avira, Emsisoft, Avast могут назвать файл вредоносным, даже если в коде нет ничего, кроме MessageBoxA и ExitProcess. На лицо ложное срабатывание!

Логично предположить, что такой вердикт не зависит от эмулятора программного кода. Ответ кроется в структуре файла, таким образом, ложный детект выдаётся без глубокой проверки. Есть множество способов обойти эмулятор и скрыть попавшие в сигнатуру байты. Но данная ситуация более фундаментальна, детект выдаётся без анализа содержимого.

Я говорю именно про такую ситуацию, когда содержимое pe-файла сомнений не вызывает: легальный импорт, код, данные etc. У каждого антивируса своя система проверок, импорт может входить в ту сигнатуру, о которой пойдёт речь. Из всего этого мы делаем вывод, что в описываемой ситуации бесполезно искать сигнатуру, затирая отдельные части исходного файла.

Итак, под структурой файла я буду иметь в виду:

  • структуру секций: имена, размер\соотношение размеров, порядок;
  • энтропию секций.

Сигнатуры - вещь крайне текучая, если не сказать однодневная. Дабы не быть голословным, я покажу несколько файлов.

Тот самый файл, отображающий сообщение, рассмотрим на примерах.

1) имена
 - 3 секции: .text .rdata .data.
 - При проверке - (Avira)TRCrypt.XPACK.Gen.
 - Изменим имя секции .rdata (например, на .sdata)  - (Avira) OK.
 
2) порядок 
 - 3 секции .data .sdata .text.
 - При проверке - (Avira)TRCrypt.XPACK.Gen. 
 - Переставим секции местами: .text .data .sdata - (Avira) OK.
 - Последняя исполняемая секция может намекать на заражение файла.

3) размеры
 - 3 секции .text (Raw Size = 00000600) .sdata (Raw Size = 00000200) .data (Raw Size = 00006600).	
 - При проверке - (Avira)TRDropper.Gen.
 - 3 секции: .text (Raw Size = 00003400) .sdata (Raw Size = 00000200) .data (Raw Size = 00006600) - (Avira) OK.
 - Нормальное соотношение размеров убирает детект.
 
4) энтропия
 - 3 секции .text (entropy = 3.79) .sdata (entropy = 1.12) .data (entropy = 7.79).
 - При проверке - (emsisoft) Gen.Trojan.Heur.FU.
 - разбавим энтропию последней секции.
 - .text (entropy = 3.79) .sdata (entropy = 1.12) .data (entropy = 3.77) - (emsisoft) OK.

Все эти характеристики могут сложиться в сигнатуру, описывающую наш файл. Разумеется, обычный компилятор выдаёт статичную структуру секций, но если файл собирает криптор - об этом не может быть и речи. Для меня подобные сигнатуры стали последней преградой перед сокрытием файлов от антивирусов.

Я пробовал разные варианты, искал универсальное решение. В итоге я пришёл к тому, что удобнее всего искать подходящую структуру файла аналитически. Подбор всех возможных вариантов (размер\энтропия) на заданном интервале, с последующей проверкой антивирусом, дал огромный отчёт из повторяющихся значений. Анализировать его вручную затруднительно, общие закономерности искались на графиках. Именно тогда я понял, на сколько важен размер секции. К сожалению, полный перебор файлов для поиска сигнатур бесперспективен. Но можно понять общие принципы, и находить подходящую структуру станет проще.

Для иллюстрации идеи я написал fasm-based генератор. Сам по себе он ничего полезного не делает. Но в руках аналитика может стать инструментом для быстрой чистки. Всё просто: мы задаём значение энтропии, и генератор создаёт блок данных с приблизительно такой же энтропией. Данные вставляются в файл, выравнивая (через повторения) секцию до нужного размера. В итоге, получаем файл с заданными размером секций и энтропией. Код файла и структуру секций можно менять, для этого и используется компилятор fasm.

Генератор принимает 4 параметра через командную строку, первые два параметра - размеры секций в хексе, и вторые два - их энтропия. В названии выходного файла будет фактический размер двух секций и их энтропия. Запусти "gen.exe 1000 1000 1 1" - создаёт файл с заданным размером секций и энтропией. На маленьких файлах будут отклонения из-за размера\энтропия данных стаба, также, принимай во внимание выравнивание секций. Подробности смотри в masm исходнике. Ок, я прикладываю этот файл чисто как пример, буду рад, если ты решишь развить эту тему в нечто более серьёзное.

Поиграем с параметрами:

	>1000 1000 0 8
	code(00001200 0.4879)data(00001200 7.6350)
	(BitDefender) Trojan.CryptRedol.Gen.5
	..
	code(00001200 0.4879)data(00001200 6.5290)
	(BitDefender) Trojan.CryptRedol.Gen.5
	..
	code(00001200 0.4879)data(00001200 5.6044)
	(BitDefender)  OK

Сделав несколько генераций, "пошатав" параметры генератора и\или структуру секций в разные стороны - находим "чистую" структуру файла.

	>29000 C00 6 6
	code(00029200 5.9925)data(00000E00 5.4932)
	(BitDefender) Gen:Variant.Zusy.66894
	
	code(00029200 3.9720)data(00000E00 3.6716)
	(BitDefender) Gen:Variant.Symmi.657

	уберем секцию ресурсов из stub.asm
	code(00029200 3.9721)data(00000E00 3.6740)
	(BitDefender) ok

такие дела.


Исходники: sources/valentin_p/autosign


______________________________
valentin_p
http://coru.ws
2013

Inception E-Zine