Как нам известно, целью проактивного сканирования, является предотвращение заражения системы пользователя.
Об этом мы сегодня и поговорим.
Основные виды проактивного сканирования:
- Эвристический анализ
Один из методов детектирования, работает на основе сканирования приложения на малварьные паттерны.
- Эмуляция
Простыми словами, эмуляция представляет из себя хуки апи-функций, при эмуляции, антивирус доставляет в процесс свою dll - которая при загрузке перехватывает интересующие WinApi функции, и анализирует их вызовы.
Основная ошибка паблик-антиэмуляций заключается в создании среды, суть которой уход в глубину трансляции сегмента, в следствии с большой вероятностью возникает остановка сканирования по таймауту с неопределенным обнаружением.
Антиэмуляционные приемы ожидающие вызовов системных событий по типу “нажми на кнопку”, не работают, точно так же как и sleep’ы в циклах.
Немного о загрузчиках:
В основном под вышеописанные задачи используется алгоритм RunPE, который как видно из названия, запускает приложение в памяти, ничего особенного в нем нет, данный метод загрузки устарел, является неэффективным.
Первая ссылка из гугла:
Алгоритм данного загрузчика заключается в создании остановленного процесса, и мэппинга имопортов из таблицы.
LoadPE- метод загрузки, который подразумевает выполнение приложения в своей памяти, используется упаковщиками.
Данный метод загрузки сложнее в реализации, но в разы эффективнее предыдущего, работает по следующему алгоритму:
мэппит структуры PE в свое пространство (импорты, релокации, тлс), дополнительных процессов не создается.
Немного о крипто-контейнерах:
Все мы знаем, что в упаковщиках содержится зашифрованный оригинал исполняемого файла, который расшифровывается после запуска, и выполняется в памяти.
С виду все достаточно неплохо, но все не так просто как вам показалось с первого взгляда, при распаковке контейнера в памяти, подключаются модули динамического сканирования, и при нахождении определенной сигнатуры – моментально прерывают эмуляцию, и возвращают код детекта.
Некоторые антивирусы брутят первые байты контейнера, при нахождении сигнатуры 0x4D, 0X5A(MZ), детектят в лучшем случае как упаковщик.
В большинстве случаев проблема решается помещением крипто-контейнера с первыми рандомными байтами, и заменой MZ после распаковки.
И если с эвристическим методом - все достаточно просто, то с эмуляцией все намного веселее.
Давайте расмотрим как её обойти:1. не вызывать хукнутые функции, не вызываем подозрений, не вызывав ни 1-й, а реализовав эту функцию у себя в коде.
2. вызывать функции напрямую, без мэппинга в таблицу импортов.
3. использовать системные вызовы
На самом деле существует целый ряд методов обхода эмуляции, некоторые из них перечислю ниже:
- Замена высокоуровневых апи-вызовов на низкоуровневые системные вызовы (x64 syscall/x86 sysenter).
- Полиморфная распаковка крипто-контейнеров.
- Динамическая защита памяти на основе хардварных треков.
Данные методы выходят за рамки статьи, и достойны целой серии.
Данная статья создана исключительно для ознакомления и не призывает к действиям!