示例名称Wannacry作者yusakul时间2019-05-6平台Win10-641示例信息病毒名称Wannacry所属家族Wannacry示例名称ed 01 ebf BC 9e b5 bbea 545 af 4d 01bf 1071661845 f 514、 368 bytesMD5值84c 82835 a5d 21 bbcf 75 a 61706 D8 ab 549 sha 1值5ff 465 afaabcbf 0150 D1 a3a B2C 2e 74 F3 a 4426467 sha 256 ed 01 ebf BC 9e b5 bbbbea 545 a 4d 01 bbf 51bf5f 5145 ad 06 a10 BF5ab 50 f 50 a145 ab 65 ad 06 ab 06 ab 106 ab 50 a 规则注释VMware Workstation 15 Pro分析环境win10_x64防火墙操作监控dddbb pro 7.0静态分析Ollydbg动态分析3使用分析对象3.1 PE文件结构PEid显示程序的PE结构并获取部分信息
3.1.1导入表kernel32.dll导入表包含进程、文件操作、加载资源和内存处理等相关函数。
Advapi32.dll Advapi32.dll是一个高级API APP应用程序接口。 包含函数和对象安全性、注册表操作以及与事件日志相关的API函数。
这些函数主要分为三类:注册表相关函数、进程权限更改函数和服务相关函数。
3.1.2检索加密算法
Adler32,CRC32计算校验和算法CryptEncrypt,CryptDecrypt,CryptGenKey是Microsoft CryptoAPIRijndael或AESZIP2和ZLIB是压缩算法3.1
PK这两个字符的开头可能是zip文件,并另存为res.zip
可以看到这样的内容。 被释放病毒的文件。
3.1.4字符串搜索dddbb反编译示例,敏感字符串搜索
在dddbb中看到字符串包含RSA2和AES时,应该与病毒加密方法和cmd命令有关。
3.2 ark工具可监控行为,此处使用小檗剑监控系统服务、流程、网络、文件操作、注册表和各种hook等。
在虚拟机上运行病毒:
病毒将资源段的zip压缩包文件释放到桌面上。 过了一半左右:
原始文件已加密,开头字符全部设定为WANACRY!
进程资源管理器显示病毒创建了四个子进程
绒剑监控:病毒流程wanacry包括文件修改、注册表修改、网络连接行为
通过运行监视@WanaDecrypor@.exe进程继续创建封闭进程,直观的效果是可以继续将自己的窗口弹出到顶部。
cmd进程:运行cmd命令以执行exe和bat
文件监视释放文件
病毒在系统的各个目录下释放了@ wana decryptor @.exe @ please _ read _ me @.txt的文件,在桌面上释放了bat文件。 之前也运行过bat脚本,可以看到运行后立即删除,在桌面上释放了其他文件。
修改文件在这里,我们将看到修改和重命名各种文件
注册表监视在测试环境中,只在SOFTWARE密钥中创建了一个子密钥就成功了---
网络监视病毒尝试连接到局域网中的几个ip,监视端口感染本身
3.3发行文件msg文件夹:显然是语言包
Please_Read_Me@.txt :恐吓文本
其他的暂时不能放在一边吧
3.4 dddbb分析发现WinMain函数
粗略分析可以得到以下信息
接下来进入各函数的详细分析
3.4.1子_401225
此函数返回了最后一个随机生成的字符串,因此可以更改其名称以方便查看。 在此修改为GetRandStr ()。
3.4.2判断
_p___argc (或命令行参数的数量,即返回argc,_p___argv ) )返回指向参数指针的指针,即argv。
判断为参数个数不相等,
第五个参数大于“/i”
在系统目录中创建文件夹
将当前模块复制为tasksche.exe以获取文件属性
创建tasksche.exe进程,使用互斥的主体机制作为进程保护
3.4.3注册表操作func_reg函数如下
3.4.4加载资源段func_resource(0,aWNcry );
资源释放不是关注的重点,所以大体上都有。
3.4.5填写比特币帐户
3.4.6导入私钥crypt(this,0,0,0 ) :导入私钥并分配内存
子函数sub_401861
其中函数sub_401
82C:获取句柄,加密服务为Microsoft Enhanced RSA and AES Cryptographic Provider
此处判断由于lpFileName为0,所以判断结果固定了,使用后一种方式导入秘钥。
3.4.6 解密t.wnrysub_4014A6(this, aTWnry, &size);
解密函数根据自定义的文件格式定位到加密内容,获取加密内容的大小,解密后保存在新开辟的内存中。
3.4.6 解析解密文件sub_4021BD(pefile, size),将解密后的文件的内存句柄和大小传入。
进入该函数,新增了几个api的地址传入。进入子函数sub_4021E9。
检查文件的PE格式。
来来回回处理最后把PE文件保存在堆中了。
主要是从堆中获取TaskStart地址运行它。
目前病毒的主体程序实际上只做了一些初始化的操作 到目前为止并没有看到它感染或加密任何一个文件 也没有对用户进行勒索 真正的核心代码在t.wnry中 ,由于这个函数是在堆空间中调用 所以在dddbb中并没有显示出伪C代码 那么接下来需要用OD提取出这个PE文件。
病毒主要功能在sub_4014A6函数提取出的pe文件中,OD找到该函数,获取到他的返回值。
得到保存PE文件指针,同时获取到文件大小为0x10000,dump内存脚本一行:
dm 8ABED0, 10000, “C:UsersyusakulDesktopt.wnry”
dddbb打开该文件查看导出表,前面的分析知道,主程序获取到了TaskStart的地址,并执行它,现在可以分析TaskStart函数了。
读取c.wnry文件保存在内存中,后续会有使用,将其写入c.wnry
3.4.2 注册表操作
检查用户是否SYSTEM,sid是否为s-1-5-18,作用是权限检查
其中sub_10004500函数:
检查文件00000000.pky 和00000000.dky 是否存在,是则尝试加解密测试字符串,比较加解密效果,函数sub_10003D10:
if判断成立后创建线程:定时写入c.wncy,检查权限,运行@WanaDecryptor@.exe进程,添加tasksche.exe开机自启。见sub_10004990函数。
然后是创建秘钥文件CreateKey:
这里会进入第一个分支,key1存在但是key文件目前为止没有发现生成,会导入秘钥数组,生成pky(公钥)文件。从byte_1000CF40数组中导入并创建秘钥,三步有一个失败则会退出。byte_1000CF40如下。
创建私钥
进入sub_10004170:
生成私钥后,会将其加密返回,动态调试t.wnry.dll,dump出两个密钥。
公钥
私钥
随后读取密钥。 3.4.5 线程1:读取资源
这一段主要功能为检查res文件是否存在,不存在则开辟线程,创建res文件并写入8位随机数。进入函数sub_10004790:
创建线程每5秒检测一次,直到测试成功则退出线程。
这个函数开始,F5伪代码逻辑比较混乱,各种跳转个循环,所以只贴出关键函数,进入下一层子函数:
进入下一层子函数sub_100027F0:
sub_10002300函数主要操作为过滤需要加密的文件,并保存要加密文件的文件夹信息到链表中,随后执行加密操作,其中也调用了DispatchEncrypt_10002940加密分发函数。随后的循环则把链表中的文件加密,根据加密方式,删除或者保存文件信息节点。
进入子函数sub_10002300:
第2步,在目录下创建临时文件,同时跳过当前文件夹“.”或者上级文件夹“…”,跳过系统目录的加密,经过过滤后将文件名和路径保存到String对象:
第3步,循环查找下一个文件,并过滤获取文档类型的文件,保存到new处那段内存中。
过滤掉系统目录,病毒释放文件,以及PE文件,要加密的文件类型如下:
第4步,遍历保存的路径,开始加密。
加密完成后再当前目录下创建勒索信息文件。第5步,加密分发函数DispatchEncrypt_10002940。
加密前的最后一次分类
到这里可以总结一下加密策略:
在枚举文件中,type=1,会对普通文件直接加密为.WNCRY,不再加入链表,大文件处理为.WNCYR,以及其他未作处理文件继续加入链表等待处理。枚举完成后,type从2-4,每个type遍历都遍历加密文件。type=2,加密FILE_TYPE_DOCEX普通文件为.WNCRY(移出链表),以及FILE_TYPE_DOCEX大文件为.WNCYR。
type=2, 删除.WNCRYT
type=3, 加密链表中所有文件(移出链表)
type=4, 加密可能剩余链表中的文件
验证文件是否未加密,或者未加密完成。已完成加密,直接退出。
type=4(只加密),打开wncyr或wncry文件;
type=3*(加密并修改文件名),按写打开源文件,将文件头0x10000字节内容移动到尾部,头部内容清零,写入加密文件头部数据,然后源文件移动为.WNCYR或.WNCRY。
加密文件,并将自定义的加密文件文件头写入新加密的文件。
//加密文件头部数据结构struct { char magic[8];//WANACRY!' int size;//0x100 char key[size];// int type;//加密文件类型3,4 __int64 datasize;// <=0x6400000 源文件大小 char data[1];//}
加密完成后,读取加密文件内容,写入源文件中:
当前加密类型为4:只加密时,这里又分两种情况:
1)如果文件被加密类型3处理过一次,那么读取加密类型3处理后的文件最后0x10000字节,写入刚刚加密完成的文件
2)如果文件未被加密处理过,那么读取加密处理后的文件,写入原文件,同时删除wncry文件
该线程主要加密流程如下
这里加密函数与前面的相同。