在找活了,之前有幸听过奇安信的招聘会,大佬说,Wannacry病毒现在还在某些地方流行着,是经典的勒索病毒。这让我觉得分析这个病毒是刷经验的好机会,所以就在决定分析一下这个在2017年的纵横江湖无敌手的勒索之王,由于是新手入坑,不对之处还请多多指教(●ˇ∀ˇ●)
病毒简介: 该病毒亦称 “永恒之蓝”,它利用Windows系统的SMB漏洞可以获取系统最高权限。骇客通过改造“永恒之蓝”制作了wannacry勒索病毒,英国、俄罗斯、整个欧洲以及中国国内多个高校校内网、大型企业内网和政府机构专网中招,被勒索支付高额赎金才能解密恢复文件。
而该病毒分为蠕虫传播部分和勒索病毒部分,在这我只分析了勒索病毒Wannacry部分,由于是自己分析学习,所以我就尽量解释详细一点。下面开始分析样本。
首先获取到病毒样本然后解压
使用Hash工具查看基本信息
加密了常用的大多数格式(约100多种)的文件,加密成后缀是.WNCRY文件,不花钱基本无法解密。
结论是c/c++语言编译器是C++6.0写的程序,无壳。
详细分析主要用到OD的动态分析和IDA的静态分析,只有动静结合才能更好更快更轻松的分析病毒。
找到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窗口的方式启动程序
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函数收尾释放数据
6. 然后调用了几个不怎么重要的函数,接下来就是创建5个线程
7. 第一个线程回调函数CreateResFile1此函数就是创建00000000.res文件写入时间信息
8. 第二个线程回调函数CheckDkyFile每隔5秒检测00000000.dky文件对其处理。9. 第三个线程回调函数CheckNewDisk它的功能就是每3秒检测是否有新的磁盘,有就对其文件加密,我的虚拟机没有新磁盘,所以就略过。10. 第四个线程回调函数RunTaskdl1每隔30秒运行一次taskdl.exe程序。
11. 第五个线程回调函数RunExeAndSetReg每隔30秒就运行taskse.exe和@WanaDecryptor@.exe这两个程序和设置注册表启动项。
接下来回到第一层,继续分析第一层后半段的代码。通过以上对加密函数层层分析,已经知道了加密形式是怎么进行的了,只是上面的加密只针对桌面文件进行加密,实际上从加密函数第三层开始传入的参数不同,加密的路径自然也会改变。
(1.1) 紧接加密后的下一个函数是InterlockedExchange原子操作,交换两个数。这也是由于多线程的原因,用于线程同步,让线程之间互补干扰。(1.2) 接下来加密全盘文件,获取出所有磁盘类型,对固定的磁盘文件进行加密,然后再对其他用户同样进行此操作。主要加密函数是EncryptDiskAll。
(1.3) 最后一段代码
taskdl.exe程序是在TaskStart函数的第4个线程中被运行的。现在分析它,当然前面的步骤都一样,查壳,看是什么程序等等。找到WinMain函数可以看到,这个程序就是用来删除后缀为.WNCRT的文件的。进入DeleteFile11函数中发现,这就是获取上面才分析过的临时路径,他删除里面的.WNCRYT文件实际就是删除hibsys.WNCRYT这个文件。所以得出结论taskdl.exe的功能就是删除hibsys.WNCRYT文件。
TaskStart的第5个线程运行了此程序,分析这个程序的时候我们要注意用OD打开它后需要添加点击"调试" ->"参数"附加参数"taskse.exe C:\Users\15pb-win7\Desktop\wcry\wcry2.0\@WanaDecryptor@.exe"才能正常运行。最开始判断参数是否符合,然后进入提权函数
最后还有一个解密器@WanaDecryptor@.exe,我就不分析了,直接运行它,就可知道它的功能,生成一张图片,把它设置为桌面背景,然后每个几秒弹出一个勒索窗口让用户交钱。
最后病毒样本(解压密码15pb)、wcry.exe的UDD,和一些IDB分析文件打包上传!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)