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

[原创]对WannaCry的深度分析

2019-2-19 16:40
16778

目录

 

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

样本概况

文件: C:\vir\wcry2.0\wcry2.0\wcry.exe
大小: 3514368 bytes
文件版本:6.1.7601.17514 (win7sp1_rtm.101119-1850)
修改时间: 2017年5月13日, 2:21:23
MD5: 84C82835A5D21BBCF75A61706D8AB549
SHA1: 5FF465AFAABCBF0150D1A3AB2C2E74F3A4426467
CRC32: 4022FCAA

查壳

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

 

 

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

基础分析

基础静态分析

查看字符串

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

 


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

 

 

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

 

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

使用PEiD识别加密算法

既然字符串中识别到了用于加密的标准库函数 那么在这里我使用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 企图向局域网扩散

 

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

使用IDA和OD进行详细分析

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

对wcry.exe病毒主程序的分析

主体逻辑

 

 

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

 

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

第一部分 初始化操作

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

 

GetRandom 获取随机数

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

 


 

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

SetReg 设置注册表项

 

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

 

 

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

ReleaseFiles 释放资源文件

 

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

 

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

 

 

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

WriteCwnry 写入c.wnry

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

 

 

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

ExeCmdCommand 执行命令行参数

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

 

 

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

 

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

 

至此 第一个部分分析完成

第二部分 加载病毒核心操作

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

 

GetApis 获取必要的API函数

GetApis的函数主体如下

 

 

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

CDatabase::CDatabase 构造函数

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

 

 

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

ImportKeyAndAllocMem 导入密钥并申请空间

接下来是ImportKeyAndAllocMem

 

 

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

DecryptFile 解密t.wnry

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

 

 

 

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

 

 

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

 

 

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

WriteAllocMem 拷贝PE文件到内存

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

 



 

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

GetExportFunAddr 获取导出函数地址

 

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

 

 

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

 

函数主体如下

 

 

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

 

 

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

 

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

 

第二部分小结

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

  1. 获取必要的API函数地址
  2. 导入私钥并申请空间
  3. 用导入的私钥解密出一个dll
  4. 申请一块堆空间 将dll写入到堆内存里
  5. 在堆内存中找到dll的导出函数地址 并调用

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

对t.wnry.dll(病毒核心部分)的分析

主体逻辑

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

 

 

GetUsersidAndCmp 获取当前用户的SID并与系统的SID作比较


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

最后于 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
雪    币: 798
活跃值: (1510)
能力值: ( 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
雪    币: 4719
活跃值: (3260)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主大大,厉害了
2019-2-20 09:22
0
雪    币: 5589
活跃值: (10354)
能力值: ( LV9,RANK:181 )
在线值:
发帖
回帖
粉丝
8
分析很细,学习!
2019-2-20 09:23
0
雪    币: 1044
活跃值: (1361)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
9
这个画图软件用的是啥
2019-2-20 10:54
0
雪    币: 22024
活跃值: (6034)
能力值: ( LV12,RANK:460 )
在线值:
发帖
回帖
粉丝
10
StriveXjun 这个画图软件用的是啥
Xmind
2019-2-20 11:08
0
雪    币: 2121
活跃值: (7439)
能力值: ( 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
雪    币: 35662
活跃值: (64596)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
16
666 厉害!
2019-2-21 14:14
0
雪    币: 165
活跃值: (1621)
能力值: ( 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
活跃值: (127)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
20
分析的很详细,写的很有条理,值得学习
2019-4-28 22:47
0
雪    币: 1760
活跃值: (2367)
能力值: ( 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
活跃值: (789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
这篇文章可是真够详细的,感觉楼主花了大功夫来写的  
2019-5-15 08:09
0
雪    币: 22024
活跃值: (6034)
能力值: ( LV12,RANK:460 )
在线值:
发帖
回帖
粉丝
25
cainiaozx 辛苦了,楼主,这篇文章分析很细致,但是不是缺少网络传播那块功能
我分析的WannaCry样本并没有网络传播部分
2019-5-15 10:54
0
游客
登录 | 注册 方可回帖
返回