最近准备面试病毒分析岗,听大佬们说有的面试官会问是否分析过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加密算法 其中CryptDecrypt
和CryptDecrypt
是微软提供的用于一个用于加密的类库 而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和调用返回地址的汇编代码 如下

第二部分小结
第二部分分析完成 接下来做一个小结 总体行为如下
- 获取必要的API函数地址
- 导入私钥并申请空间
- 用导入的私钥解密出一个dll
- 申请一块堆空间 将dll写入到堆内存里
- 在堆内存中找到dll的导出函数地址 并调用
从上面的分析可以得出病毒的主体程序实际上只做了一些初始化的操作 到目前为止并没有看到它感染或加密任何一个文件 也没有对用户进行勒索 真正的核心代码在t.wnry中 由于这个函数是在堆空间中调用 所以在IDA中并没有显示出伪C代码 那么接下来需要分析刚刚提取出来的dll
对t.wnry.dll(病毒核心部分)的分析
主体逻辑
主体逻辑如下 下面就是病毒的所有操作了 包括加密文件 勒索用户等所有操作


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

[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!
最后于 2019-4-27 10:53
被鬼手56编辑
,原因: 图片失效