Статья Палим Any.Run сигнатурно

tabac

CPU register
Пользователь
Регистрация
30.09.2018
Сообщения
1 610
Решения
1
Реакции
3 333
Палим Any.Run сигнатурно

полные исходники будут в конце

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

Убедительная просьба после опубликования статьи проверить методы - автор может оперативно заморфить метод и тогда потребуется обновление сигнатур, так как этот антивирусник присутствует на форуме (последний вход - вчера)

И я, честно, в шоке. Я нашел аж 5 методов запалить эту недоподелку. В одном из них тут пойдет речь.

Вот цитата великого человека:
И настанет то время, когда антивирусы будут криптовать свои файлы, чтобы малварь не спалила их сигнатурно (С) Ленин

Думаете бред? Нет лол, ща будем сигнатуры на эниран пилить =D =D.

Вот статистика энирана, думается мне, всех их он тоже подзаебал:

Capture.png


Кто за то, чтобы подзаебать их?


Итак, в результате статьи имеем:


* Сигнатурный движок для проверки всех файлов в System32 на N-е количество сигнатур
* Сигнатуры на x86/x64 файлы Any.Run виртуалки
* Баггерт админа сервиса, который почему-то еще не в -7 за работу на аверов



Требования:


* Visual Studio
* IDA Pro
* Опционально: YARA



Предыстория

В общем, карданули мы с ботов аккаунт Searcher'а на этой виртуалке (хотя там есть Free тарифы) и пошли изучать че да как. В процессах висел какой-то windanr.exe из system32. Мы его залили себе и посмотрели че там да как. Короче че там да как непонятно - эта хрень тупо висит в цикле.

передайте этому аверу, что Sleep принимает параметр INFINITE. Это так, между слов

Capture2.png


Особо оно ниче не делает. В той верхней функции проверяет какую-то static константу на неравенство нуля и делает че то там. Разбираться лень, суть в другом.

Этот код довольно уникален (ух вангую пойдут они морфить его)

Вот скриншот x64 версии:
Capture-3x64.png


Кода меньше, но тоже довольно уникально. Перейдем в HEX и посмотрим че байты:

Это для x86, для x64 делается аналогично. Наводится курсор на начало функции и переходится в окно Hex1

Capture2-signature.png


Для того, чтобы убедиться, что все работает и у нас нет False positive c реальными файлами, мы заюзаем yara. Кто не вкурсе это очень удобный аверский инструмент, чтобы пилить и тестить сигнатуры. Собственно вот сигнатура.

yara-rule.png


В ней содержатся правила для x64 и x86 версии файла. И условие стоит - любой из них.

Проверим...

Запустим на папку с этими флагштоками файлами:

yara-test.png


Видим, что оба успешно спалились. Попробуем запустить на system32, чтобы убедиться, что нет ложных срабатываний.

yara-test2.png


Все ок! Зальем туда файлик, как это у энирана и проверим еще раз :D

yara-test3.png


Кодим детектор пидоров энирана
Disclaimer: нет, тут не будет х#йни про легальность. Хочу сказать, что у меня new подразумевается noexcept, в обучающую статью мне лень было свой рантайм с перегрузкой копировать. Просто перегрузите new на VirtualAlloc. // я это написал чтоб избежать возможных будущих говн

Итак, я решил абстрагироваться, поэтому мой код будет в виде абстрактного класса. Сигнатуры будут задаваться при помощи linked list. Мы сможем задавать сколь угодно сигнатур.

Нам необходимо реализовать минимальную функциональность yara: Any of them. Этим и займемся. Мы можем, конечно, заюзать саму yara, но это тяжелое решение, да и статья обучающая в какой-то мере.

code3.png


Примерно вот так это выглядит.

Обратите внимание, чтобы создать инстанс такого класса нам понадобится оператор new, чтобы заполнить vftable. Из-за тяжелости оператора его можно перегрузить на VirtualAlloc. Инициализатор vftable компилятор добавляет в неявном виде сразу после оператора new

В комментариях все ясно что принимает и почему.

sglist заполняется в отдельной функции:

code1.png


Постепенно в список добавляет 2 сигнатуры. Думаю никому не надо объяснять, как работает linked list. Если надо, то погуглите - начальные азы алгоритмов.

где signatures_num - это наши сигнатуры с яры:

code2.png


Я привык выделять конструкторы и деструкторы в отдельные функции Run и Destroy. Из деструктора вызывается также Destroy

code4.png


Это то как выглядит Run, пробегается по списку сигнатур и вызывает функцию проверки массива на эту сигнатуру. Сама та функция работает примерно как функция поиска подстроки в строке, только вместо end-символа используется заранее известный размер.

Вот, кстати, она:
code5.png


Думаю тут все предельно понятно. Интересно, я так говорю потому что я этот код писал 10 минут назад, или потому что тут правда все предельно понятно? :rofl:

Затестим наш код выполнив стандартный тест. Сделаем массив, содержащий сигнатуру и запустим на него сканер:

code-test1.png


Тест успешно прошел. Номер сигнатуры верно вернул.

Осталось приебашить гвоздями и флагштоками поиск файлов, маппинг файлов и их проверку через Run.

code-test2.png


Видим, что все работает.

Тестирование на Any.Run

Зальем на x64 версию вм:

index.png


Спалило по первой сигнатуре :D

Ура!

Скачать сорцы бесплатно и с флагштоками:

https://www.sendspace.com/file/i376dt
пароль exploit.in

сорри, я кодил укуренным. Там утечка памяти в Main. Кто нибудь, удалите этот поганый инстанс scanner. Спасибо
ПыСы:Меня тут постепенно отпускает. В перерыве между марихуаной и гашишем я тут увидел еще одну херовинку. В конце signature_exist пропишете флагшток в жопу return FALSE; Я х#й знает как это работало раньше. Магия косяка :)


автор: ibenji
взято с exploit
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Но в любом случае any.run сделан достаточно качественно, правда... с этим моментов они могли бы сделать драйвер - но видно им лень на это деньги тратить.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх