解析Defender VDM特征库

网上有相关的VMD解密文章

根据上面的研究,又有解析各种字段的文章和工具,工具可以将上面的extracted文件进一步解析成csv格式的文件。现在能清楚Defender查了cs哪一段特征,当然不只是cs,其他工具特征也一样能看。

Windows Defender 数据库结构分析(上)

Windows Defender 数据库结构分析(下)

同时,BRC4的作者在Twitter上分享了一份内存特征定位的代码

其他的,微步发布了关于defender内存调试的文章

Defender针对CS的查杀点

生成beaconx64.exe,用Virtest探测,结果如下

文件 报毒 特征
beaconx64.exe VirTool:Win64/CobaltStrike.G 00044C3D -> 76 65 72 00 00
artifact64.exe CobaltStrike.MBK!MTB 00000970 -> 7C E9 48 89 D9

CobaltStrike.G

这个特征是命名管道的字符串特征,修改一下就可以了。

特征文件位于源码中的resources文件夹中,artifact* 相关文件。该文件夹中的内容不需要反编译

要注意的是resources文件夹不要放在src目录中,继续放在decompiled_src目录中。因为可能会找不到bof而导致beacon用不了bof扩展。

CobaltStrike.MBK!MTB

在IDA中查找字节码,发现对应的反汇编内容是for循环。

1.png

2.png

逆向分析一下在for循环之前,程序都在做什么,首先找到main函数入口。看到在main函数中有两个函数和一个while循环,这个循环只做睡眠用。

3.png

进入sub_401795(),在该函数内调用了GetTickCount()函数获取当前时间,还有一堆硬编码的字符,解密过来是.\pipe\,然后将硬编码的字符通过sprintf()函数写入到Buffer变量中,用x64DBG动态调试这段代码,能看到拼接后的命名管道为\\.\pipe\MSSE-9301-revres

4.png

5.png

继续看CreateThread这个函数干了什么,IDA跟进后能看到调用了CreateNamedPipeA()函数,管道名称就是刚才拼接的管道名称\\.\pipe\MSSE-9301-revres,之后如果有数据则调用WriteFile()将数据写入管道内并关闭管道,所以这里是创建了一个新线程并初始化了命名管道。

6.png

再来看下创建线程之后调用的函数sub_401742()内的逻辑,首先是分配了一块内存空间,然后执行do ... while循环,一直到while里面的函数返回为true时停止,跟进这个函数

7.png

8.png

这个函数的逻辑也很清晰,从命名管道中读取数据,当读取到数据的时候返回true

9.png

继续看do ... while() 之后的逻辑,跟进函数,分配一块内存空间,for循环异或解密命名管道内的数据,修改内存空间属性为RX并创建新线程执行这块内存空间。

10.png

到这里就明白了,Defender查杀的是这个for循环的逻辑,绕过方法直接把jl改成jb,也就是7C E9 -> 72 E9

11.png

12.png

涉及的文件为resources文件夹内的artifact64*相关文件。

Behavior:Win32/CobaltStrike.B!nri

生成x64 https Stageless可执行文件分析

调试程序,在发起https连接请求时会触发报毒,第一次http请求可以用内存加载的方式绕过,后续注入依然会触发该特征

13.png

这个特征可以用Hook HttpQueryInfo()可解决