免杀(未完结)
基础汇编
1 | push压栈,将数据放入栈中,先进后出 |
32位免杀好做,64位基线高
汇编指令学习
特征码
1 | 病毒特征码。我们需要在病毒的二进制代码中提取一部分作为病毒特征。但是病毒程序不能用这种方法,即从程序入口进行提取,这样一来病毒程序和普通的程序的检测结果没有分别。因此计算机病毒的特征码需要把病毒程序域一般程序区分开来。将唯一标识或一类多态病毒作为计算机病毒程序的指纹。如果随意选取一段二进制代码作为病毒特征码很可能出现误报 |
提取方式
1 | 计算校验和(专杀软件会多一些) |
工具集
1 | ollydbg |
杀软主流查杀原理和方式
特征码和花指令
修改特征码让杀软程序无法识别为病毒软件。
花指令是程序中的无用代码。杀毒软件对木马进行反汇编时木马代码不会正常显示,。利用堆栈平衡,让加花指令后堆栈一样
木马彩衣(金色鱼锦衣)
替换法
1 | push ebp |
比如在壳这里进行替换各个寄存器存的数据
壳上壳的免杀
跳转进行多层跳转
比较进行比较回来
确定特征码位置,对某一段进行nop,看是否进行查杀
单步挂上函数后,将打上断点,开启杀软,看是否查杀
样本判断
绝绝子病毒:
磁碟机病毒
主流杀软查杀原理
病毒查杀方式:行为和云查杀、静态查杀
静态查杀:特征码识别到,然后对文件进行特征匹配
云查杀:对文件内容以及行为进行检测。提取特征
行为查杀(动态查杀):对行为进行检测
可构建行为库进行动态查杀
统计学规律–》建立特征学习库–》进行动态查获取
监测技术
内存读取监测
1 | 监控所有进程,扫描内存 |
写入文件监测
对于写入磁盘的文件进行扫描
网页安全监测
监测是否存在网络攻击和不安全下载
邮箱附件监测
1 | 对于电子邮箱的附件进行病毒扫描 |
进程行为监测
沙盒模式即为进程行为监测,监测进程各种行为,对敏感操作进行报警
机器学习识别技术
通过深度学习技术进行识别病毒特征,不仅是静态样本的二进制分析,可以运用到沙盒动态行为分析中
机器学习识别技术围绕病毒特征码,调用功能和触发行为,运用在沙盒动态分析中
被杀的python代码
这是不免杀的,使用如下代码进行测试,使用pyinstaller生成可执行的exe文件。pyinstaller生成exe文件过程不会校验代码是否可执行,所以可以通过注释的方式一行行测试具体是什么代码报毒。
Shellcode代码不会触发告警,代码中的 VirtualAlloc、RtlMoveMemory函数同时使用时会触发告警。
1 | import ctypes |
这里会被杀掉
将RtlMoveMemory换成RtlCopyMemory就不会
基本32位的杀软防御会更强,而不是64位
vmware14会更好用
沙箱原理
沙箱是基于windows下的容器技术,构建在windows操作系统内核上,更轻量化的虚拟方案,专门用于安全隔离运行应用程序
windows沙盒
动态生成图像,基本映像技术windows启动沙盒,不需要单独的副本
大多数操作系统文件不可变,并且与沙盒windows共享。操作系统文件一小部分可变,不能共享。因此沙盒基本映像包含这些文件的一小部分副本。完整的windows图像可通过主机上的可共享不可变文件和可变文件的完整副本组合构建。通过此方案windows沙盒具有启动完整windows安装,无需下载或存储其他windows
在windows沙盒前,动态基本映像为30MB压缩包。安装后,基本映像将占500MB磁盘空间
内存管理
传统vm会静态分配主机内存,当资源需求发生变化的时候,经典vm具有用于调整资源需求的有限机制。另一方面,容器与主机协作以动态确认如何分配主机资源。此方法类似于进程通常在主机上占用内存的方式。如果主机有内存压力,可以从容器回收内存,就像进程回收内存一样。
内存共享
由于windows沙盒运行与主机相同的操作系统映像,因此已经增强为通过称为直接映射的技术将相同的物理内存也用于操作系统二进制文件的主机。例如当ntdll.dll*加载到沙盒中的内存中时,它将使用与主机上加载的二进制文件相同的物理页。与传统的VM相比,主机和沙盒之间的内存共享会导致较小的内存占用,而不会损害有价值的主机密钥
集成内核计划任务
对于普通虚拟机,microsoft虚拟机监控程序中运行的虚拟处理器的计划。windows沙盒使用名为“集成计划”的技术,允许主机计划程序决定沙盒何时获取CPU周期
windows沙盒中采用唯一策略,该策略允许像主机线程一样计划沙盒的虚拟化处理器。此方案中,主机的高优先级任务可以i抢占不那么重要的工作,最重要的工作优先进行,无论工作位于主机还是容器中
WDDM GPU 虚拟化(需要深入研究)
硬件加速呈现是提供流畅且响应迅速的用户体验的关键,尤其是对于图像密集的用例。microsoft与图形状生态系统合作伙伴合作,将新型图形虚拟化直接集成到directx和windows display driver model中
此功能允许沙盒内运行的程序与主机上运行的应用程序竞争GPU资源
做一个wddm虚拟化的驱动,借助泄露的签名,那么可能就能长时间驻留在操作系统中,可能能建立其非常隐蔽的信息通信信道
传统杀软检测原理
思考IFEO映像劫持
https://zhuanlan.zhihu.com/p/96504762
IFEO好像也可以做对病毒的劫持,来阻止病毒运行
扫描技术
1 | 扫描压缩包技术:对压缩包按和封装文件做分析检查的技术 |
监控技术
1 | 内存监控:当发现内存中存在病毒时,主动报警,监控所有进程,读取到内存中的文件,监控内存的网络数据 |
进程行为监测(沙盒)
通过病毒研究,将病毒共同的特殊行为进行监控
优点:可能防住未知病毒,
缺点:误报,不能识别病毒名称,需要用户用知识判断
主动防御:
不需要特征码支持,只要能扫描到目标的行为,就按照预先的迫使进行清除。核心是让机器自己有判断是否为病毒的智能
行为加算法模式
机器学习:
不仅可以做静态样本的二进制分析,也可以用沙箱动态行为分析。内容加行为
机器学习****恶意样本识别
从特征码角度去测试杀软逻辑
360进行脱壳的能力会比火绒强,360使用虚拟机脱壳引擎(VUE)进行脱壳。火绒使用vm的脱壳方式,对变形壳和可疑的区段没有识别能力。火绒强在主动防御,在市面上仅次于360
加壳,压缩、变形、使得特征码完全不同
脱壳两种思路
硬脱壳:写出逆向算法
动态脱壳:加壳程序运行的时候会自行脱壳,抓取运行时在内存中的镜像,再构建成标准的执行文件
虚拟机脱壳引擎(VUE)技术
给病毒制造一个仿真环境,让病毒自己脱壳
QVM人工智能引擎,从海量病毒样本数据中归纳出一套智能算法,无需分析病毒静态特征,无需分析病毒行为,但是病毒监测率奇高
特征码识别和人工智能算法结合、主动防御技术和四引擎查杀的防杀结合
最好是两个引擎都用吧
如果将木马中的一些jmp上下修改一两位,如果说没有强校验,那么还是能进行运行的
常见特征码定位
常见工具有CCL、MYCCL。大致原理是分割文件,将分割部分填入数据。如果扫描该部分不报警。则特征码在这个部分。知道找到这个部分。不同工具区别是使用的分割算法不同,查找特征码的效果不同。
但定位有运气问题,每次定位位置不同
VirTest是区别于CCL、MYCCL的工具。清除杀软判断链路的其中一环进行免杀
定位到数据,导致程序不能运行
大小写修改判断,字符串位置调换,无关数据随意替换
整数不影响结构的情况下,替换值,清零
地址,不能修改、具体看实际情况
PE头数据,无用数据清零或修改,有用数据看情况修改
代码
如果特征码定位到代码,在不改变程序功能基础上,应用各种方法修改
等价替换汇编代码,如mov、eax,0可以替换为xor、eax、eax,直接结果相同,二进制代码不同
交换代码顺序,在不影响逻辑的情况下代码块一位,将代码块移动不用的内存位置,通过加入jmp addr跳过去执行,addr是新的代码块地址
最后,终极修改方法,找到访问数据的代码,直接修改代码访问数据的地址,数据也可以放到其他地址了,如同修改源码一样,但是更难
源码免杀的逻辑原理
这里是针对有源码的,方法简单
1 | mian中屏蔽所有代码,编译,扫描,不报就2,如果报就5 |
安全软件分析
1 | 360 |
主动防御是需要重点关注的
监控进程、实时发现和拦截恶意程序、病毒查杀能力、自我保护能力
市面上的病毒查杀软件都需要过VB100才能上市
TAV
TAV杀毒后能还原一部分被病毒破坏的注册表和文件,内存查杀也不错,可以扫描内存、创建和病毒一样互斥,防止病毒再次运行
缺点是免杀简单,由于使用字符串明文检测,很容易分析病毒库或者是MYCCL等黑盒免杀。另一方面,TAV的效率低,包括特征数据结构若,特征复用等。
病毒库结构:
virinfo.def:名称表,包括壳名、包名、特征名C++
structVirinfo{
DWORD dwID;
BYTE btLength;
Char VirName[btLength];
};
病毒库更新:
1 | 直接更新拓展名为.def病毒库,适用于查杀现有引擎可以支持的木马和病毒 |
0x02 PE查杀过程逆向分析:
病毒库描述:
virpeXX.def:(PE库)
1 | struct VirpeHeader |
静态查杀方式:
1 | 二进制全文匹配(二进制特征存放在virpe01.def库解密后的tbl5中)将数十字节的病毒代码二进制,记录在病毒库中,与待检测样本进行全文匹配 |
特征的编号、特征的名称、特征的偏移、特征的长度、特征的内容
查杀引擎功能分析
杀掉进程
内存分析
内存扫描
匹配到指定的进程和内存串,就终止进程
匹配文件是否存在
匹配几层子目录,如果没有就跳过
创建一个acl访问控制域,这个域上设置system权限用户
创建一个与病毒相同的互斥体,防止病毒再次运行
将杀软杀掉后,创建一个互斥体,让病毒运行不起来,根据难查杀的病毒一起变换
但是现在病毒会随机互斥体名称,记录在某个位置,如果又创建过了就不执行了
内存清理
将虚表里面的结构体成员初始化
1 | signed int __thiscall sub_1012E1D0(int this) |
BMP字符串多模式匹配:
可以看
https://www.zhihu.com/question/21923021
实际上是需要用到更优于内存效率的方法,大量并发是否能执行好,是否能顺利解决问题
虚拟机检测:
虚拟机里面模拟了ntdll、kernel32、gdi32、user32、advapi32、shell32、wsock32、ole32、oleaut32、msvcrt、version、urlmon几个系统dll,这些是木马经常会调用的dll,模拟x64或86的虚拟环境,模拟进程网络、注册表、外壳等环境内的组件,加载之后保证不能崩溃。
少用经常用的一些函数,包括是导出函数
少用模块的一些导出函数
数字卫士溢出漏洞分析
360全家桶
360杀毒、360安全卫士、小红伞、360系统急救箱
参考
https://blog.csdn.net/aluo3002/article/details/102028296
通过分析RAT payload运行后可以关闭360,根据rat运行后能发现只是运行了几个小部分
1 | #include <iostream> |
其作用是找到Q360SafeMonClass的窗口句柄。找到这段代码后将执行这段代码来获得窗口句柄。
不用findwidow是怕直接找找不到。
漏洞调试
使用windbg,开双机调试,切换360到hookport上,定位到koface,在此处头处,把头换成ret
关闭360自我保护,就能直接进行调试了
safemon.dll是图形页面的支持dll,每个图形界面都会去加载这个dll,从这个dll中发送消息,使得safemon.dll以为我的输入为一个图像界面而去加载,能执行命令。