这是[信安成长计划]的第 11 篇文章
0x00 目录
0x01 检测原理
0x02 检测方案
0x03 存在的问题
0x04 解决方案
0x05 示例代码
0x06 写在最后
年也过了,继续开始卷卷卷...
目前使用比较多的检测工具就是 BeaconEye,在之前的文章中也已经提到过它的检测原理与 Bypass 的方法《Bypass BeaconEye》《Bypass BeaconEye - Beacon 堆混淆》,BeaconEye 所依赖的就是 C2Profile 解析后的内存结构来检测的,根据之前逆向分析的成果,发现还有一种检测的方案而且也相对增加了绕过的难度
0x01 检测原理
BeaconEye 所依赖的是 C2Profile 解析后的固定内存结构,对于其解析的逻辑在之前也已经提到过了,这里也就不详细说了
对于 Beacon 的检测,针对 C2Profile 是一个比较稳妥的方案,这样会降低误报的概率,所以还是按照这个逻辑继续走才比较稳妥,所以检测逻辑就可以从检测 C2Profile 数据,改变为检测解析 C2Profile 的代码,或者获取 C2Profile 数据的函数
根据之前对 C2Profile 全流程的分析,这里就可以有四个检测方案——解析函数、GetShortValue、GetIntValue、GetPtrValue
0x02 检测方案
在检测的时候,可以直接将整个函数都作为特征,为了方便起见,也可以再缩小检测范围,这里以 GetShortValue 为例
经过观察可以发现,所有的获取函数在获取完值以后,都会再判断一下当前的类型是否正确,所以就可以把这一点拉出来作为检测的一个特征
再或者将寄存器取值作为特征也都是可行的,而且还能跟其他几个点进行配合,相互之间的组合方式也就有很多种了
0x03 存在的问题
以这些点来作为特征也存在一个问题,CS 自带的 Sleep_Mask 会在 Sleep 的时候将整块内存都进行混淆,我们之前也进行过分析它具体的实现原理,所以还需要在对之前的检测方案进行完善
根据之前的混淆逻辑可以很清楚的发现,CS 是将加解密函数拷贝到了 text 段的结尾位置,并且在处理完以后当前内存就一直存在了,不会去对其进行清理
0x04 解决方案
既然这样,那就直接按照前面所说的逻辑,直接将加解密函数作为特征来完成对 Beacon 的检测
如果计划缩小特征码,逻辑也与之前一致,从中间取出关键的几个步骤即可
0x05 示例代码
想了想代码还是交给你们自己写吧,将上面提到的几个方案的特征提取出来,在全内存中进行搜索即可
在网上搜 “内存搜索特征码” 也能找到很多可以来参考的例子
0x06 写在最后
其实整个的操作就是在进行特征码的搜索,这也就是被针对以后的问题了,倒是不是不能 Bypass,就是会比之前更麻烦一点,就是进行 inline Hook 关键的位置,然后将原始的内容抹零就好了。