Wannacry勒索病毒分析
Wannacry病毒分析在15pb刚毕业,准备找活了,之前有幸听过奇安信的招聘会,大佬说,永恒之蓝病毒现在还在某些地方流行着,是经典的勒索病毒。这让我觉得分析这个病毒是刷经验的好机会,所以就在决定分析一下这个在2017年的纵横江湖无敌手的勒索之王,由于是新手入坑,不对之处还请多多指教(●ˇ∀ˇ●)分析平台:win7虚拟机分析工具:OD、IDA辅助工具:LordPE、PEID、010Edi...
Wannacry勒索病毒分析
在找活了,之前有幸听过奇安信的招聘会,大佬说,Wannacry病毒现在还在某些地方流行着,是经典的勒索病毒。这让我觉得分析这个病毒是刷经验的好机会,所以就在决定分析一下这个在2017年的纵横江湖无敌手的勒索之王,由于是新手入坑,不对之处还请多多指教(●ˇ∀ˇ●)
病毒简介: 该病毒亦称 “永恒之蓝”,它利用Windows系统的SMB漏洞可以获取系统最高权限。骇客通过改造“永恒之蓝”制作了wannacry勒索病毒,英国、俄罗斯、整个欧洲以及中国国内多个高校校内网、大型企业内网和政府机构专网中招,被勒索支付高额赎金才能解密恢复文件。
而该病毒分为蠕虫传播部分和勒索病毒部分,在这我只分析了勒索病毒Wannacry部分,由于是自己分析学习,所以我就尽量解释详细一点。下面开始分析样本。
- 分析平台:win7虚拟机
- 分析工具:OD、IDA
- 辅助工具:LordPE、PEID、010Editor、火绒剑、ResHacker、Hash等
1. 样本概况
首先获取到病毒样本然后解压
使用Hash工具查看基本信息01
2. 具体行为分析
2.1 主要行为流程图
2.2 病毒对用户造成的危害
加密了常用的大多数格式(约100多种)的文件,加密成后缀是.WNCRY文件,不花钱基本无法解密。
2.3 病毒行为分析
2.3.1 首先使用PEID观察是什么语言、编译器、壳
结论是c/c++语言编译器是C++6.0写的程序,无壳。
2.3.2 LordPE观察导入表
- 首先观察到有加载锁定资源和打开互斥体相关API,猜测有可能是释放资源操作,还有创建互斥体运行单一实例的常见病毒行为操作。
- 然后还观察到操作服务和注册表相关的API,猜测修改注册表,这基本是病毒必备的了。
2.3.3 使用火绒剑观察行为
- 首先查看执行监控,执行了attrib.exe隐藏程序、还有cmd和一些病毒自己释放的程序。
- 查看注册表监控,发现设置了注册表
- 查看文件监控,基本没有文件操作,勒索病毒怎么可能没文件操作!猜测加密操作应该是在释放的资源中完成的。
- 查看行为监控,首先看到释放很多文件
还有启动自释放的文件
修改注册表自启动项
- 查看网络监控,发现监听了2个端口,和连接一些随机的IP地址可能是蠕虫传播行为。
3. 详细分析
详细分析主要用到OD的动态分析和IDA的静态分析,只有动静结合才能更好更快更轻松的分析病毒。
3.1 wcry.exe程序分析
找到WinMain函数后分析出了最后的一览图如下:
从上图中可知有几个比较关键的函数下面将一一分析他们。
1. ModifyRegedit函数修改了注册表
注册了一个名称为wd数据是当前目录的项
2. FreeRsrcFile释放资源函数
知道了有释放资源的相关操作,首先用ResHacker资源编辑工具查看wcry.exe的资源,发现一个资源类型为XIA,名称为2058的资源数据,可以看到16进制是 50 4B开头说明这个一个ZIP压缩包。
而该函数中FindResourceA,LoadResource,LockResource,SizeofResource这几个函数组合就是明显的要利用资源了,接下来的代码就是解压ZIP包释放出里面每个数据到当前目录。
3. AddWrite_cwnry函数写入比特币账户信息
此函数首先会从3个比特币账户中伪随机抽取出一个(不同的电脑抽取到的账户不同),然后把改账户写入到c.wnry文件中,我的电脑写入的是"13AM4VW2dhxYgXeQepoHkHSQuy6NgaEb94",从而得出结论c.wnry文件存储的是比特币账户信息,可能被用于解密器读取。
运行病毒后可查看到解密器右下角有该账户信息
4. HideAndCreate函数是以命令行和不显示GUI窗口的方式启动程序
- 第一次传入的命令行参数是"attrib +h .",该参数意为隐藏属性,运行过后发现病毒所在的当前目录不见了,在文件夹选项中点击显示隐藏文件后,可看见该目录被隐藏了!
- 第二次运行它命令行参数是"icacls . /grant Everyone:F /T /C /Q",意为创建一个名为Everyone的账户,授予/T /C /Q的访问权限。
5. GetSomeAPI函数
该函数就是获取一些加密解密和文件操作的API地址
6. InitCriticalSec函数
该函数用于初始化临界区,用于线程同步。此病毒之后会分析到有5个线程,对于多线程的程序,临界区的使用很有必要。它能做到多个线程对同一段代码的访问时,我正用着这个资源呢,不希望别的线程使用它。
7. KeyAndMem函数
主要是分配了2块全局堆内存
8. DecryptPeData解密函数
首先此函数会读取t.wnry文件进行一系列简单的操作之后,把t.wnry文件里的内容进行解密,然后得到一个大小为0x10000字节数据,可以观察内存有0x5A4D 和0x4550所以确定这是一个PE文件。
提取该PE文件,直接复制该0x10000字节的二进制内存数据,然后在010Editor中Crtl+Shift+V粘贴后保存为EXE文件,再用PEID查看,实际上他是个DLL动态库文件。
把它保存为t.wnry.dll文件,那么就知道了t.wnry文件保存的是t.wnry.dll加密后的数据,从之后的分析中会知道这个模块才是wannacry病毒的核心模块,关键的功能都在这个模块中实现的。
9. PeToMem加载DLL函数
这个函数比较复杂,总结起来也很简单,就是申请了一块虚拟内存存放t.wnry.dll的内容,把改虚拟内存中NT头和DOS头的地址存放进堆空间中。
从下图可以看出堆内存中第一个地址中是NT地址,第二个地址保存的是DOS头地址。
10. GetFunAddr函数
它遍历t.wnry.dll的导出表,最终找到并返回了TaskStart函数的地址
11. 调用TaskStart函数
这个函数才是真正的核心函数,病毒功能都在这里面实现。
12. FreeData函数收尾释放数据
3.2 TaskStart函数分析
- t.wnry.dll模块中TaskStart函数才是真正的加密函数,亦可称之为加密器,wannacry的核心功能都在这里面实现,这个函数就是水磨工夫,分析过程中很有很多函数没用过,就查MSDN和百度, 比较耗时,但是静下心来还是能勉强理解它的,坚持就是胜利。
- TaskStart函数在t.wnry.dll模块中,分析时打开它g到0x10005AE0 地址反编译为伪C代码后一览图
接下来逐一分析:
1. SingleRun单一运行函数
可以看到它创建了名为MsWinZonesCacheCounterMutexA的互斥体,用于防多开,确保单一实例运行,套路!
2. 之后进行了一些操作,读取c.wnry文件,对比密钥不等,获取一些API地址这些比较简单的操作。
3. NoDoubleOpen函数
这个函数,检测一个互斥体,第一次没有所以它再次创建了一个名称是"Global\MsWinZonesCacheCounterMutexA0"的互斥体。
4. CheckFileExist函数
它检测一个00000000.dky的文件,由于第一次没有,不理睬,继续跟踪。
5. CreatePubPriFile函数
这个函数总结后就是在当前目录创建00000000.pky文件保存公钥,创建00000000.eky保存加密后的私钥。在OD中分析工程中能看到RAS和AES等字符串,说明此病毒采用的是RAS和AES双重加密。
- WritePubKeyToFile写入公钥文件函数
- WritePriKeyToFile写入私钥文件函数
6. 然后调用了几个不怎么重要的函数,接下来就是创建5个线程
7. 第一个线程回调函数CreateResFile1
此函数就是创建00000000.res文件写入时间信息
- CreateResFile函数填充了8个字节随机数和4字节时间信息的内容,在之后这个.res还会保存更多的时间信息,所以得出结论.res文件是用来保存时间信息的。
8. 第二个线程回调函数CheckDkyFile
每隔5秒检测00000000.dky文件对其处理。
9. 第三个线程回调函数CheckNewDisk
它的功能就是每3秒检测是否有新的磁盘,有就对其文件加密,我的虚拟机没有新磁盘,所以就略过。
10. 第四个线程回调函数RunTaskdl1
每隔30秒运行一次taskdl.exe程序。
11. 第五个线程回调函数RunExeAndSetReg
每隔30秒就运行taskse.exe和@WanaDecryptor@.exe这两个程序和设置注册表启动项。
- RunTwoExe函数功能是运行taskse.exe和@WanaDecryptor@.exe程序
- SetRegeditRun函数
把"C:\Users\15pb-win7\Desktop\wcry\wcry2.0\tasksche.exe"设置为自启动项
12. 加密关键函数
(1.0) EnOne_100057C0加密函数第一层
这个函数很长,很多,函数嵌套复杂,所以先分析第一层的前半段,前面一些函数条件不满足的就不管它了,从CopyUwnryFile开始分析
- CopyUwnryFile函数
此函数首先检测@WanaDecryptor@.exe文件是否存在,没有就拷贝u.wnry的内容创建为新未见@WanaDecryptor@.exe。并且在之后创建了一个@WanaDecryptor@.exe.lnk文件也就是@WanaDecryptor@.exe文件的快捷方式。
可以双击@WanaDecryptor@.exe程序发现这个就是解密器程序,它会显示出勒索窗口和勒索桌面背景。
可以得出结论u.wnry文件保存就是解密器内容的数据。
- CreateReadingFile函数
这个函数拷贝r.wnry里的内容生成一个阅读文件@Please_Read_Me@.txt。
打开@Please_Read_Me@.txt一大堆英文,提醒用户:你该交钱解密了…
(2) EnTwo_10005480加密函数第二层
这个函数获取了桌面路径和文档路径,并对其下的文件进行加密,然后再查找其他所有用户,对其他用户的文件进行加密。
(3) EnThree_100027F0加密函数第三层
这个函数就是过渡的作用,主要还是看第四层里的内容。
(4) EnThree_100027F0加密函数第四层
首先获取桌面路径
然后遍历文件,挑选出需要加密的文件保存其信息到一个数据结构中
- 其中SelectEncryptFile函数辨别出哪些是需要加密的文件,从下面的图中可知这个病毒丧心病狂,居然要加密100多种格式的文件,基本包含了我们常用的所有文件。
回到第四层继续,之后就进入了一个循环中,每次在数据结构中取出一个信息,调用第五层加密函数加密对应的文件。然后判断目录层级是否小于等于6是就拷贝@Please_Read_Me@.txt文件和@WanaDecryptor@.exe到当前目录。
(5) EnFive_10002940加密函数第五层
第五层比较简单,首先判断文件是那种类型(病毒作者自定义的类型),然后根据类型的不同决定是否加密。
(6) EnSix_10002200加密函数第六层
第六层也比较简单,首先获取原文件全路径,对比该文件是否是.WNCRY格式,不是就在其文件名后追加.WNCRY,然后经过第7层加密的问价就以其命名!
(7) EnSeven_10001960加密函数第七层
首先读取原文件前8个字节比较是否是"WANACRY!",之后文件类型是4的情况下,会在新的文件名后面加上字符"T"如:“C:\Users\15pb-win7\Desktop\1234.docx.WNCRYT”,再创建该文件,也就是加密后的文件,此时只是没有填充内容而已。
然后在该文件中依次写入8字节字符"WANACRY!"、某个大小数值0x100、再写入0x100大小的数据、文件的类型值和原文件的大小。
然后再读取原文件内容经过第八层加密后,输出加密后的内容,再把该内容追加写入到刚才创建的文件中,设置文件日期和时间信息,加密文件就到此完成了,最后做了一个移动文件的操作,实际作用就是个文件后缀.WNCRYT改为.WNCRY。
(8) EnAight_10006940加密函数第八层
第八层就是通过解析原文件,每次输入16个字节通过第9层加密后输出16个字节,依次循环直到加密完成为止,然后输入加密后的缓冲区。
(9) 加密函数结语:加密函数从第八层之后就完全是数据加密相关的代码,没有其他重要的操作了,层数太多,关于加密函数的分析我也就到此为止了。
接下来回到第一层,继续分析第一层后半段的代码。
通过以上对加密函数层层分析,已经知道了加密形式是怎么进行的了,只是上面的加密只针对桌面文件进行加密,实际上从加密函数第三层开始传入的参数不同,加密的路径自然也会改变。
(1.1) 紧接加密后的下一个函数是InterlockedExchange原子操作,交换两个数。这也是由于多线程的原因,用于线程同步,让线程之间互补干扰。
(1.2) 接下来加密全盘文件,获取出所有磁盘类型,对固定的磁盘文件进行加密,然后再对其他用户同样进行此操作。主要加密函数是EncryptDiskAll。
- EncryptDiskAll函数
此函数会得到磁盘的盘符如"C:",在最后它会调用加密函数的第3层,加密全盘的数据,如有其它盘也一样。
在这之前会得到一个临时路径,只有c盘时是:“C:\Users\15PB - W~1\AppData\Local\Temp”,之后我添加了一个E盘,得到的是:“E:$RECYCLE”
(1.3) 最后一段代码
- 先开始以不显示GUI窗口的方式启动了解密器@WanaDecryptor@.exe程序,此时可看到桌面背景被更改了
- 再向00000000.res文件写入当前时间信息
- 运行cmd
- 不断的向磁盘写入数据
- WriteMassData写入删除数据函数分析
首先该函数在之前得到的临时目录以隐藏方式创建了hibsys.WNCRYT文件
然后获取磁盘是否还有多余空间,有责每次写入0xA00000个字节的0x55,循环写入0x14次,检测磁盘有无多余空间。。
我花了10多分钟检测了一下写满磁盘会发生什么,如下图,我的磁盘总60G被写满了之后单步跟踪OD会发现它又把这整个文件删除了,回复了原来空闲空间,我只想说一句"卧槽",我猜测病毒作者的意图是不断的占用磁盘的性能,让用户欲罢不能。
好吧,我的猜测都是错的,一次面试大佬给我解释了,磁盘的数据是可以找回的,前提是被删除文件后该磁盘并没有发生过大量重新读写,而此病毒不断读写磁盘就是为了阻止数据恢复
到此TaskStart函数就分析完毕,在整个分析过程中由于是多线程程序,有些函数的分支我分析的时候不满足条件,我就没有分析下去,所以,肯定有些关键点我没分析到,比如创建了加密文件后,会删除原文件,我就没分析到删除原文件是哪里进行的,这不得不说是个小遗憾,由于是新手分析了10来天,我有点小崩溃不想继续分析了,我也算对得起WannaCry了,哈哈,接下来分析最后两个程序taskdl.exe和taskse.exe。
3.3 taskdl.exe程序分析
taskdl.exe程序是在TaskStart函数的第4个线程中被运行的。现在分析它,当然前面的步骤都一样,查壳,看是什么程序等等。
找到WinMain函数可以看到,这个程序就是用来删除后缀为.WNCRT的文件的。
进入DeleteFile11函数中发现,这就是获取上面才分析过的临时路径,他删除里面的.WNCRYT文件实际就是删除hibsys.WNCRYT这个文件。
所以得出结论taskdl.exe的功能就是删除hibsys.WNCRYT文件。
3.4 taskse.exe程序分析
TaskStart的第5个线程运行了此程序,分析这个程序的时候我们要注意用OD打开它后需要添加点击"调试" ->"参数"附加参数"taskse.exe C:\Users\15pb-win7\Desktop\wcry\wcry2.0@WanaDecryptor@.exe"才能正常运行。
最开始判断参数是否符合,然后进入提权函数
- 进入ChangePrivileges函数中的ChangePrivilege函数
首先获取了一些权限相关的API函数的地址,然后进行提权操作,所以taskse.exe程序的功能就是进行提权。
最后还有一个解密器@WanaDecryptor@.exe,我就不分析了,直接运行它,就可知道它的功能,生成一张图片,把它设置为桌面背景,然后每个几秒弹出一个勒索窗口让用户交钱。
4. 解决方案
- 因为采用高强度的RSA和AES双重加密,所以如果你的文件已被加密,只有交钱才能解密,交了钱也不一定100%能解密。
- 电脑打补丁,因为此病毒是利用“永恒之蓝”漏洞进行传播的,打完补丁后就阻止了蠕虫病毒的传播。
- 可以创建名为“MsWinZonesCacheCounterMutexA”互斥体阻止病毒运行。
- 把该病毒的特征码加入病毒库,一经发现立马查杀。
更多推荐
所有评论(0)