首页
社区
课程
招聘
[原创]对WannaCry的深度分析
发表于: 2019-2-19 16:40 16520

[原创]对WannaCry的深度分析

2019-2-19 16:40
16520

最近准备面试病毒分析岗,听大佬们说有的面试官会问是否分析过WannaCry,所以就准备分析分析永恒之蓝,一来方便自己面试,二来还能给自己刷经验。萌新第一次分析病毒,分析的不好各位大佬多多见谅啊~

首先使用PEiD和ExeInfo工具对样本进行查壳 以下是查壳结果

结论:病毒使用VC6编写的 无壳

首先在IDA中查看程序的字符串信息 看看能否得出某些信息![]


在IDA中看到字符串中含有RSA和AES 应该是和病毒加密方式相关 但具体的还需要再进一步确认

紧接着看到了这么一串字符串 关于cmd命令 大概是在引用某些参数

字符串的部分就只有这么多信息

既然字符串中识别到了用于加密的标准库函数 那么在这里我使用PEID的Kyrpto ANALyzer插件扫描病毒程序 来识别加密算法 扫描结果如图所示

由上图可知 病毒使用了CRC32和AES加密算法 其中CryptDecryptCryptDecrypt是微软提供的用于一个用于加密的类库 而ZIP2和ZLIB是压缩算法



Kernel32的导入函数里发现了 LoadResource LockResourse FindResourceA 等函数 说明资源段里可能会大有文章 此处需要留意

接着 在ADVAPI32.dll里发现了注册表相关的操作 说明病毒对注册表进行了操作

接着查看病毒的资源段


最重要的就是这个资源名为XIA的自定义资源了 由于资源头是PK 所以猜测这应该是个ZIP压缩文件 接下来直接将资源提取

可以看到 上图就是提取出来的资源 这个就是病毒释放到桌面的一些文件了 但是具体是什么 需要进一步分析

首先使用ProcessMonitor查看一下进程树

由上图可以得知 病毒创建了四个子进程 其中还使用了cmd.exe执行一个批处理脚本文件

关于注册表 这里我使用regshot对运行病毒前后做一个快照进行比对 直接查看结果

关于注册表的修改操作并不多 在HKLM\SOFTWARE新增加了一个键 并且把当前病毒的路径添加上去 并且还添加了另外两个值

接下来是文件的监控



图一: 病毒在系统的每一个目录下释放了@WanaDecryptor@.exe @Please_Read_Me@.txt的文件 这里应该是在感染文件了

图二:在桌面目录下创建了一个.bat的批处理脚本 然而我在桌面上却没有看到这个脚本 应该是执行完之后被删除了

图三:病毒在系统盘和桌面释放了几个PE文件并启动执行 这里应该是在释放隐藏在资源中的文件

从网络监控可以看到 病毒一直在监听两个端口 并尝试连接局域网内的一些ip 企图向局域网扩散

至此 基础的动态分析也就结束了

下面我们来对WannaCry的每一个函数进行逐个解析 以便搞清楚病毒所有的行为

以上是WannaCry的主体逻辑 但是这个并不是WannaCry的全部代码 只是一个傀儡exe而已 其中百分之九十的代码都是病毒的准备工作 下面将对所有的函数进行逐一分析

首先 我将其主体分为两个部分 第一部分 初始化操作 第二部分 加载病毒核心操作

首先来分析第一部分 也就是病毒的初始化操作 代码逻辑如下

首先来分析一下第一个未被IDA签名库识别的函数 我将他命令为GetRandom 函数主体如下


病毒首先获取到计算机名 然后计算出计算机名的ASCII乘积 将这个乘积作为随机数种子 调用两次rand函数 最后获取到一个字母+数字的随机字符串

接下来程序对命令行参数做了一个判断 然后切换当前进程的路径为工作目录 之后来到第二个未被IDA识别的函数 函数主体逻辑如下

病毒创建了一个注册表项 然后将当前的exe所在的绝对路径设置到到注册表的\HKEY_LOCAL_MACHINE\SOFTWARE下 但是在我的机器上设置失败了 因为这个注册表键的设置需要有管理员权限才能成功

这个函数首先将资源中隐藏的压缩包进行解压 解压密码是WNcry@2017 然后释放压缩包中的所有文件到当前进程的路径下

释放完之后的桌面路径如下图所示

其中msg文件夹下的是病毒用到的语言包 至于剩下的文件目前还不得而知

接下来分析WriteCwnry这个函数 函数主体如下

这个函数获取到了三个比特币账户 然后随机将其中的某一个写入到c.wnry文件中 所以c.wnry这个文件应该是跟勒索相关的

ExeCmdCommand这个函数执行了两次 主体如下

第一个ExeCmdCommand创建了一个进程 进程的参数是attrib +h . 这个参数的含义是将当前路径下的所有文件设置为隐藏 但是这其实是个错误的命令 正确的命令是attrib +h 没有后面的那个点 所以这个函数也就没有起到作用

第二个`ExeCmdCommand直接看命令行参数 'icacls . /grant Everyone:F /T /C /Q' 这条命令是给当前的windows系统添加了一个叫Everyone的用户 并给这个用户所有的权限

至此 第一个部分分析完成

接下来分析第二部分 主体如下所示 这部分的函数所有的操作都只有一个目的 就是为了调用dll中的导出函数 接下来我们逐个进行分析

GetApis的函数主体如下

这个函数的功能很简单 就是在获取各个API函数的地址 比如CreateFileW WriteFile 等等 为后面的操作做准备

接下来是这个对象的构造函数了

也没有做什么实际的时候 初始化了两个用于线程同步的临界区对象

接下来是ImportKeyAndAllocMem

这个函数做了两件事情 1. 导入RSA的私钥 用于后面的解密文件 2. 申请两块大小为0x100000的内存

私钥已经导入完成 那么接下来要做的就是解密了

这个函数一直在对t.wnry这个文件进行读取操作 读取到内存之后传入上个函数拿到的密钥句柄 在内存中进行解密 然后返回解密之后的文件内容 我们可以在OD中查看函数的返回值

这里可以看到解密之后的内容 是一个PE文件 接下来提取出解密之后的文件内容 查看一下PE结构 判断是个dll文件 接下来再跟t.wnry原始文件做一个对比

大小值相差了0.2KB 那么可以判定t.wnry是个隐藏的dll文件

解密完成之后 再看下一个函数WriteAllocMem



这个函数的代码量比较多 但是总结起来 就做了两件事 1. 申请了一块堆空间 2.去掉了解密出的PE文件的DOS头以后 将整个PE文件拷贝到了堆空间中

这个函数传了两个参数 一个是堆空间的首地址 一个是TaskStart这个字符串 单步步过这个函数 可以看到函数返回了一个地址

并且在后面调用了这个这个地址 但是我们并不知道地址从何而来 所以还需要跟进去

函数主体如下

这个函数首先取出了数据目录表 然后根据数据目录表找到了导出表 接着查看刚刚提取出来的dll的导出表 如下

有一个导出函数TaskStart 这不就是传进去的第二个参数吗?

接着比对dll和调用返回地址的汇编代码 如下

第二部分分析完成 接下来做一个小结 总体行为如下

从上面的分析可以得出病毒的主体程序实际上只做了一些初始化的操作 到目前为止并没有看到它感染或加密任何一个文件 也没有对用户进行勒索 真正的核心代码在t.wnry中 由于这个函数是在堆空间中调用 所以在IDA中并没有显示出伪C代码 那么接下来需要分析刚刚提取出来的dll

主体逻辑如下 下面就是病毒的所有操作了 包括加密文件 勒索用户等所有操作

这个函数从注册表中获取到当前用户的SID并与系统的SID做比较 返回比较的结果

这个函数在桌面创建了00000000.pky和00000000.eky 这两个文件 其中00000000.pky是公钥 00000000.eky是加密后的私钥 我已经将未加密是私钥提取出来 如下

接下来的 五个线程回调函数就是整个程序的重点了

这个函数在工作路径创建了00000000.res这个文件 并且往里写入数据

写入的内容如下 其中有0x8个字节的随机数 还有0x4个字节的当前时间

这个函数的作用是每个五秒检测工作路径下是否存在774F34B5.dky这个文件 文件名应该是个随机数 不是固定的 如果存在的话会执行sub_10003D10这个函数 由于我的桌面上一直都没有存在 所以这个函数我也就没有去分析

这个函数是整个病毒程序最核心的函数 代码量最多 里里外外总共嵌套了十几层函数 我感觉比整个熊猫烧香的代码还要多 下面是这个函数的第一层

循环检测是否有新的磁盘加入 如果有 则加密 没有就一直循环

接下来进入到核心函数第二层

第二层有三个比较重要的函数 每个都有各自的作用 我们重点解析第二个加密函数

这个函数单独创建了一个线程 将一部分文本文件移动到临时目录下 并进行重命名

下面是这个函数循环结束后我的临时文件夹下的文件 这些文件并没有加密 是可以直接通过修改后缀名恢复

这个函数就比较有意思了 它会在在$RECYCLE下创建一个名为hibsys.WNCRYT的文件 并设置属性为隐藏 然后循环往这个文件写入数据 直到磁盘空间不足跳出循环

当这个函数结束的时候 这个文件居然有39个G

这个函数对磁盘和路径做了一个判断 然后又调用了另外一个函数 我们需要再次进入到这个函数

进到第三层之后又有一个函数 这个函数会遍历并且加密所有的文件 而且是递归调用的 然后我们再次进入这个函数

这个函数首先遍历所有的文件 对文件夹和文件执行不同的操作 并且对后缀名进行过滤

首先跳过 @Please_Read_Me@.txt,@WanaDecryptor@.exe.lnk, @WanaDecryptor@.bmp

具体类型如下

0 没有后缀以及其他类型后缀

1 .exe, .dll

4 .WNCRYT

5 .WNCYR

6 .WNCRY

2.

3.

总结为下面的枚举

这个函数首先会调用sub_10002E70这个函数 根据这个函数返回值的不同 执行不同的加密策略 对加密策略做一个总结

cmd=4, 加密可能剩余链表中的文件

虽然操作不同 但是加密函数是同一个 接下来再次进入EncryptFiles

这个加密函数首先做了一些准备工作 获取文件的后缀名 然后跟.WNCRY做判断 如果比较成功 则不加密 接着做了一个字符串拼接 然后才开始加密文件 那么我们还要再往里跟一层

接下来是这个程序的核心的加密算法了 他加密的步骤如下

读取文件前0x8个字节的内容 跟WANACRY!作比较

使用原文件名+.WNCRYT 创建一个新文件 创建的时候这个文件并没有任何内容

对创建的文件写入数据

读取原文件 将加密后的文件内容写入到创建的文件

至此 病毒的加密函数就分析完成

这个函数每隔三秒以隐藏的方式启动taskdl.exe 那么接下来还需要对taskdl.exe进行分析

这个函数每隔三秒会启动工作路径的taskse.exe和@WanaDecryptor@.exe并且使用cmd设置注册表启动项

这个函数以命令行的方式启动taskse.exe 参数为为C:\Users\GuiShou\Desktop\@WanaDecryptor@.exe 这个参数需要暂时记住 待会分析taskse.exe的时候需要用到

并且以命令行的方式显式启动@WanaDecryptor@.exe 这个是病毒的解密器

函数将获取到的随机的字母+数字设置到注册表启动项 但是在我的机器上是设置失败的 因为命令敲错了 正确的命令应该是这个

这个是整个病毒程序最后一个函数了

这个函数有三个函数比较重要

这个函数会检测@WanaDecryptor@.exe.lnk是否存在 如果不存在 就创建一个批处理脚本 并且将命令写入到.bat脚本 这个脚本的作用仅仅的给@WanaDecryptor@.exe创建一个快捷方式

这个函数首先检测工作路径下的@Please_Read_Me@.txt是否存在 如果不存在 就从r.wrny中读取内容 并写入到@Please_Read_Me@.txt 这个是病毒的勒索文档

这个函数的作用是获取windows所有的用户名 并检测是否和当前的用户名一致 如果不一致 就加密那个用户的所有文件 用的还是刚刚我们分析过的加密函数

剩下的就都是一些重复操作了 至此病毒的核心程序就分析完成

接下来我们来对病毒程序释放的taskdl.exe做一个详细的分析 taskdl.exe的主函数如下

那么从上面可以看到这个exe的代码量比起其他两个来说可以说是简单的多的多的多了 其中最核心的函数只有一个 就是上面的DeleteFile这个函数 接下来进入到这个函数进行详细分析

首先是GetRecyclePathOrTempPath这个函数 这个函数在病毒的主程序里面也有 它会返回两个路径 一个是回收站路径 也就是D:\$RECYCLE 第二个是系统盘的临时文件夹的路径 C:\Users\GuiShou\AppData\Local\Temp

接着这个函数会循环两次 然后对这两个文件夹做处理 由于我的虚拟机环境只有一个C盘和D盘 所以我并不知道如果多一个盘会出现什么情况

接着函数会调用FindFirstFileW这个函数查找目标文件夹中所有.WNCRYT 结尾的文件 第一次循环我这里失败直接返回 因为我的回收站并没有.WNCRYT 结尾的文件 但是我们要分析另外一条分支 所以我在临时文件夹下创建了这么几个文件来方便调试

如果FindFirstFileW调用成功 就会走下面的分支

首先这个它会遍历所有的.WNCRY文件 并且将文件的完整路径和长度存储到一个容器中 如下图

当文件遍历结束 会调用DeleteFileW删除所有的.WNCRY后缀的文件

接着 这个函数的功能就算是完成了

函数末尾循环将存放文件的完整路径和长度的容器清空 然后释放内存

至此 taskdl.exe这个文件就分析完成 主要的作用就是删除回收站和临时目录下的.WNCRY文件

接下来对病毒释放的taskse做一个分析 主体逻辑如下

在主函数对命令行参数做了一个判断 如果小于2直接退出 由于我们已经在主程序中得知了这个程序启动的附加参数 所以直接载入OD 填入附加参数调试进程 接下来进入到主函数

这个函数首先获取了一些必要的API函数地址

然后提升当前权限

接着获取用户的访问令牌 并创建一个新的访问令牌

接着再次提升权限

函数结束 所以得出结论 这个taskse.exe是提权相关的程序

整个分析完成 接下来对病毒释放的文件做一个总结

最后附上样本和idb等相关文件

######

 
 
 
 
 
 
 
 
 
 
 
 
 
 

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2019-4-27 10:53 被鬼手56编辑 ,原因: 图片失效
上传的附件:
收藏
免费 14
支持
分享
打赏 + 17.00雪花
打赏次数 3 雪花 + 17.00
 
赞赏  mb_ovrzbwwl   +10.00 2019/08/03 有事找你,麻烦加下QQ7620971谈谈!!!
赞赏  Editor   +2.00 2019/02/21 精品文章~感谢分享!
赞赏  kanxue   +5.00 2019/02/19 精品文章~
最新回复 (31)
雪    币: 34
活跃值: (94)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这么长的分析表示头一次见到,楼主辛苦了,不知道有没有人能看完的。。。
2019-2-19 19:56
0
雪    币: 240
活跃值: (96)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
厉害了
2019-2-19 20:07
0
雪    币: 744
活跃值: (1404)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
4
三哥牛逼
2019-2-20 08:32
0
雪    币: 123
活跃值: (1675)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
2019-2-20 09:12
0
雪    币: 441
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我辈楷模
2019-2-20 09:20
0
雪    币: 4483
活跃值: (3015)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主大大,厉害了
2019-2-20 09:22
0
雪    币: 5150
活跃值: (9657)
能力值: ( LV9,RANK:181 )
在线值:
发帖
回帖
粉丝
8
分析很细,学习!
2019-2-20 09:23
0
雪    币: 1036
活跃值: (1311)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
9
这个画图软件用的是啥
2019-2-20 10:54
0
雪    币: 21732
活跃值: (5574)
能力值: ( LV12,RANK:460 )
在线值:
发帖
回帖
粉丝
10
StriveXjun 这个画图软件用的是啥
Xmind
2019-2-20 11:08
0
雪    币: 2141
活跃值: (7221)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
11
2019-2-20 15:55
0
雪    币: 237
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
很长,辛苦,分析得很好
2019-2-20 23:00
0
雪    币: 241
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
我是从头看到尾,虽然没看懂,程序下了一大堆^_^
2019-2-21 00:37
0
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学长你好厉害,嘿嘿
2019-2-21 12:19
0
雪    币: 8715
活跃值: (8619)
能力值: ( LV13,RANK:570 )
在线值:
发帖
回帖
粉丝
15
感谢分享,传授思路传授方法
2019-2-21 13:56
0
雪    币: 26588
活跃值: (63257)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
16
666 厉害!
2019-2-21 14:14
0
雪    币: 165
活跃值: (1481)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
有心了!
2019-2-21 14:16
0
雪    币: 44
活跃值: (385)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
下载来收藏,等以后能看得懂,谢谢分享。
2019-2-22 14:34
0
雪    币: 2282
活跃值: (426)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
19
分析得非常详细!点赞!
2019-2-22 16:10
1
雪    币: 1166
活跃值: (112)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
20
分析的很详细,写的很有条理,值得学习
2019-4-28 22:47
0
雪    币: 1663
活跃值: (2267)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
牛逼,有条有理
2019-5-3 01:05
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
楼主真厉害,受教了。
2019-5-4 09:52
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
辛苦了,楼主,这篇文章分析很细致,但是不是缺少网络传播那块功能
2019-5-14 11:32
0
雪    币: 3797
活跃值: (769)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
这篇文章可是真够详细的,感觉楼主花了大功夫来写的  
2019-5-15 08:09
0
雪    币: 21732
活跃值: (5574)
能力值: ( LV12,RANK:460 )
在线值:
发帖
回帖
粉丝
25
cainiaozx 辛苦了,楼主,这篇文章分析很细致,但是不是缺少网络传播那块功能
我分析的WannaCry样本并没有网络传播部分
2019-5-15 10:54
0
游客
登录 | 注册 方可回帖
返回
//