导语:Delphi编程语言可以利用Windows API函数来写程序和应用。一些攻击者会故意包含一些默认的库来阻碍静态分析,并且使动态分析过程中看着是合法的。
打包和加密恶意程序是攻击者常用的绕过静态和动态分析的方法。恶意软件的分类和检测的绕过其实是一场攻击者和防御者之间的军备竞赛,因为不断有新的技术被交易和应用。比如,地下市场就有很多加密服务,使用该服务的恶意软件可以完全绕过反病毒技术、沙箱和其他终端解决方案。研究人员也在努力对正常的用户活动进行建模,并将其作为应对恶意软件分析环境的有效措施。
研究人员发现的样本含有Delphi签名,与Delphi代码结构是一致的。
图1: 样本中的Delphi签名
Delphi编程语言可以利用Windows API函数来写程序和应用。一些攻击者会故意包含一些默认的库来阻碍静态分析,并且使动态分析过程中看着是合法的。图2是地下论坛谈论该技术的帖子。
图2: 地下论坛谈论该技术的帖子
传播活动
研究人员发现许多不同主题的垃圾邮件活动都使用了用Delphi打包的payload。
一个例子是swift垃圾邮件中含有一个文档文件作为附件,使用恶意宏文档来释放payload。垃圾邮件如图3。
图3: 垃圾邮件示例1
另一个例子是问卷主题的垃圾邮件,附件利用公式编辑器的漏洞来删除payload,如图4。
图4: 垃圾邮件示例2
示例中的文档都回从http://5.152.203.115/win32.exe取回payload,最终会变成一个Lokibot恶意软件。
用户活动检查
Packer在确保没有运行分析环境中做了很多的工作。正常的用户活动含有许多过一段时间就会旋转或改变的应用窗口。第一个Packer变种在执行前会用GetForegroundWindow API检查窗口变化的用户活动至少三次。如果没有检查到窗口变化,就会进入休眠。具体代码见图5,这种简单的技术还可以检查一些沙箱。
图5: 窗口改变检查
为了确认用户活动,packer的第二个变种会用GetCursorPos和Sleep APIs检查鼠标光标移动,第三个变种会用GetLastInputInfo和GetTickCount APIs来检查系统空闲状态。
从PE资源中提取真实payload
原始payload会被分成多个二进制块,并保存在资源目录的不同位置,如图6所示。
图6: 含有加密内容的位图资源
为了定位和组合这些真实payload字节,packer代码首先会直接从资源区中硬编码的资源ID读取内容。前16字节会组成一个用于解密其他字节的XOR key。解密的字节表示的是内部数据结构,如图7所示。Packer会用内部数据结构来为位于不同资源ID的加密和混淆的缓存建立索引。
图7: 表示加密文件信息的结构
然后packer会从加密的缓存中读取值,从dwStartResourceId到dwStartResourceId+dwNumberOfResources,通过从dwChunkSize中读取chunk来将这些纸带来一个单独的位置。一旦最后的数据缓存准备好,就用前面提到的XOR算法和密钥来解密。该脚本还可以用于静态提取真实payload。
恶意软件家族分类
许多从样本集中提取的未打包的二进制文件都属于Lokibot恶意软件家族。研究人员还识别出了Pony、IRStealer、Nanocore、Netwire、Remcos和nJRAT恶意软件家族。使用该packer的恶意软件家族分布如图8所示。恶意软件家族的说明许多威胁单元都使用这种加密服务/工具,也可能是从地下市场购买的加密服务。
图8:使用packer的恶意软件家族分布
结论
Packers和加密服务提供给恶意软件开发者一种绕过payload检测和分类的方式。有许多方式可以用反分析技术来绕过沙箱环境,因此,分析人员最好使用可以对真实用户行为建模的沙箱环境。