病毒分析流程及特征提取
## 0x00 概述
这几天,在吾爱上看到了许多病毒,木马分析方面的很优秀文章,学到了很多东西,于是想整理一篇病毒分析方面比较规范化,流程化的帖子,本文借鉴了“**熊猫正正**”的分析心得,参考了“**龙飞雪**”在病毒行为分析方面非常完善的分析实列,“l**ipss**”的查杀方法及“**GleamJ**”病毒特征提取方面的建议。
**如有不足,欢迎各位坛友,在下方留言建议。**
## 0x10 病毒分析的流程
1、拿到一个样本不管是什么,先弄清它是什么文件格式,这里就要求你要对不同的文件格式有所了解
> **window(PE)**,**linux(ELF),android(dex,ELF),ios/mac(mach-o)**
2、然后看样本有没有壳或加密,如果有壳就脱壳,有加密就看能不能解密
3、脱完壳,解完密,后面就是动+静态分析了
```bash
window(od,windbg),linux(gdb,edb),android(jeb,ida),ios/mac(lldb) #动态调试
ida,010Editor,readelf,objdump,string... #静态调试
```
4、网络抓包工具
模拟真实运行环境,抓取数据包进行分析
```bash
wireshark,tcpdump,Charles,BrupSuite
```
5、前期了解
分析系统级的样本的时候,我们还需要对相应的系统有一个大致的了解,了解相应系统的启动过程,每种系统的自启动方式以及注入方式都不同,我们要对这些不同的系统都比较了解。
6、快速定位
当分析一个样本,有可能程序很大,我们要有快速定位问题的能力,针对不同的样本,要分析不同的功能点,真正工作过程中分析一个样本,是需要具备快速响应,解决问题的能力,同时在最快的时间内输出相应的分析报告,这个就要靠平时多锻炼了,有一种“阅片无数”的感觉。
7、实战是检验真理的标准
有了上面的一些基础,就是多实战了,可以从各个渠道下载不同类型的样本进行练习,积累经验。
> 附上 Freebuf传送门 [一次XorDDos变种样本的分析实战记录](http://www.freebuf.com/articles/system/119374.html)
###0x11 样本信息
一般主要分为以下几个方面来描述样本唯一性
```bash
文件名称: #[可为md5值]
文件大小:
病毒名称:
MD5:
Sha-1:
CRC :
```
### 0x12 分析环境及工具
环境:win7 X64位 /Winxp 32位
工具:OD、IDA、MD5
### 0x13 分析目标
分析病毒的恶意行为及生成的相关文件的功能
### 0x14 样本行为
大致行为会有如下这些,判断杀软,绕过杀软,安装,启动服务,传播病毒,留后门,清除痕迹。这里一一个大佬的行为总结为栗
**病毒行为总结-文字版**:
**0x1**.打开与当前病毒进程文件同名的信号互斥量,判断信号互斥量是否存在,防止病毒行为的二次执行。
**0x2.**通过注册表"SOFTWARE\\JiangMin\\"和"SOFTWARE\\rising\\",判断江民、瑞星杀毒软件的是否存在。
**0x3.**创建进程快照,判断360的杀软进程360sd.exe、360rp.exe是否存在;如果存在,则结束360杀毒的进程360sd.exe和360rp.exe。
**0x4**.通过注册表"SOFTWARE\\JiangMin\\"和"SOFTWARE\\rising\\",判断江民、瑞星杀毒软件是否存在;如果江民、瑞星的杀软存在,则创建线程在用户桌面的右下角伪造360杀软的弹窗界面迷惑用户。
**0x5.**创建线程利用IPC入侵用户的主机,种植木马病毒。利用弱口令猜测用户主机的用户名和密码,如果入侵成功则拷贝当前病毒进程文件到用户主机系统中,然后运行病毒文件,创建病毒进程。
**0x6.**创建线程,在移动设备盘中释放病毒文件anturun.inf,进行病毒的传播。
**1.**判断遍历的磁盘是否是移动设备盘,如果是移动设备盘进行病毒文件anturun.inf的释放和病毒的传播。
**2**.判断遍历的移动设备盘中是否存在anturun.inf文件夹;如果存在,则将其改名为随机字符组成的文件夹名称;删除原来正常的anturun.inf文件,创建病毒文件anturun.inf。
**3.**为病毒文件anturun.inf创建执行体病毒程序recycle.{645FF040-5081-101B-9F08-00AA002F954E}\GHOSTBAK.exe即拷贝当前病毒文件,创建病毒文件recycle.{645FF040-5081-101B-9F08-00AA002F954E}\GHOSTBAK.exe并设置该病毒文件的属性为系统、隐藏属性。
**0x7**.通过注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentContaRolset\Services\Jklmno Qrstuvwx Abc判断病毒服务"Jklmno Qrstuvwx Abc"是否已经存在。
**0x8**.如果病毒服务"Jklmno Qrstuvwx Abc"不存在,则创建病毒服务,然后启动病毒服务。
**1.**判断当前病毒进程是否是运行在"C:\\WINDOWS\\system32"目录下;如果不是,则拷贝当前病毒进程的文件,创建和释放随机字符组成名称的病毒文件,如"C:\\WINDOWS\\system32\\tkkiwk.exe"到"C:\\WINDOWS\\system32"目录下。
**2.**使用释放到"C:\\WINDOWS\\system32"目录下的病毒文件tkkiwk.exe创建病毒服务"Jklmno Qrstuvwx Abc";如果该病毒服务已经存在并且打开病毒服务失败,则删除病毒服务、删除病毒文件自身;如果病毒服务不存在,则启动病毒服务"Jklmno Qrstuvwx Abc"
**3**.如果病毒服务"Jklmno Qrstuvwx Abc"启动成功,则将病毒服务的信息写入注册表"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\ "Jklmno Qrstuvwx Abc"的键值对"Description"中。
**0x9**.如果病毒服务"Jklmno Qrstuvwx Abc"已经存在,则启动病毒服务。
**1.**为服务"Jklmno Qrstuvwx Abc"设置例程处理函数,用于控制服务的状态。
**2.**设置创建的病毒服务的状态,创建互斥信号量"Jklmno Qrstuvwx Abc"并初始化网络套接字。
**0x10**.创建线程,主动向病毒作者服务器"zhifan1314.oicp.net"发起网络连接**留下后门**,然后将用户的电脑的信息如操作系统的版本信息、CPU硬件信息、系统内存等信息发送给远程控制的病毒作者的服务器上。
**1.**主动向病毒作者服务器"zhifan1314.oicp.net"发起网络连接。
**2**.获取用户的电脑信息如操作系统的版本信息、CPU硬件信息、系统内存等信息,将其发送到病毒作者的服务器网址"zhifan1314.oicp.net"上。
**0x11**.接受病毒作者的从远程发送来的控制命令,解析远程控制命令进行相关的控制操作,尤其是创建很多的网络僵尸线程,导致用户的电脑和系统主机产生”拒绝服务”的行为。
**1.**控制命令1-"2",创建很多网络连接操作的僵尸线程,IP地址为"zhifan1314.oicp.net"。
**2.**控制命令2-"3",创建浏览器进程"C:\\windows\\system32\\Program Files\\Internet Explorer\\iexplore.exe"并创建很多发送Http网络请求的网络僵尸线程,IP地址为"zhifan1314.oicp.net"。
**3**.控制命令3-"4",创建很多网络操作的僵尸线程,IP地址为"zhifan1314.oicp.net"。
**4.**控制命令4-"6",通过互斥信号"LRscKSQhdHZ0d2EiHCYzYSEoN21rendsQw=="判断病毒行为是否已经执行;如果已经执行,则删除病毒服务"Jklmno Qrstuvwx Abc"并删除病毒服务创建的注册表"HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\ "Jklmno Qrstuvwx Abc"。
**5.**控制命令5-"16"、"17",从指定网址下载病毒文件到系统临时文件目录下,然后运行病毒文件,创建病毒进程。
**6**.控制命令6-"18",如果互斥信号量"Jklmno Qrstuvwx Abc"已经存在,则释放信号互斥量"Jklmno Qrstuvwx Abc";从指定网址下载病毒文件到系统临时文件目录下,然后运行病毒文件,创建病毒进程;如果病毒服务"Jklmno Qrstuvwx Abc"已经存在,则删除病毒服务"Jklmno Qrstuvwx Abc",结束当前进程。
**7.**控制命令6-"19",为当前病毒进程,运行iexplore.exe程序,创建IE进程。
**8.**控制命令6-"20",为桌面窗口,创建iexplore.exe进程。
**0x12**.死循环,创建无限的线程-用以创建网络僵尸线程和接受病毒作者的远程控制,具体的行为上面已经分析的很详细了(不重复),只不过这次病毒进程主动连接的病毒作者的服务器IP 地址是104.107.207.189:8749。
> 附上 吾爱传送门 [一枚DDOS木马后门病毒分析](https://www.52pojie.cn/thread-423897-1-1.html)
### 0x13 查杀方法
以:一个IPC$的病毒为例
#### 0x131 提取病毒特征,利用杀毒软件查杀
```bash
Ghijkl Nopqrstu Wxy #对应hex
4768696A6B6C204E6F70717273747520577879 # hex
```
#### 0x132 手工查杀步骤或是工具查杀步骤或是查杀思路
1、停止【Ghijkl Nopqrstu Wxy】名称的服务
2、删除【Ghijkl Nopqrstu Wxy】键项的注册表
3、删除【C:\windows\system32\hra33.dll】文件
4、清空除了C:\windows\system32\lpk.dll外,所有zip、rar、exe下的lpk.dll文件
> 附上 传送门:[一份通过IPC$和lpk.dll感染方式的病毒分析报告](https://www.52pojie.cn/thread-609633-1-1.html)
##0x20 病毒特征的提取
### 0x21 为什么要提取病毒特征?
简单而直白:最直接的判断所感染的东西是否为病毒,为了更好的对病毒进行查杀。
### 0x22 病毒特征提取的方法
#### 0x220 利用哈希值作为病毒的特征
比如计算出病毒的MD5,这样只要遇到相同MD5的文件,就可以将其判定为病毒,这也是目前云查杀所倚重的方式。
**这种方式最大的缺点是,病毒与特征之间是一对一的关系,即便病毒仅仅发生了一个字节的变化,那么这个特征也就失效了。**
#### 0x221 选取病毒内部的特征字符串
比如“熊猫烧香”里面的`whboy`还有其它一些特色字符,只要发现目标程序中有这些字符,则判定为病毒。这种方式相对于利用哈希值作为特征,具有更好的通杀性,但是如果病毒作者修改了自身的名称,那也就能够轻易躲避掉这种查杀方式了。
#### 0x222 双重校验和
其实这种方法类似于上述方法的集合,也就是在病毒文件内部选取两个位置(这两个位置可以是特色字符也可以是特色代码),计算这两段位置的哈希值作为特征。这种方法的好处是,不论选取多长的特征,那么最终生成的哈希值是固定的,这样就便于存储。
#### 0x223 选取病毒内部的特色代码
事实上0到2这几种方式,都是比较初级的方法,接下来以几个实列,说明怎么才是一个**相对较好**的病毒特征。
**实列一**
以一个IPC$的病毒为例
```bash
Ghijkl Nopqrstu Wxy #特征值
4768696A6B6C204E6F70717273747520577879 #对应的hex
```
其实这条特征选取的就是病毒体内的特色字符串,将其转化为`ASCII`码的形式作为特征。但是这类以病毒“名称”作为特征的方法,最大的问题是通用性不好,病毒只要稍微修改一下自身的名称,那么这条特征也就失效了。利用病毒名称作为特征,也仅仅是比利用哈希值作为特征要稍微强一些。而我们其实还是希望能够利用最少的特征匹配到更多的文件,要具备通用性,还要尽可能地没有误报。所以可以考虑利用病毒体内**比较有特色的代码**作为特征,举例来说,对于这个病毒而言,它有这样一段代码:
```bash
#第一段
.00403651: C645F84F mov b,[-8],04F ;'O'#[-8] 用hex F8
.00403655: C645F970 mov b,[-7],070 ;'p'
.00403659: C645FA65 mov b,[-6],065 ;'e'
.0040365D: C645FB6E mov b,[-5],06E ;'n'
#下面一段
.00403899: C645A457 mov b,[-05C],057 ;'W'
.0040389D: C645A572 mov b,[-05B],072 ;'r'
.004038A1: C645A669 mov b,[-05A],069 ;'i'
.004038A5: C645A774 mov b,[-059],074 ;'t'
.004038A9: C645A865 mov b,[-058],065 ;'e'
.004038AD: C645A946 mov b,[-057],046 ;'F'
.004038B1: C645AA69 mov b,[-056],069 ;'i'
.004038B5: C645AB6C mov b,[-055],06C ;'l'
.004038B9: C645AC65 mov b,[-054],065 ;'e'
```
**特征选取**
其实这里就可以把第一段代码中的`C645F84FC645F970C645FA65C645FB6E`作为特征。
**通用性考虑**
考虑到通用性,还需要把地址,比如“b,[-8]”中的“[-8]”,也就是十六进制的**F8**利用通配符代替,因此这条特征最终可以这样写:
> C645??4FC645??70C645??65C645??6E
那么这就是一条**通杀性比较强**的特征了。
在我每天分析的病毒样本中,利用这种逐个字符放到缓冲区的情况,还是比较常见的,因此这是非常好的特征,能够应对千千万万的未知病毒了。
这个木马中类似的写法还有不少,可以多提取几条,用**“or”**连接。假设程序中一共有五个地方采用了这种形式,那么可以取舍一下,比如出现**三次**就报毒,这样通杀性就更强了。
**以算法名为特征**
另外,如果程序是利用**自己发明的算法**生成的文件名,那么这个算法所对应的十六进制代码,也可以提取出来作为特征,这也是很强的特征。可以很好地查杀这一类的木马病毒。而且一般来说还不会造成误报。
【这种方法有个前提,就是目标文件没有被加壳,如果是加壳的情况,那么就需要结合自动[脱壳](https://www.52pojie.cn/forum-5-1.html)程序或者`sandbox`来首先脱壳,再进行特征提取并查杀】
**动态查杀**
这里既然提到了`sandbox`,那么我还想讲讲另一种动态的查杀方法,也就是结合`sandbox`所跑出来的日志文件,选取合适的特征。举个例子来说,之前遇到过一种叫做**“永恒之石”**的勒索病毒,可以跑出类似这样一段日志:
```bash
System.IO.Directory.CreateDirectory("C:\\Program Files\\Microsoft Updates")
...
System.String.Intern()["\\svchost.exe"]
...
System.String.Concat()["C:\\Program Files\\Microsoft Updates\\svchost.exe"]
...
Stetem.IO.FileExists("C:\\Program Files\\Microsoft Updates\\svchost.exe")
...
```
这段**日志**所监控到的是,病毒在`C:\Program Files\`目录里面创建了名为`Microsoft Updates`的文件夹,然后在其中又创建了名为`svchost.exe`的文件(实际上`svchost.exe`就是病毒自身复制过去隐藏的)。其实这就是非常可疑的行为了,正常程序不会这么干,那么就可以写出这样的特征:
```bash
createDir = System.IO.Directory.CreateDirectory("C:\Program Files\Microsoft Updates")
createFile = System.String.Concat()["C:\Program Files\Microsoft Updates\svchost.exe"]
Detect = **createDir -> createFile
```
也就是只要出现**Detect**这样的序列,那么就直接报毒了。当然了,为了严谨起见,可以多选取几个类似于这样的特征。
> 附上 吾爱传送门 [聊聊怎样才算是好的病毒特征](https://www.52pojie.cn/thread-611410-1-1.html) 黑色切线 发表于 2018-2-8 21:31
又鸡儿是熟悉的东西 不是远控就是DDOS
这道菜叫清水煮白菜,下次给你换个口味。 感谢楼主分享 楼主排版真心好。怎么做到的? 感谢分享,学习了~ 又鸡儿是熟悉的东西 不是远控就是DDOS 喵~~~呜 发表于 2018-2-8 18:00
楼主排版真心好。怎么做到的?
Markdown语法,你值得拥有。 感谢楼主分享 学习了楼主,谢谢分享! 学习了,谢谢