Самозащита вредоносного ПО, или отращиваем своему зверьку шипы

    С течением времени программные средства защиты становятся всё лучше и комплекснее: разрабатываются новые проактивные/эвристические алгоритмы обнаружения вредоносных программ, в контексте ИБ начинают применять методы машинного обучения и тд. Авторам вредоносного ПО в свою очередь приходится разрабатывать и применять различные техники защиты, чтобы добиться как можно более широкого распространения их программ до момента обнаружения и образования как можно большего промежутка времени после этого, в течение которого будет создана «сигнатура» в каком-либо виде, позволяющая защитным средствам обнаружить и устранить вредоносную программу.

Собственно защитные методы (кстати использующиеся далеко не только в ВПО) формируют два основных типа:

  • Антианализ (antianalysis)

  • Антиобнаружение (antidetection)

Стоит отметить, что определённые antidetection-техники (полиморфизм, например) также являются antianalysis-техниками.

Антианализ

    Antianalysis-техники применяются с целью усложнить обратную разработку программы. Широко применяются и в легитимном ПО.

Защитные методы этого типа делятся на следующие категории согласно их основной цели:

  1. Обнаружение инструментов анализа
  2. Нарушение нормальной работы/формирования корректного вывода инструментов анализа
  3. Обнаружение виртуальных сред/sandbox-ов/honeypot-ов
  4. Затруднение ручного анализа

Векторы воздействия антианализа

Посмотрим на каждую из них отдельно.

    1. Обнаружение инструментов анализа

    Техники этого типа «делают ставку» на то, что в ходе обратной разработки часто используются широко известные инструменты анализа, редко когда установленные в обычной системе: отладчики (WinDBG, KD, OllyDBG, ImmunityDebugger, x64DBG), анализаторы сетевого трафика (WireShark), средства контроля состояния системы (Process Explorer, Process Hacker). Вредонос может проверить, установлены ли какие-либо анализирующие средства, проверяя имена установленных программ, и если да, то аварийно завершиться, не давая возможности её дальнейшего анализа. Также возможно следить за тем, какие именно процессы/окна в данный момент запущены и нет ли среди них чего нибудь, относящегося к инструментам анализа.

Некоторые методы этой antianalysis-группы используют тот факт, что определённые средства анализа каким-либо образом изменяют состояние целевой программы/системы в целом. Например если в Windows usermodeотладчик подключен к процессу, то значение поля BeingDebugged в его PEB-блоке выставляется в 1, что можно проверить с помощью API IsDebuggerPresent, CheckRemoteDebuggerPresent. Также можно периодически замерять время выполнения критичексих участков кода (RDTSC, в WindowsGetTickCount, NtQueryPerformanceCounter). Если оно необычно большое для выполнения этого кода, то скорее всего к процессу подключён отладчик и где-то на этом участке был поставлен бряк.

Analysis tools detection

Основная цель

Метод

Описание

Обнаружение отладки

Time controlling

Вычисляется время исполнения определённого участка кода; если оно больше определённого значения — процесс отлаживается: время исполнения увеличивается за счет трассировки и точек останова. Для замера временного отрезка можно использовать RDTSC/GetTickCount/NtQueryPerformanceCounter.

[Windows] PEB.BeingDebugged

Значение PEB.BeingDebugged отражает, отлаживается ли программа. Если PEB.BeingDebugged==1 — процесс отлаживается. Значение поля можно считать как прямо из PEB-а, так и с помощью IsDebuggerPresent/CheckRemoteDebuggerPresent.

[Windows] csrss.exe access

Если возможно получить доступ к csrss.exe (OpenProcess c PROCESS_ALL_ACCESS), PID которого можно получить с помощью CsrGetProcessID, процесс отлаживается. Отлаживаемому процессу назначается привилегия SeDebugPriviledge, как раз и позволяющая проводить такого рода действия с csrss.exe.

[Windows] EventPairHandles

Для того, чтобы обрабатывать отладочные исключения, отладчик создаёт event-объект DebugEvent, изменяя состояние EventPair-объекта процесса, где хранится информация об event-объектах процесса.

[Windows] OutputDebugString

Эта WinAPI-функия дает указание отладчику вывести сообщение. Если она будет успешно выполнена (и GetLastError не изменит errCode) — процесс отлаживается.

[Windows] NtQueryObject

Вызвав эту WinAPI-функцию для класса объектов ObjectTypeInformation, можно получить информацию о том, находится ли в данный момент процесс под отладкой.

[Windows] NtQueryInformationProcess/ZwQueryInformationProcess

Вызвав эту WinAPI-функцию, можно получить информацию о том, находится ли в данный момент процесс под отладкой.

[Windows] CloseHandle/NtClose

При закрытии невалидного хендла отлаживаемый процесс выбросит исключение STATUS_INVALID_HANDLE.

[Windows] PEB.ProcessHeap

С помощью значения поля ProcessHeap можно получить информацию, был ли heap процесса создан подключённым к нему отладчиком.

[Windows] PEB.NtGlobalFlag

Содержит информацию о том, как хранятся heap-объекты. Если PEB.NtGlobalFlag==0x70 – процесс отлаживается.

Обнаружение инструментов анализа

Проверка запущенных процессов

Проверяются названия запущенных процессов и созданных ими окон/классов окон. В Windows для этого используются API FindWindow/FindProcess.

Проверка установленных программ

Проверяются названия/возможные следы(например в реестре) установленных в системе программ для анализа

 

    2. Нарушение нормальной работы/формирования корректного вывода инструментов анализа

    Методы этого класса используют различные приемы для того чтобы инструменты анализа выдавали неверные результаты, либо вследствие эксплуатации уязвимостей и недоработок конкретных продуктов происходило их аварийно е завершение.

Analysis tools fooling

Основная цель

Метод

Описание

Нарушение формирования корректного вывода инструмента анализирования

Анти-дизассемблирование

Различные приёмы «обмана» дизассемблеров:

  • JMP-ы на один и тот же адрес

  • Нарушение работы алгоритма разбора кадра стека процедур

  • Обфускация опкодов инструкций

  • Использование некорректных опкодов инструкций

  • JMP-ы на середину инструкции

Создание помех в работе инструмента анализирования

[Windows] BadStringFormat

Используется против отладчика OllyDBG, аварийно завершающегося при обработке определённым образом составленных форматных строк.

 

    3. Обнаружение виртуальных сред/sandbox-ов/honeypot-ов

    Часто, исследуя вредоносные объекты, вирусные аналитики применяют для их изоляции различные виртуальные программные среды. Но есть нюанс в том, что они отличаются по определённым признакам от обычных систем, что и эксплуатируют некоторые antianalysis-техники, позволяя вредоносу определить, что он запущен “в матрице”. Другое дело, что на сегодняшний день виртуализация настолько широко распространена, что некоторые вирмейкеры уже не спешат ограничивать зону действия своих детищ только невиртуальными системами.

Matrix detection

Метод

Описание

Проверка параметров системы

В виртуальных средах определённые параметры существенно отличаются от обычных систем. Характерные признаки виртуальных систем:

  • Малый объем жесткого диска

  • Малый объем оперативной памяти

  • Малое экранное разрешение

  • Минимальное количество установленных программ

Использование специфических процессорных инструкций

Большинство виртуальных систем не в состоянии обработать корректно весь набор инструкций стандартного процессора. Команды такие как RDTSC, SIDT, SGDT, SLDT могут вызвать нарушение нормального функционирования таких сред.

Проверка наличия следов супервизора в системе

Средства виртуализации могут оставлять явные следы своего присутствия:

  • [Windows] Ключи реестра: VirualBox, VMWare создают ключи реестра по определённому пути)

  • Названия установленных/запущенных программ: VirualBox, VMWare предусматривают исполнение своих процессов в гостевой среде для облегчения взаимодействия с основной системой

  • MAC-адреса: некоторые средства виртуализации создают сетевые интерфейсы с MAC-адресами определённого значения в гостевых системах

 

4. Противодействие ручному анализу

    Субъективно, техники этого типа являются лучшими по эффективности и универсальности — методы этой группы «направлены» уже на самих аналитиков, а не на недостатки (с точки зрения вирусного анализа) инструментов, которые они используют; приемы антианализа других типов можно сравнительно легко обойти, либо использовав другие инструменты для анализа либо (получше) скрыв следы их присутствия.

Analyst fooling

Метод

Описание

Шифрование

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

Морфизм (олиго-, поли-, мета-)

Каждый свой цикл исполнения происходит перестановка участков своего тела без нарушения логики работы кода с последующим сохранением в исполняемый файл; таким образом получается перманентно изменяющаяся программа.

Использование упаковщиков/протекторов

Современные упаковщики/протекторы (UPX, Themida, VMProtect, Armadillo, ASPack, …) комплексно подходят к программной защите: при установке протектора в программу как правило встраивается сразу несколько  реализаций antianalysis-техник (набор конкретных техник зачастую можно настраивать).

«Спагетти» код

Организация кода таким образом, чтобы он содержал большое количество JMP-инструкций, часто выбрасывающихся исключений. Такой подход крайне усложняет разбор аналитиком логики работы программы.

Вставка мертвого кода

Встраивание в программу большого количества участков кода, которые заведомо никогда не будут выполнены, вынуждает разрешать огромное количество условных переходов на такие участки и исключать их из анализа.

Вставка бессмысленного кода

Код программы разбавляется инструкциями/последовательностью инструкций, никак не влияющих на логику работы программы, но усложняющих разбор вирусному аналитику.

Динамически вычисляемые адреса

Применяется против статического анализа. Какой-либо адрес , значение которого заранее известно, прямо не указывается. Вместо этого нужное значение вычисляется динамически по определённому алгоритму.

Обфускация импорта

По подключаемым динамическим библиотекам и набору импортируемых из них функций порой можно очень многое предположить о природе исследуемой программы. Для того, чтобы скрыть свои намерения, вредоносная программа может определённым образом исказить свою таблицу импорта, или банально использовать возможность импортирования по ординалу(индексу) функции, а не по её имени (в Windows-системах).

Виртуализация кода

Для затруднения понимания принципов работы программы, может быть применена виртуализация кода. В контексте программы создаётся виртуальная машина со своим набором инструкций, и на исполнение ей подаётся поток таких инструкций. Обратная разработка таких случаев зачастую заключается в разборе набора инструкций виртуальной машины, и постижению назначения отдельных команд с последующим разбором «виртуального кода». В отдельных случаях (VMProtect) в рамках одной виртуальной машины может действовать вложенная виртуальная машина уже с совершенно другим принципом действия и набором команд; таких уровней вложенности потенциально может быть произвольно много.

 

Антиобнаружение

    Основное предназначение antidetection-техник — предотвратить срабатывание антивирусов/файрволов/сетевых фильтров/IPS/IDS и тд. Стоит отметить, что здесь речь идет о преодолении автоматизированных средств, что много лучше встречи «лицом к лицу» с вирусным аналитиком.

Вектор воздействия evasion-техник

Напомню, некоторые antianalysis-техники (шифрование, морфизм, использование упаковщиков/протекторов), также эффективны и против обнаружения.

Antidetection

Метод

Описание

Шифрование

Описание см. в Analyst fooling. В контексте средств скрытия от обнаружения позволяют успешно пройти сигнатурное сопоставление ввиду того, что эти методы единоразово либо постоянно изменяют тело исполняемого файла.

Морфизм

Использование упаковщиков/протекторов

Process hacking

Запускается дочерний процесс, который фактически не имеет исполняемого файла, тк. его тело полностью содержится в теле родительского процесса. Такой трюк позволяет обойти некоторые средства обнаружения.

DLL-injection

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

 

P.S.

    Увлекательная гонка вооружений черных и белых шляп не думает сбавлять обороты и только набирает скорость. На данный момент история дошла до того, что троянская программа может кардинально преобразовывать свое тело и логику работы, подгружая дополнительные обфусцированные/зашифрованные модули по анонимной P2P-сети, не требуя никаких C&C серверов, в то время как по другую сторону в антивирусные продукты интенсивно встраиваются машинное обучение и искусственный интеллект, способный обнаруживать и обезвреживать безо всяких сигнатур новые троянские программы, о которых толком ничего не было известно.

Ставьте попкорн в микроволновку, самое интересное только начинается ;)

 

Leave a Reply

Your email address will not be published. Required fields are marked *