vlambda博客
学习文章列表

使用图像识别的注意力机制应对免杀

项目与毕业设计相关,在论文答辩前一天会将所有代码与已预处理的样本等资源开源,放在自己的Github上:https://github.com/funkpopo
考虑到已有众多根据静态分析对恶意代码进行识别分类的项目,需要在创新点和可行性上找到一个依据目前水平较为平衡的研究目标略微有些难度,所以在立项之初并没有具体的想法,仅考虑到自己会做什么、能做什么、了解什么去选定一个大概的方向。在后续与老师、学长的交流过程中逐渐将想法稳定,算是一个比较好的思路,去做一个理论与应用性上都算是有点意思的东西。

凤头

常规的静态分析脱离不了0和1,也即二进制为最底层的电平变化序列。转译为16进制,就是汇编代码,再经由编译器处理,就是具有可读性的程序源码。程序脱离不了已经预设的架构,除非程序已经被设定为具有无限扩张性与自我学习性,也即一个亦被局限在“已经预设”的规则内的可依已有条件进行变化的架构内“幻体”。现存已有的免杀机制,作用于已被标记危险的恶意样本上或常规流程中,规避了杀软、WAF的架构设定,也会在特征采集不足的前提下规避绝大部分的机器学习反制方法。攻击永远也不会彻底消除,只会换一种方式存在。新的样本或变种出现后其特征被采集整合,新的防御补丁才会出现。预习或是先于进攻而进化,可行性与有效性都是不可预测的。可见先前于20年8月写的一篇简述:https://cyberis.fun/2020/08/28/使用机器学习对恶意代码进行识别和分类/
新的项目不探讨恶意代码识别分类,而是着眼于常见免杀机制规避检测手段的重点/隐匿作用点。也即摆脱一般的检测恶意代码段,去检测“非恶意”代码段/混淆段。进一步摸清规避机制,可能的话达到彻底攻破某一种或某几种免杀机制。在德国人整备军队开拔波兰前就先把柏林给扬了😀。

样本扩展
初期的样本局限于Win x64系统下的.exe可执行程序。挑选这类样本主要考虑到系统的普及率、程序的数量级、攻击的广泛传播性、程序的可读性(对于自己)。所得样本数量在650左右,作为样本集远远不够,但综合源码已是一个较大的量级。所以在样本数量局限时可以考虑通过其他手段进行样本扩展,以获取到远超原样本并可以被使用的文件/文本类型。
文本处理就是摘取程序源码,使用16进制进行存储处理,常见并且有效。通过构筑数据表即可逐一存入函数、参数,再逐行列读取即可。
图像处理也即将文件粗暴地(也可以温柔地进行压缩、裁剪)转为图像,通过各点像素RGB值或灰度值进行特征读取。这类方式也较为常见,但作用于已经经过免杀处理的样本上,其大小将会作为最大的影响因素在样本预处理阶段对人类的身心进行折磨。所以比较少有人会去整合。免杀的实施通常都会将程序大小进行扩展,在源码空白段进行插入、在函数实施处进行替换、在执行的缓冲区实现跳转溢出...可以得出结论:一般来说免杀实施后,样本都是增大的。

免杀执行完毕,就是格式的转换。 即便是构建一个沙盒,将Malware丢入其中执行,采集行为数据,也需要整合为日志文本给具有学习能力的网络进行保存。 所以保存原本的.exe格式转换为其他格式是非必要的(并且我还没有想过去写个沙盒,下次一定吧),这也是大部分人选择静态分析的原因之一。

猪肚

我选择根据最大样本的图像高度进行切割范围的选定。也就是选择最大的样本,在固定宽度的前提下进行固定高度的图像切割,在效率上做一些妥协,但保留了完整的数据,尽量不对我的后续操作造成影响。先前考虑高度从一个较大的数开始,根据比对结果逐步减小高度差,最后确定一个能够囊括重点混淆代码段的高度,以此高度作为该免杀机制的作用范围“最小值”,也即关键点,目的就达到了。

但是不可行。一旦超过了一个较为合理的高度值,深度学习网络需要去采集的样本点/样本区就会随着高度的增长而变大,不仅效率上会降低,其结果的可靠性也是被怀疑的。最终决定从较小的值开始,即便有部分割裂,也可以通过参照结果来平移分割点进行规避,从缩小包围圈变成了并列推进。

使用图像识别的注意力机制应对免杀

之后又考虑到需要找到重合区,联想到了人脸识别方法的三点定位(双眼、嘴部)可否适用于非人脸的情境下。 此设想应当是可行的,但是 不适用于像素级的图像处理上 WindowsHello就是典型的三点定位方式处理人脸,用户仅需分别在光照较好/光照较差的环境下各给予一张样本,其就能达到一个较高的识别率,但是这种机制所建立的数学模型主要集中于将双眼与嘴部的相对位置进行关联,并非是仅计算样本图像的像素点色值、差值(可在使用WindowsHello时自行通过遮住一只眼睛,或遮住嘴巴这种方式进行校验,三个关键点仅需保留两个,即可成功校验通过)。 这种方式在二进制文件转换图片上不可行,因为图片本身像素不可读,无法通过手动定位去选定某一个程序段内函数之间的关联区域,最后也被放弃了。

其后使用SSIM\skimage对图像样本进行查重、去重,批处理后发现部分样本会出现首个分段即缺失的情况,但是我无法在未开启日志记录的情况下手动定位是哪一个样本的第n分段与其他样本的第m分段重合了,并且在使用SSIM查重去重时,计算的是hash值,也即图片不是仅相似即会被删除,而是每一个像素点都相同,即会被去除。这种情况的发生也在预料之中,因为恶意代码原样本即包含了有存在变种的情况发生,某一个段重合或是免杀处理并切割后某一段完全相同是完全可以存在的。
注意力机制(Attention Mechanism),也就是将图像、文本的重点进行确定,使得在计算权重时对指定范围进行一个更可靠值的赋予,这种方式也被使用到图像的放大裁剪、模糊化处理上。但是像素级处理不允许有模糊的情况发生,需要去确定注意力作用点,又必须要在图像层面上对图像进行对比了。使用PIL可以实现,如图所示,我将不同样本的同分段进行对比, 红色标注的即为差异点,而放大后可以确认差异点标记也是逐像素确定的。


蛇尾

那么我在后面就根据差异标记样本进行注意力范围的指定即可了,还没做完就暂时不写😛。明天笔试,希望自己能过。