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