解析Defender VDM特征库
网上有相关的VMD解密文章
根据上面的研究,又有解析各种字段的文章和工具,工具可以将上面的extracted文件进一步解析成csv格式的文件。现在能清楚Defender查了cs哪一段特征,当然不只是cs,其他工具特征也一样能看。
同时,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循环。
逆向分析一下在for循环之前,程序都在做什么,首先找到main函数入口。看到在main函数中有两个函数和一个while循环,这个循环只做睡眠用。
进入sub_401795()
,在该函数内调用了GetTickCount()
函数获取当前时间,还有一堆硬编码的字符,解密过来是.\pipe\
,然后将硬编码的字符通过sprintf()
函数写入到Buffer
变量中,用x64DBG动态调试这段代码,能看到拼接后的命名管道为\\.\pipe\MSSE-9301-revres
继续看CreateThread这个函数干了什么,IDA跟进后能看到调用了CreateNamedPipeA()
函数,管道名称就是刚才拼接的管道名称\\.\pipe\MSSE-9301-revres
,之后如果有数据则调用WriteFile()
将数据写入管道内并关闭管道,所以这里是创建了一个新线程并初始化了命名管道。
再来看下创建线程之后调用的函数sub_401742()
内的逻辑,首先是分配了一块内存空间,然后执行do ... while
循环,一直到while
里面的函数返回为true时停止,跟进这个函数
这个函数的逻辑也很清晰,从命名管道中读取数据,当读取到数据的时候返回true
继续看do ... while()
之后的逻辑,跟进函数,分配一块内存空间,for循环异或解密命名管道内的数据,修改内存空间属性为RX并创建新线程执行这块内存空间。
到这里就明白了,Defender查杀的是这个for循环的逻辑,绕过方法直接把jl
改成jb
,也就是7C E9
-> 72 E9
涉及的文件为resources
文件夹内的artifact64*
相关文件。
Behavior:Win32/CobaltStrike.B!nri
生成x64 https Stageless可执行文件分析
调试程序,在发起https连接请求时会触发报毒,第一次http请求可以用内存加载的方式绕过,后续注入依然会触发该特征
这个特征可以用Hook HttpQueryInfo()
可解决