BluePill是用于处理避孕恶意软件的开源动态分析框架。它的目标是调和自动分析所需的透明度属性,并与手动分析所需的细粒度执行检查和修补功能。
Bluepill是我们在业余时间保持的学术原型:您的反馈是宝贵的!
Bluepill可以对抗许多针对管理程序,辩论者,第三方工具和正时工件的红色药丸。它建立在动态二进制仪器(DBI)的基础上,以监视恶意软件可以在环境中寻找工件的查询,并在可能揭示自动分析系统或人类代理的存在时改变其结果。 BluePill提供了一个GDB远程接口来调试样品,同时代表分析师的逃避,以及一种新的隐形修补机制,以隐藏自核对计划中调试器中对代码更改的隐藏。
我们在32位Windows 7 SP1上运行的异质PE32 Windows恶意软件上测试了Bluepill:例如,我们可以运行使用最新版本的VMPROTECT和THEMIDA以及高度回避示例(如Furtim)的可执行文件。
Bluepill已在:
为了抵抗DBI逃避,Bluepill使用了我们为Intel Pin编写的缓解库作为纸质SOK的一部分:使用动态二元仪器进行安全性(以及如何被Asiaccss 2019中的红手手抓住)。在BluePill中,我们将库的库以超高的速度和红色丸剂的进一步差异为gdb远程进行了差异,我们将库扩展了库。您可以在论文中阅读有关DBI逃避的更多信息,以评估最近出现在ACM DTRAP(Preprint)中的明显特征的动态二进制仪器系统。
在Windows 7 SP1 32位VirtualBox 5.2机器上,在我们的测试中反驳的Evasions Bluepill的部分列表下方,用于大量可执行的保护器和装甲样品:
| 类别 | 实例 |
|---|---|
| 管理程序 | 来自VirtualBox的来宾添加,文件,注册表条目,库和驱动程序 |
| 硬件 | BIOS和固件字符串,MAC地址, cpuid ,磁盘尺寸,功率/热功能 |
| 时间 | 使用rtdsc和Windows时间相关的API降低检测 |
| 软件 | 通用监控工具(运行过程,GUI窗口),父进程,HKL键盘布局,冷冻鼠标光标的工件 |
| 调试 | 单步例外, int 2d ,活动/安装辩论者的OS查询(例如NtQueryInformationProcess ),过程输入块字段 |
| WMI查询 | CPU,磁盘尺寸,MAC地址,ACPI,MUI语言,VirtualBox VBOXVIDEO |
| DBI | 指针泄漏使用FPU说明,内存内容和权限(例如,后卫页面,nx执行) |
注意:在2019年BH Europe上公开上市之前,我们进行了根本性的更改,以打破了WOW64子系统的64位代码和(在很小的范围内)的处理:在我们完成回归测试时,请考虑这些场景实验,并随时报告问题。
Bluepill建立在Intel Pin(建议的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)/情况下,请修改属性值。该字段的目的是在包含Windows.h的绝对路径时协助PIN。
您现在应该能够编译Bluepill。汇编结束后,您将在PIN目录中找到bluepill32.dll库。如果遇到缺失的msvc_compat.h错误,请确保$(PinFolder)extrascrtinclude是有效的路径。
在BluePill下运行可执行文件:
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下(修改pintoolsrclogging.h内的LOGPATH变量以更改它),以记录执行过程中可能截取的逃避尝试。
Bluepill支持使用调试器来控制执行并进行恶意软件解剖。我们依靠PIN的GDB远程接口:BluePill,如果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作为端口号。该应用程序将保持暂停,直到将调试器连接到插座上:但是,如果您尝试将本地调试器附加到该过程中,则最终将进行调试整个PIN引擎,而不仅仅是应用程序。屏幕上的预期输出将是:

现在,您可以在IDA中打开可执行文件,并从Debugger->Switch debugger中选择远程GDB调试器后端。检查选项(例如端口号)是否使用Debugger->Process options正确(例如端口号),例如以下屏幕截图:

在这一点上,它有助于插入主要可执行文件部分中的某些地址的断点,例如入口处。然后,您可以使用Debugger->Start process开始调试会话。艾达会通知您: “远程已经有一个过程正在调试。您想附加吗?” 。只需单击“是” ,调试会话将开始,EIP在ntdll.dll中的某个地方。
由于默认情况下,在GDB远程协议上默认不提供内存映射信息,因此我们添加了一个自定义调试器命令vmmap该命令vmmap指示BluePill构建此类映射。我们使用脚本addSegments.py在scripts/文件夹中可用:只需将其File->Script file到IDA中,将其加载到IDA中。该脚本将使用每个代码模块的内存布局信息(即章节及其权限)填充IDA的片段子视图。注意:我们很快将添加代码以更新当前保持现成的模块子视图。
现在,您可以将样本调试,因为Bluepill会使您免受大量逃避的影响:-)
请注意,例外处理需要PIN中当前GDB服务器支持的解决方法。如果不应将例外传递给应用程序(例如,通过无效的句柄传递给MoxserHandle的0xc0000008 ),请在收到异常消息后立即在GDB控制台中发送一个wait命令,然后断开连接并将IDA重新连接到BluePill。同时,调试器助手将根据命令保持可执行文件。
注意:我们最初也依靠其他例外类型的脱节技巧。 For them, newly introduced changes in some Pin release after the 3.5 one lead to an internal assertion failure when reattaching the debugger ( A: sourcepinvmdebugger-connectiondebugger-connection.cpp: PINVM::DEBUGGER_CONNECTION::NotifyThreadsStopped: 1004: assertion failed: focus != PIN::INVALID_THREADID ).因此,当您面对int 3 OPODE或int 2d逃避的0xc0000005异常时,您将异常传递给应用程序。 PIN的调试器接口将无法直接检测到,但是对手可能仍然使用写入手表来做到这一点。我们目前正在考虑解决此类文物的解决方法。
BluePill实现了独特的功能,可以在将代码藏在执行代码的同时,以修补代码部分。施加的贴片仍然与抗抑制方案(例如自我检查序列)保持不可见,因为它与PIN的JIT机理相连。简而言之,我们重做JIT汇编以添加越来越覆盖(原始)指令的蹦床,并且不受代码保护机制的注意,因为内存读取不断被重定向到原始程序指令。
补丁的创建分为三个步骤:
考虑下图中的代码块,假设我们要覆盖MOV EBP,带有MOV EAX的地址为0x771X37A5 mov ebp, esp指令mov eax, esp指令(89 E0中的89 e0 ),然后在地址0x771X37A8上进行执行简历。

当BluePill处于调试模式下操作时,我们可以通过自定义GDB命令指示PIN用于补丁: set_<START_ADDR>_<END_ADDR>_<CONT_ADDR>_<PATCH_CODE_BYTES> ,其地址为kex号码和代码补丁字节,并由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}}