由于云端杀毒的流行,病毒基本上都会加上anti-sandboxes手段来躲避沙箱的探测,在这点上,由于一些原因,最近也一直在做这一块,所以算是总结一下吧。
一:什么是沙箱以及其他:
根据受控环境中的观察行为确定文件是否恶意。沙箱允许恶意软件执行所有恶意操作,并记录生成的行为。过了一段时间后,分析停止,检查结果并扫描典型的恶意行为模式。基于行为的恶意软件检测仅在观察文件在其分析期间实际执行恶意操作时有效。如果 - 无论什么原因 - 在分析过程中都没有执行有害的操作,则沙箱得出结论:被检查的文件是良性的。
所以,这也得出了anti-sandboxes的两种方式,一种是检测到沙箱之后,直接退出进程,另一种就是检测在沙箱时,显示良性行为。
anti-sandbox大致可以分为三种类型:
1:直接检查沙箱
2:利用沙箱的一些缺陷进行检测
3:利用运行时环境进行检测
二:沙箱anti方式
1:直接检查沙箱
关于沙箱的检查,其实任何和正常主机不相似的地方都可以作为anti方法。这里选取几种特别典型的方式
1:检测设备名:
通过使用诸如SetupDiGetClassDevsA,SetupDiEnumDeviceInfo和SetupDiGetDeviceRegistryPropertyA之类的API枚举设备细节来检测虚拟化软件的存在。在枚举之后,可以将其与Sandboxes中使用的已知值(如VMware Pointing,VMware Accelerated,VMware SCSI,VMware SVGA,VMware Replay,VMware服务器内存,CWSandbox,Virtual HD,QEMU等)进行比较,下面是一个病毒对于sandboxes的检测:
2.利用注册表进行查询:
注册表的查询各种各样,这里选取一些经典的例子:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Disk\Enum 像vmware,qume,xen等虚拟化产品的值为0。
除此之外,类似于 HKEY_CLASSES_ROOT\Applications\VMwareHostOpen.exe 还有
KEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\VideoBiosVersion等等.....
3.利用硬件信息:
这里包括但不限于:productId(在注册表里可以查),productName,mac地址以及CPUID等等........这里的原理在于,每一个沙箱沙箱的产品的这些信息一般是相同的。
4.进程遍历:
一个沙箱里,总有运行一些敏感的进程,做类似于hook或者其他的操作,一般使用Process32First()/Process32Next()进行便利,下面是一些常见的进程名称:
"VBoxTray.exe"
"VBoxService.exe"
"VMwareUser.exe"
"VMwareTray.exe"
"VMUpgradeHelper.exe"
"vmtoolsd.exe"
"vmacthlp.exe"
....
5.特有模块查询:
这里的一般的套路是:
沙盒在一个进程中注入模块以记录其执行的活动。由于安全沙箱使用的某些模块名称是公开的,因此它们被病毒用来通过以下方法来检测沙箱的存在:在模块名称上调用GetModuleHandleA()。如果返回的句柄为非空,则表示模块已加载。它通过调用 FreeLibrary()来卸载。一旦完成,沙箱将不会记录恶意软件执行的任何活动。病毒经常搜索的常见模块名称是dbghelp.dll,sbiedll.dll等。
6.SSDT和shadowSSDT等结构进行校验:
一般在沙箱中,需要对一个SSDT的函数指针进行hook,病毒可以通过加载内核模块,并进行读取。得到原始的ssdt表,利用zwSystemControlDebug(windows xp以前)函数读取内存中的ssdt表,进行比较校验。
7.内核驱动遍历:
不同的虚拟机都一些相关的驱动模块,可以利用zwSystemcontrolDebug函数进行遍历
2:利用沙箱的一些缺陷进行检测
明确寻找沙箱的存在可以在分析过程中被检测为可疑活动。因此,更高级的恶意软件方法利用了沙箱技术中的弱点,无需检测即可执行操作。通过利用这些沙箱的弱点,恶意软件无需担心即使在沙盒系统中执行也被检测到。
大多数沙盒在客户端进行监控,即将代码,进程,挂钩等放在分析环境中。如果这些修改被撤销或规避,则沙箱就不会起作用的 - 换句话说,分析环境的可见性将会丢失。可以采取以下形式:
- 钩子去除
- 可以通过恢复原始指令或数据来删除钩
- 钩规避
- 通过使用直接的系统调用代替API,调用私有函数(no hook)或执行未对齐的函数调用(跳过“挂钩代码”),可以避免钩子。我们可以在本分析报告 中看到一个例子, 其中检测到恶意软件使用非法的API来启动和破坏explorer.exe和regedit.exe。虽然这个问题可以通过这些特定内部函数的钩子解决,但是在操作系统中存在许多这些问题,并且它们随着每个Windows版本而变化。而且,通过挂钩,不能很好地解决未对齐的函数调用问题。
- 系统文件替换:
- 挂钩通常驻留在映射到内存中的系统文件中。某些恶意软件将取消映射这些文件并重新加载它们。新加载的文件版本然后是“未挂钩”
内核代码。许多沙盒不能监视系统的内核代码或启动过程:晦涩的文件格式:许多沙箱不支持所有文件格式
- Powershell,.hta,.dzip等是一些文件格式的例子,这些文件格式可能会在沙盒环境中滑倒,而且无法执行
- ·系统文件替换:
- 挂钩通常驻留在映射到内存中的系统文件中。某些恶意软件将取消映射这些文件并重新加载它们。新加载的文件版本然后是“未挂钩”
- 内核代码。许多沙盒不能监视系统的内核代码或启动过程:
- 晦涩的文件格式:许多沙箱不支持所有文件格式
- Powershell,.hta,.dzip等是一些文件格式的例子,这些文件格式可能会在沙盒环境中滑倒,而且无法执行。
- 许多沙箱不支持所有技术。虽然最初的感染向量(例如,具有宏的Word文档)可能会打开,并且宏在沙箱中运行,但宏将下载并运行使用隐藏的分析隐藏技术的有效内容。
- 操作系统重启:
- 许多沙盒无法在重新启动后生存。某些系统尝试通过重新登录用户来模拟重新启动,但是可以检测到这一点,并且不会执行所有重新启动的触发器。
通过简单地压制目标分析环境,恶意软件也可以避免使用这种粗略但有时有效的方法进行分析。例如,
- 一些沙箱仅支持一定大小的文件,例如10 MB
- 其他人不支持多个压缩层
3:利用运行时环境进行检测
1.最常见的技术之一是延迟执行一段时间,因为沙箱通常只运行几分钟的采样。与许多其他逃避技术一样,特别是使用时间炸弹是一个持续的猫和老鼠游戏:恶意软件睡着了,沙箱尝试检测睡眠并缩短时间,恶意软件检测缩短的时间,沙盒试图隐藏时间向前还更新系统计时器等。
技术包括:
简单到非常复杂的睡眠,例如彼此观看或相互依赖的并发线程。
仅在特定时间或特定日期执行,例如星期一或上午12点或3月12日。
如,通过注入数百万个无效的任意系统调用,除了减慢执行速度,特别是在被监视或仿真的环境中执行时,会显着降低执行速度。
- 系统事件
- 仅在关机,重新启动或有人登录或关闭后才能生效。
- 图2显示了一个示例,其中仅在重新启动后才将二级有效负载下拉。我们可以在VTI分数中看到可执行文件由恶意软件(初始有效载荷)安装,这将在启动后自动运行。正是这个启动过程获取第二个有效载荷。
3.用户互动
- 等待鼠标移动(但不要太快,因为这是一个沙盒)或键盘输入。
- 与某些应用程序进行交互,例如浏览器,电子邮件,Skype,在线银行应用程序。
- 假安装程序:恶意软件只有在用户单击多个按钮并检查各种复选框后才会激活(参见图2)。
- 具有恶意嵌入式内容的Office文档:当用户向下滚动(查看)或单击时,恶意内容才会生效。
4.检测特定的目标系统
复杂的有针对性的恶意软件只适用于预期的目标系统。标识通常基于当前用户名,时区,键盘布局,IP地址或其他系统工件。支票本身可以通过各种方式完成,从简单到非常复杂的方法。
- 简单检查包括字符串检查。
- 如果预期的目标环境不知道,复杂检查(例如,从环境设置中获取的散列解密)几乎不可破坏。
如果恶意软件确定它在预期的目标环境中,则只进入第二阶段(即下载主要有效载荷)。
初生牛犊:Windows下Anti-sandboxes技术探究的更多相关文章
-
Windows 下多线程编程技术
(1) 线程的创建:(主要以下2种) CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID lParam, int nPrio ...
-
Windows下查看硬连接引用技术
Win10有了bash,可以方便的进入并用ll查看文件的硬连接数. 但是用powershell直接查看就比较麻烦了,比较曲折的找到了方法: fsutil hardlink list [filename ...
-
[技术博客] 利用Vagrant+virtualbox在windows下进行linux开发
目录 加速box安装的方法 root账户登录 换源教程 安装rvm 访问rails server RubyMine连接虚拟机上的解释器 作者:庄廓然 在windows下进行linux开发:利用Vagr ...
-
网站相关技术探究keepalive_timeout(转)
网站相关技术探究keepalive设多少: /proc/$PID/fd/$number 0:标准输入 1:标准输出 2:标准错误 Test: [root@KTQT ~]# ll /proc/12 ...
-
Windows下构建ASP.NET Core+Code First+Docker
背景介绍 本文将会示范如何在Windows系统下基于ASP.NET Core构建跨平台服务,并通过Docker容器运行发布. 首先说一下为什么选择这一套组合: 我本人和我们Code4Thought团队 ...
-
.Net环境下的缓存技术介绍 (转)
.Net环境下的缓存技术介绍 (转) 摘要:介绍缓存的基本概念和常用的缓存技术,给出了各种技术的实现机制的简单介绍和适用范围说明,以及设计缓存方案应该考虑的问题(共17页) 1 概念 ...
-
windows下nginx安装、配置与使用(转载)
目前国内各大门户网站已经部署了Nginx,如新浪.网易.腾讯等:国内几个重要的视频分享网站也部署了Nginx,如六房间.酷6等.新近发现Nginx 技术在国内日趋火热,越来越多的网站开始部署Nginx ...
-
Redhat/Ubuntu/Windows下安装Docker
Redhat/Ubuntu/Windows下安装Docker 什么是Docker Docker是Docker.inc公司开源的一个基于LXC技术之上构建的Container容器引擎,基于Go语言并遵从 ...
-
windows下使用火狐浏览器插件AutoProxy+MyEnTunnel+SSH访问海外站点(转)
windows下使用火狐浏览器插件AutoProxy+MyEnTunnel+SSH访问海外站点 平时需要查阅一些技术资料,光走VPN太浪费流量,所以这儿教大家一种使用火狐浏览器的插件 AutoPr ...
-
Windows下底层数据包发送实战
1.简介 所谓“底层数据包”指的是在“运行”于数据链路层的数据包,简单的说就是“以太网帧”,而我们常用的Socket只能发送“运行”在传输层的TCP.UDP等包,这些传输层数据包已经能满足绝大部分需求 ...
随机推荐
-
css 清除浮动 clear
.clearfix{ zoom:1;/*对于老版本的IE进行兼容的设置*/ } .clearfix:after{ content:""; display:block; visibi ...
-
HTML5商城开发一 楼层滚动加载数据
对于楼层加载在以前只是个想法,从来没实现过,刚好项目中碰到,再此总结一下 场景:HTML5,局部商品列表信息滚动(局部滚动条) 1.通过jq设置subCategoryScroll的高度为屏幕显示高度( ...
-
Transaction Script模式
Transcation Script模式适合于小项目,维护量小的项目. 好比cs文件中有一个主方法,调用了本文件中的其他方法,如果说不需要怎么维护的话Tranacation Script模式就可以了, ...
-
获取当前页面的url
var url = window.location.href; var b = url.substring(url.lastIndexOf('/')+1, url.length);
-
定义 ICache 接口,以及实现默认的 ASP.NET 缓存机制
本文定义 ICache 接口,以及实现默认的 ASP.NET 缓存机制(即通过 System.Web.Caching.Cache)来缓存,将来也可以通过扩展,替换默认实现. 下面直接贴代码了: ICa ...
-
Java多线程知识整理
多线程 1. 多线程基础 多线程状态转换图 普通方法介绍 yeild yeild,线程让步.是当前线程执行完后所有线程又统一回到同一起跑线.让自己或者其他线程运行,并不是单纯的让给其他线程. join ...
-
Dynamics 365 POA表记录的查询
微软动态CRM专家罗勇 ,回复313或者20190311可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . PrincipalO ...
-
洛谷.3369.[模板]普通平衡树(Splay)
题目链接 第一次写(2017.11.7): #include<cstdio> #include<cctype> using namespace std; const int N ...
-
Delphi TQuery 的Locate用法
Help里的解释 function Locate(const KeyFields: String; const KeyValues: Variant; Options: TLocateOptions) ...
-
web访问命令行
https://github.com/yudai/gotty go get github.com/yudai/gotty gotty -p 8000 -w kubectl exec -it mysql ...