说明一下,本来应该一周前就发出来,由于某些自己的功利心作祟,导致晚了几天,惭愧!
最近,WannaCry是火了一把,到处都是分析文章,报告,解决方案等等。
趁着这个热度,我也来跟风一把。
前前后后把WannaCry详细分析了一遍。
从文件释放、启动加密器、文件加密策略、加密算法、到解密过程中所有细节进行了详尽深入的分析。
由于没有拿到初始样本,没有包含漏洞利用部分的分析。
样本信息:
MD5: 84C82835A5D21BBCF75A61706D8AB549
SHA1: 5FF465AFAABCBF0150D1A3AB2C2E74F3A4426467
CRC32: 4022FCAA
无壳 / Visual C++ 6.0
下面具体看分析内容。
大致流程图如图:
下面开始详细分析各个部分细节。
设置当前目录为工作目录,然后查找PE中资源(XIA)。
直接用资源工具看一下,发现是PK开头的,多半是个压缩文件了,导出来试试。
解压还要密码,看代码密码是WNcry@2ol7,解压成功。
读取资源数据后,解压释放文件到当前目录。
在三个比特币交易地址中随机选择一个,写入c.wnry
然后设置当前目录为隐藏属性,且设置为everyone可访问
然后初始化Crypt相关函数,用于后面的解密操作。
开始操作文件t.wnry,看看内容,应该是个加密文件。
然后通过crypt API将t.wnry解密之后(解密后是个DLL模块,dump数据后可以用于分析),映射到内存(自己loaddll),然后找到导出接口函数TaskStart调用,开始加密工作。
TaskStart一进来,通过MsWinZonesCacheCounterMutexA的Mutex进行单示例检查,有则退出,没有继续工作。
然后是设置工作目录,读取c.wnry信息。
检查是否是SYSTEM账户。
初始化Crypt相关函数,以及文件操作函数(增加一点分析成本)。
检查Global\MsWinZonesCacheCounterMutexW,Global\MsWinZonesCacheCounterMutexA\0是否存在,
存在则表示加密相关准备工作已经完成,不在进行,没有则创建Global\MsWinZonesCacheCounterMutexA\0
检查00000000.dky和00000000.pky是否存在,存在是否配对的密钥,是则加密相关准备工作已经完成,不在进行,没有则进行后续工作。
如果加密相关准备工作已经完成,创建一个线程,完成如下工作(记为工作A):
如果加密准备未完成,初始化密钥,保存到00000000.pky, 00000000.eky。
由于时间关系,具体加密密钥产生过程不再详述,很多分析文章说的很清楚了,本文重点不在此。
然后是如果00000000.res不存在,通过CryptGenRandom产生8字节随机值,后续会写入00000000.res
接着创建5个工作线程,完成不同的工作。
线程4每30秒启动taskdl.exe清除所有磁盘的回收站文件
线程5完成的也是前面提到的工作A的内容,不再详述
然后就是重点了,加密文件部分了。
拷贝u.wnry为@WanaDecryptor@.exe,通过写一个bat创建@WanaDecryptor@.exe.lnk快捷方式。
读取r.wnry内容,生成@Please_Read_Me@.txt文件。
枚举当前用户桌面和文档目录文件,进行加密(没有设置不复写标记,删除前会复写)。
枚举All Users\Desktop和All Users\Documents,找到非当前用户目录进行加密(没有设置不复写标记,删除前会复写)。
下面记为工作B:
通过taskkill强删Microsoft.Exchange、sql和mysql进程(加密其数据)
加密磁盘中文件,每个分区重复两次(会设置不复写标记,删除前不会复写)。
枚举All Users\Desktop目录,复制b.wnry到目录中为@WanaDecryptor@.bmp,设置桌面背景为@WanaDecryptor@.bmp,
执行@WanaDecryptor@.exe co
更新00000000.res
cmd.exe /c start /b @WanaDecryptor@.exe vs
每个磁盘(fixed)创建x:/$Recycle/hibsys.WNCRYT(系统盘写在temp目录,x:/$Recycle被设置为系统隐藏属性),读取分区可用空间大小,大于0x40000000(1GB)的话,每10微秒循环写入0xa00000个字节的'U',写20次,然后删除该文件,并且设置了重启后删除。
每隔60s重复工作B,直到退出标志为真。
枚举文件采用方式为:
枚举当前目录中所有文件(排除文件看下文),加入文件链表,记录所有子目录(排除目录看下文)到目录链表。
本目录文件有加密操作(具体看下文)
分析目录层级,少于等于6层的,拷贝lease_Read_Me@.txt到目录,5-6层的拷贝@WanaDecryptor@.exe.lnk,1-4层拷贝@WanaDecryptor@.exe到目录。
然后遍历目录链表,枚举子目录,重复1操作。
子目录枚举完成,所有文件记录到链表,进行后续操作。
目录和文件采用相同的链表结果,总结如下:
枚举子目录时,会跳过如下目录(保证系统正常工作):
枚举文件时,首先跳过 @Please_Read_Me@.txt,@WanaDecryptor@.exe.lnk, @WanaDecryptor@.bmp
然后检查文件类型,跳过0,1,6类型文件,其他文件加入链表。
具体类型如下:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!