Bluepill -это структура динамического анализа с открытым исходным кодом для обработки уклончивой вредоносной программы. Его цель состоит в том, чтобы согласовать свойства прозрачности, необходимые для автоматического анализа с мелкозернистыми возможностями выполнения и исправления, необходимыми для ручного анализа.
Bluepill - это академический прототип, который мы поддерживаем в свободное время: ваши отзывы драгоценны!
Bluepill может противостоять многим красным таблеткам, нацеленным на гипервизоров, отладчиков, сторонних инструментов и артефактов времени. Он основывается на динамических бинарных инструментах (DBI) для мониторинга запросов, которые вредоносное ПО может сделать в окружающей среде в поисках артефактов, изменяя их результаты, когда они могут выявить наличие автоматизированной системы анализа или человека. Bluepill предлагает удаленный интерфейс GDB для отладки образца, заботясь о уклонениях имени аналитиков, а также новые механизмы исправления стелсов, чтобы скрыть изменения кода, сделанные в отладчике от схем самостоятельного изучения.
Мы протестировали BluePill на гетерогенном вредоносном ПО PE32 Windows, работающем на 32-битной Windows 7 SP1: в качестве примера мы можем запускать исполнительные файлы, защищенные недавними версиями VMProtect и Themida, и очень уклончивые образцы, такие как FURTIM.
BluePill был представлен в:
Чтобы противостоять уклоне DBI, Bluepill использует библиотеку смягчений, которую мы написали для PIN Intel в рамках нашей бумаги SOK: использование динамических бинарных инструментов для безопасности (и как вас могут поймать с поличным) из ASIACCS 2019. В Bluepill мы расширили библиотеку с дальнейшими смягчающими нанесениями времени и Red Таблетки, нацеленные на рекрепию GDB-рекрепию. Вы можете прочитать больше о уклонениях от DBI в статье , оценивающих динамические бинарные системы инструментов для заметных функций и артефактов, недавно появившихся в ACM DTRAP (Preprint).
Ниже частичный список чертежа уклонения, противостоявшего нашим тестам на 32-разрядной машине Virtualbox 5.2 Windows 7 SP1 для большого счета исполняемых защитников и бронированных образцов:
| Категория | Экземпляры |
|---|---|
| Гипервизор | Дополнения гостей, файлы, записи реестра, библиотеки и драйверы из VirtualBox |
| Аппаратное обеспечение | Bios and Persdware Strings, MAC -адрес, cpuid , размер диска, мощность/тепловые возможности |
| Время | Обнаружение замедления с использованием API-интерфейсов rtdsc и Windows |
| Программное обеспечение | Артефакты общих инструментов мониторинга (запуск процессов, окна графического интерфейса), родительский процесс, макет клавиатуры HKL, курсор замороженной мыши |
| Отладка | Одностадийные исключения, int 2d , запросы ОС для активных/установленных отладчиков (например, NtQueryInformationProcess ), поля блока входа процесса |
| WMI Запросы | ЦП, размер диска, MAC -адрес, ACPI, MUI Languages, VirtualBox VBOXVIDEO |
| DBI | Утечки указателя с помощью инструкций FPU, содержимого памяти и разрешений (например, страницы Guard, NX обеспечение соблюдения) |
Примечание. Перед тем, как стать публичной для BH Europe 2019, мы внесли радикальные изменения, которые нарушили обработку 64-битного кода и (в небольшой степени) подсистемы WOW64: пожалуйста, рассмотрите эти сценарии экспериментальными по мере завершения регрессионных испытаний и не стесняйтесь сообщать о проблемах.
Bluepill Builds на PIN Intel (v3.16) и требует Visual Studio 2015 или выше для его компиляции.
PIN имеет некоторые зависимости, которые требуют ручного включения в проект. Мы создали файл Locals.props , который упрощает конфигурацию проекта. Его значения по умолчанию - это булавка, установленная в C:Pin316 , и используемые заголовки SDK 8.1:
<PropertyGroup Label="UserMacros">
<PinFolder>C:Pin316</PinFolder>
<WinHPath>C:/Program Files (x86)/Windows Kits/8.1/Include/um</WinHPath>
</PropertyGroup>
Например, если вы хотите использовать заголовки SDK 10.0.17763.0, после изменения настроек проекта в Visual Studio также следует изменить значение свойства WinHPath на C:/Program Files/Windows Kits/10/Include/10.0.17763.0/um . Сравните, измените значение свойства, если ваши заголовки SDK 8.1 установлены в C:/Program Files/ вместо C:/Program Files (x86)/ . Цель этого поля состоит в том, чтобы помочь PIN, когда он включает в себя абсолютный путь Windows.h из его заголовков CRT.
Теперь вы должны иметь возможность компилировать BluePill. Как только компиляция закончится, вы найдете библиотеку bluepill32.dll в каталоге PIN. Если вы столкнетесь с отсутствующей ошибкой msvc_compat.h , убедитесь, что $(PinFolder)extrascrtinclude является действительным путем.
Чтобы запустить исполняемый файл в соответствии с использованием чертежа:
C:Pin316pin.exe -t bluepill32.dll [options] -- <file.exe>
Bluepill поддерживает следующие параметры командной строки:
| Вариант | Значение |
|---|---|
-evasions | Обнаружение и обработку большинства поддерживаемых уклонков (см. Ниже для DBI) |
-debugger | Включить режим отладчика через удаленный интерфейс GDB |
-leak | Уклонение от DBI: исправить утечки реального EIP (например, инструкции FPU) |
-nx | Уклонение от DBI: проверьте, что кодовые страницы выполняются |
-rw | Уклонение от DBI: скрыть страницы, которые принадлежат двигателю DBI |
Например, для запуска уклончивой программы с именем sample.exe в автоматическом режиме, подобном песочнице, попробуйте:
C:Pin316pin.exe -t bluepill32.dll -evasions -leak -- sample.exe
Включение смягчения -leak оказывает минимальное воздействие на производительность, в то время как -nx и, в конечном счете, -rw могут помочь со сложными упаковщиками, которые пытаются проверить соответствие в адресном пространстве программы.
Bluepill создаст файл с именем evasions.log под папкой PIN C:Pin316 (изменить переменную LOGPATH внутри pintoolsrclogging.h , чтобы изменить ее), которая регистрирует возможные попытки уклонения, перехватываемые во время выполнения.
Bluepill поддерживает использование отладчика для управления выполнением и проведения рассечения вредоносных программ. Мы полагаемся на удаленный интерфейс PIN -кода GDB: таким образом, Bluepill можно использовать в качестве удаленного бэкэнда из вашего инструмента отладчика, если он поддерживает протокол GDB. Далее мы предоставляем инструкции по настройке сеанса отладки с IDA Pro.
Чтобы включить интерфейс отладчика, вам необходимо предоставить дополнительные параметры командной строки как для Pin ( -appdebug -appdebug_server_port <port> ), так и Bluepill ( -debugger ) следующим образом:
C:Pin316pin.exe -appdebug —appdebug_server_port 10000 -t bluepill32.dll -debugger [other options] -- <file.exe>
Мы будем использовать 10000 в качестве номера порта в этом руководстве. Приложение останется приостановленным до тех пор, пока вы не подключите отладчик к розетку: однако, если вы попытаетесь прикрепить локальный отладчик к процессу, вы в конечном итоге отладки всего пин -двигателя вместо приложения. Ожидаемый вывод на экране будет чем -то вроде:

Теперь вы можете открыть исполняемый файл в IDA и выбрать бэкэнд от Debugger от Debugger от Debugger->Switch debugger . Убедитесь, что параметры (например, номер порта) являются правильными с помощью Debugger->Process options как на экране ниже:

На этом этапе он помогает вставить точку останова на некотором адресе в основном исполняемом разделе, например, в точке записи. Затем вы можете начать сеанс отладки с Debugger->Start process . IDA уведомит вас, что «Уже есть процесс, который будет отлаживаться удаленным. Вы хотите прикрепить к нему?» Полем Просто нажмите «Да» , и начнется сеанс отладки, а EIP находится где -то внутри в ntdll.dll.
Поскольку информация о отображении памяти по умолчанию не доступна по протоколу удаленного протокола GDB, мы добавили пользовательскую команду отладчика vmmap , которая инструктирует Bluepill для создания такой карты. Мы автоматизировали этот процесс с помощью Script addSegments.py , доступный в scripts/ папке: просто загрузите его в IDA с File->Script file . Сценарий заполнит подвеску сегментов IDA информацией о макете памяти (т.е. разделы и их разрешения) для каждого кодового модуля. ПРИМЕЧАНИЕ. Вскоре мы добавим код для обновления модуля, который в настоящее время остается устаревшим.
Теперь вы можете отлаживать свой образец, поскольку Bluepill защищает вас от множества уклонений :-)
Обратите внимание, что обработка исключений требует обходного пути для текущей поддержки сервера GDB в PIN. Когда исключение не должно быть передано в приложение (например, 0xc0000008 для неверной ручки, переданной в Close Handle), отправьте команду wait в консоли GDB сразу после получения сообщения об исключении, затем отключите и восстановите IDA к BluePill. В то же время, помощник отладчика будет держать исполняемый файл в ответ в ответ на команду.
Примечание. Первоначально мы полагались на трюк отключения также для других видов исключений. Для них вновь введенные изменения в некотором выпуске PIN-кода после 3,5 Один из них приводят к внутреннему сбое утверждения при переборе отладчика ( A: Source Pinvm Debugger-Connection Debugger-Connection.cpp: pinvm :: Debugger_connection :: notifyThreadSstopped: 1004: assertion не удалось : A: sourcepinvmdebugger-connectiondebugger-connection.cpp: PINVM::DEBUGGER_CONNECTION::NotifyThreadsStopped: 1004: assertion failed: focus != PIN::INVALID_THREADID Поэтому, когда вы столкнетесь с исключением 0xc0000005 из OpCode int 3 или уклонения int 2d , вы передаете исключение из приложения. Интерфейс PIN -кода отладчика не будет обнаружен напрямую, но противник все еще может сделать это, используя Write Watch. В настоящее время мы думаем о обходном пути, чтобы защитить такие артефакты.
BluePill реализует уникальную функциональность для исправления кодовой части при отладке, скрывая ее от выполняемого кода. Применяемый патч по-прежнему невидимы для схем анти-врушивания (например, последовательностей самоуверенного нарушения), поскольку он взволнован в сочетании с механизмом PIN-кода JIT. Короче говоря, мы переделываем компиляцию JIT, чтобы добавить батуты, которые переопределяют скомпилированные (оригинальные) инструкции и остаются незамеченными механизмами защиты кода, поскольку чтения памяти продолжают перенаправляться на оригинальные инструкции программы.
Создание патча разделено на три шага:
Рассмотрим блок кода на изображении ниже, и предположим, что мы хотим перезаписать mov ebp, esp Инструкцию по адресу 0x771X37A5 с помощью инструкции mov eax, esp ( 89 e0 в двоичном), а затем сделать резюме выполнения по адресу 0x771X37A8 .

Когда BluePill работает в режиме отладчика, мы можем наставлять PIN для исправлений через пользовательскую команду GDB: set_<START_ADDR>_<END_ADDR>_<CONT_ADDR>_<PATCH_CODE_BYTES> , с адресами, выраженными в виде HEX и байтов кода, разделенных с помощью COMMA. Для примера выше мы можем использовать: set_771c37a6_771c37a6_771c37a8_89,e0 .
Затем исправления могут быть просто удалены, используя другую пользовательскую команду GDB: rm_<START_ADDR>_<END_ADDR> .
Если вы используете BluePill в академическом проекте или считаете, что он подходит для некоторого раздела для обсуждения в вашей статье, мы были бы благодарны, если бы вы могли ссылаться на нашу работу, используя следующую запись Bibtex:
@ARTICLE{BluePill,
author={D'Elia, Daniele Cono and Coppa, Emilio and Palmaro, Federico and Cavallaro, Lorenzo},
journal={IEEE Transactions on Information Forensics and Security},
title={On the Dissection of Evasive Malware},
year={2020},
volume={15},
number={},
pages={2750-2765},
doi={10.1109/TIFS.2020.2976559}}