由于云端杀毒的流行,病毒基本上都会加上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日。

  如,通过注入数百万个无效的任意系统调用,除了减慢执行速度,特别是在被监视或仿真的环境中执行时,会显着降低执行速度。

  

  1. 系统事件
  • 仅在关机,重新启动或有人登录或关闭后才能生效。
  • 图2显示了一个示例,其中仅在重新启动后才将二级有效负载下拉。我们可以在VTI分数中看到可执行文件由恶意软件(初始有效载荷)安装,这将在启动后自动运行。正是这个启动过程获取第二个有效载荷。

  

  3.用户互动

  • 等待鼠标移动(但不要太快,因为这是一个沙盒)或键盘输入。
  • 与某些应用程序进行交互,例如浏览器,电子邮件,Skype,在线银行应用程序。
  • 假安装程序:恶意软件只有在用户单击多个按钮并检查各种复选框后才会激活(参见图2)。
  • 具有恶意嵌入式内容的Office文档:当用户向下滚动(查看)或单击时,恶意内容才会生效。

  

  4.检测特定的目标系统  

  复杂的有针对性的恶意软件只适用于预期的目标系统。标识通常基于当前用户名,时区,键盘布局,IP地址或其他系统工件。支票本身可以通过各种方式完成,从简单到非常复杂的方法。

  • 简单检查包括字符串检查。
  • 如果预期的目标环境不知道,复杂检查(例如,从环境设置中获取的散列解密)几乎不可破坏。

   如果恶意软件确定它在预期的目标环境中,则只进入第二阶段(即下载主要有效载荷)。

初生牛犊:Windows下Anti-sandboxes技术探究的更多相关文章

  1. Windows 下多线程编程技术

    (1) 线程的创建:(主要以下2种) CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID lParam, int nPrio ...

  2. Windows下查看硬连接引用技术

    Win10有了bash,可以方便的进入并用ll查看文件的硬连接数. 但是用powershell直接查看就比较麻烦了,比较曲折的找到了方法: fsutil hardlink list [filename ...

  3. [技术博客] 利用Vagrant+virtualbox在windows下进行linux开发

    目录 加速box安装的方法 root账户登录 换源教程 安装rvm 访问rails server RubyMine连接虚拟机上的解释器 作者:庄廓然 在windows下进行linux开发:利用Vagr ...

  4. 网站相关技术探究keepalive_timeout(转)

    网站相关技术探究keepalive设多少: /proc/$PID/fd/$number  0:标准输入 1:标准输出 2:标准错误   Test: [root@KTQT ~]# ll /proc/12 ...

  5. Windows下构建ASP.NET Core+Code First+Docker

    背景介绍 本文将会示范如何在Windows系统下基于ASP.NET Core构建跨平台服务,并通过Docker容器运行发布. 首先说一下为什么选择这一套组合: 我本人和我们Code4Thought团队 ...

  6. .Net环境下的缓存技术介绍 (转)

    .Net环境下的缓存技术介绍 (转) 摘要:介绍缓存的基本概念和常用的缓存技术,给出了各种技术的实现机制的简单介绍和适用范围说明,以及设计缓存方案应该考虑的问题(共17页) 1         概念 ...

  7. windows下nginx安装、配置与使用(转载)

    目前国内各大门户网站已经部署了Nginx,如新浪.网易.腾讯等:国内几个重要的视频分享网站也部署了Nginx,如六房间.酷6等.新近发现Nginx 技术在国内日趋火热,越来越多的网站开始部署Nginx ...

  8. Redhat/Ubuntu/Windows下安装Docker

    Redhat/Ubuntu/Windows下安装Docker 什么是Docker Docker是Docker.inc公司开源的一个基于LXC技术之上构建的Container容器引擎,基于Go语言并遵从 ...

  9. windows下使用火狐浏览器插件AutoProxy+MyEnTunnel+SSH访问海外站点(转)

    windows下使用火狐浏览器插件AutoProxy+MyEnTunnel+SSH访问海外站点   平时需要查阅一些技术资料,光走VPN太浪费流量,所以这儿教大家一种使用火狐浏览器的插件 AutoPr ...

  10. Windows下底层数据包发送实战

    1.简介 所谓“底层数据包”指的是在“运行”于数据链路层的数据包,简单的说就是“以太网帧”,而我们常用的Socket只能发送“运行”在传输层的TCP.UDP等包,这些传输层数据包已经能满足绝大部分需求 ...

随机推荐

  1. [洛谷P3401] 洛谷树

    洛谷题目连接:洛谷树 题目背景 萌哒的Created equal小仓鼠种了一棵洛谷树! (题目背景是辣鸡小仓鼠乱写的QAQ). 题目描述 树是一个无环.联通的无向图,由n个点和n-1条边构成.树上两个 ...

  2. 归并排序Merge sort2

    原理,把原始数组分成若干子数组,对每一个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组 举例 无序数组[6 2 4 1 5 9] 先看一下每个步骤下的状态, ...

  3. 【CC2530入门教程-01】CC2530微控制器开发入门基础

    [引言] 本系列教程就有关CC2530单片机应用入门基础的实训案例进行分析,主要包括以下6部分的内容:[1]CC2530微控制器开发入门基础.[2]通用I/O端口的输入和输出.[3]外部中断初步应用. ...

  4. 如何升级nodejs版本 安装n模块报错 npm ERR! notsup Unsupported platform

    如何升级nodejs版本 首先安装n模块, 输入npm install -g n n模块专门用来管理nodejs的版本. 如果出现npm ERR! notsup Unsupported platfor ...

  5. setTimeout()和setInterval()方法的区别

    setTimeout(); //5秒后执行yourFunction(),只执行一次 setInterval(); //每隔5秒执行一次 1.setTimeout(funhander,time)的作用是 ...

  6. ribbon设置url级别的超时时间

    序 ribbon的超时设置,只能按转发的serviceId来分的,无法像nginx那样直接在每个转发的链接里头设置超时时间.这里hack一下,实现url基本的ribbon超时时间设置.具体的思路就是重 ...

  7. Java多线程学习(二)synchronized关键字(2)

    转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79670775 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...

  8. Laravel 5.2 数据库迁移和数据填充

    一.数据库迁移 Laravel 的数据库迁移提供了对数据库.表.字段.索引的一系列相关操作.下面以创建友情链接表为例. 1. 创建迁移 使用 Artisan 命令  php artisan make: ...

  9. python基础===单元测试unittest

    ''' 编写一个名为Employee 的类,其方法__init__()接受名.姓和年薪,并 将它们都存储在属性中.编写一个名为give_raise()的方法,它默认将年薪增加5000 美元,但也能够接 ...

  10. 获取并编译最新的Notepad++源码

    获取并编译最新的Notepad++源码 http://blog.csdn.net/u012814856/article/details/68947310 Notepad++源码编译及其分析 http: ...