Автоматический подбор сигнатурДоброе здрасте! Речь в статье пойдёт о необычных антивирусных сигнатурах для 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
|