文件: 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中看到字符串中含有RSA和AES 应该是和病毒加密方式相关 但具体的还需要再进一步确认
紧接着看到了这么一串字符串 关于cmd命令 大概是在引用某些参数
字符串的部分就只有这么多信息
既然字符串中识别到了用于加密的标准库函数 那么在这里我使用PEID的Kyrpto ANALyzer插件扫描病毒程序 来识别加密算法 扫描结果如图所示
由上图可知 病毒使用了CRC32和AES加密算法 其中CryptDecrypt
和CryptDecrypt
是微软提供的用于一个用于加密的类库 而ZIP2和ZLIB是压缩算法
在Kernel32
的导入函数里发现了 LoadResource
LockResourse
FindResourceA
等函数 说明资源段里可能会大有文章 此处需要留意
接着 在ADVAPI32.dll
里发现了注册表相关的操作 说明病毒对注册表进行了操作
接着查看病毒的资源段
最重要的就是这个资源名为XIA的自定义资源了 由于资源头是PK 所以猜测这应该是个ZIP压缩文件 接下来直接将资源提取
可以看到 上图就是提取出来的资源 这个就是病毒释放到桌面的一些文件了 但是具体是什么 需要进一步分析
首先使用ProcessMonitor
查看一下进程树
由上图可以得知 病毒创建了四个子进程 其中还使用了cmd.exe
执行一个批处理脚本文件
关于注册表 这里我使用regshot对运行病毒前后做一个快照进行比对 直接查看结果
关于注册表的修改操作并不多 在HKLM\SOFTWARE新增加了一个键 并且把当前病毒的路径添加上去 并且还添加了另外两个值
接下来是文件的监控
图一: 病毒在系统的每一个目录下释放了@[email protected]
@[email protected]
的文件 这里应该是在感染文件了
图二:在桌面目录下创建了一个.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是加密后的私钥 我已经将未加密是私钥提取出来 如下
0018E584 07 02 00 00 00 A4 00 00 52 53 41 32 00 08 00 00 ...?.RSA2...
0018E594 01 00 01 00 73 F6 BE B8 C8 55 17 87 6A F8 0D 55 ..s鼍溉U噅?U
0018E5A4 CF FD 1A F8 1B 4B F4 17 FC 14 F4 D4 EE 25 DD C0 淆?K??粼?堇
0018E5B4 CD 0F A3 BB 63 32 AE 1D E3 47 34 2B CB D8 C5 FD ?;c2?鉍4+素琵
0018E5C4 90 69 2F C1 F3 0B BD 91 CB E1 96 26 03 52 E3 9C 恑/馏綉酸?R銣
0018E5D4 D2 F0 89 1A 36 66 87 FC 75 09 63 05 75 44 37 AF 茵?6f圏u.cuD7?
0018E5E4 E0 44 85 87 10 CF 0A 5B 89 4C 91 45 90 69 7F F8 郉厙?[塋慐恑?
0018E5F4 31 58 35 31 2B 0C 8B D8 C6 85 16 C2 8D C4 C1 EF 1X51+.嬝茀聧牧?
0018E604 EF 10 10 1D ED AA 53 E6 79 65 83 2D 36 4B C8 68 ?愍S鎦e?6K萮
0018E614 DD AD 99 02 2D 18 87 BE CB 08 F9 23 A4 27 6E DA 莪?-嚲???n?
0018E624 BA C1 E9 14 55 FF 61 E8 41 54 08 07 AD F5 8F C8 毫?Ua鐰T徣
0018E634 FB 83 5D 87 5D 09 67 71 B2 9F 7B A5 C3 5C 23 2F 麅]嘳.gq矡{ッ\#/
0018E644 1A E0 8C 6C 26 B1 99 39 6E 68 9F 20 1D FF DE 5C 鄬l&睓9nh?轡
0018E654 05 79 A5 72 72 32 4C CE BF 90 F5 F8 00 E4 8C E3 yr2L慰愼?鋵?
0018E664 F2 AE 33 FB 03 A4 DA 1C 5C EC D3 3E C7 12 FE B3 虍3?ぺ\煊>?
0018E674 6E A6 2A 9A 5C 00 00 00 00 00 00 00 00 00 00 00 n?歕...........
接下来的 五个线程回调函数就是整个程序的重点了
这个函数在工作路径创建了00000000.res这个文件 并且往里写入数据
写入的内容如下 其中有0x8个字节的随机数 还有0x4个字节的当前时间
这个函数的作用是每个五秒检测工作路径下是否存在774F34B5.dky这个文件 文件名应该是个随机数 不是固定的 如果存在的话会执行sub_10003D10这个函数 由于我的桌面上一直都没有存在 所以这个函数我也就没有去分析
这个函数是整个病毒程序最核心的函数 代码量最多 里里外外总共嵌套了十几层函数 我感觉比整个熊猫烧香的代码还要多 下面是这个函数的第一层
循环检测是否有新的磁盘加入 如果有 则加密 没有就一直循环
接下来进入到核心函数第二层
第二层有三个比较重要的函数 每个都有各自的作用 我们重点解析第二个加密函数
这个函数单独创建了一个线程 将一部分文本文件移动到临时目录下 并进行重命名
下面是这个函数循环结束后我的临时文件夹下的文件 这些文件并没有加密 是可以直接通过修改后缀名恢复
这个函数就比较有意思了 它会在在$RECYCLE下创建一个名为hibsys.WNCRYT的文件 并设置属性为隐藏 然后循环往这个文件写入数据 直到磁盘空间不足跳出循环
当这个函数结束的时候 这个文件居然有39个G
这个函数对磁盘和路径做了一个判断 然后又调用了另外一个函数 我们需要再次进入到这个函数
进到第三层之后又有一个函数 这个函数会遍历并且加密所有的文件 而且是递归调用的 然后我们再次进入这个函数
这个函数首先遍历所有的文件 对文件夹和文件执行不同的操作 并且对后缀名进行过滤
首先跳过 @[email protected],@[email protected], @[email protected]
具体类型如下
0 没有后缀以及其他类型后缀
1 .exe, .dll
4 .WNCRYT
5 .WNCYR
6 .WNCRY
“.doc”".docx”".xls”".xlsx”".ppt”".pptx”".pst”".ost”".msg”".eml”".vsd”".vsdx”
“.txt”".csv”".rtf”".123″”.wks”".wk1″”.pdf”".dwg”".onetoc2″”.snt”".jpeg”".jpg”
“.docb”".docm”".dot”".dotm”".dotx”".xlsm”".xlsb”".xlw”".xlt”".xlm”".xlc”".xltx”".xltm”".pptm”".pot”".pps”".ppsm”".ppsx”".ppam”".potx”".potm”
“.edb”".hwp”".602″”.sxi”".sti”".sldx”".sldm”".sldm”".vdi”".vmdk”".vmx”".gpg”".aes”".ARC”".PAQ”".bz2″”.tbk”".bak”".tar”".tgz”".gz”".7z”".rar”
“.zip”".backup”".iso”".vcd”".bmp”".png”".gif”".raw”".cgm”".tif”".tiff”".nef”".psd”".ai”".svg”".djvu”".m4u”".m3u”".mid”".wma”".flv”".3g2″”.mkv”
“.3gp”".mp4″”.mov”".avi”".asf”".mpeg”".vob”".mpg”".wmv”".fla”".swf”".wav”".mp3″”.sh”".class”".jar”".java”".rb”".asp”".php”".jsp”".brd”".sch”
“.dch”".dip”".pl”".vb”".vbs”".ps1″”.bat”".cmd”".js”".asm”".h”".pas”".cpp”".c”".cs”".suo”".sln”".ldf”".mdf”".ibd”".myi”".myd”".frm”".odb”".dbf”
“.db”".mdb”".accdb”".sql”".sqlitedb”".sqlite3″”.asc”".lay6″”.lay”".mml”".sxm”".otg”".odg”".uop”".std”".sxd”".otp”".odp”".wb2″”.slk”".dif”".stc”
“.sxc”".ots”".ods”".3dm”".max”".3ds”".uot”".stw”".sxw”".ott”".odt”".pem”".p12″”.csr”".crt”".key”".pfx”".der”
总结为下面的枚举
enum FILE_TYPE
{
FILE_TYPE_NULL = 0,
FILE_TYPE_EXEDLL,
FILE_TYPE_DOC,
FILE_TYPE_DOCEX,
FILE_TYPE_WNCRYT, //.wncryt
FILE_TYPE_WNCYR, //.wncyr
FILE_TYPE_WNCRY //.wncry
}
这个函数首先会调用sub_10002E70这个函数 根据这个函数返回值的不同 执行不同的加密策略 对加密策略做一个总结
虽然操作不同 但是加密函数是同一个 接下来再次进入EncryptFiles
这个加密函数首先做了一些准备工作 获取文件的后缀名 然后跟.WNCRY做判断 如果比较成功 则不加密 接着做了一个字符串拼接 然后才开始加密文件 那么我们还要再往里跟一层
接下来是这个程序的核心的加密算法了 他加密的步骤如下
至此 病毒的加密函数就分析完成
这个函数每隔三秒以隐藏的方式启动taskdl.exe 那么接下来还需要对taskdl.exe进行分析
这个函数每隔三秒会启动工作路径的taskse.exe和@[email protected]并且使用cmd设置注册表启动项
这个函数以命令行的方式启动taskse.exe 参数为为C:\Users\GuiShou\Desktop@[email protected] 这个参数需要暂时记住 待会分析taskse.exe的时候需要用到
并且以命令行的方式显式启动@[email protected] 这个是病毒的解密器
函数将获取到的随机的字母+数字设置到注册表启动项 但是在我的机器上是设置失败的 因为命令敲错了 正确的命令应该是这个
这个是整个病毒程序最后一个函数了
这个函数有三个函数比较重要
这个函数会检测@[email protected]是否存在 如果不存在 就创建一个批处理脚本 并且将命令写入到.bat脚本 这个脚本的作用仅仅的给@[email protected]创建一个快捷方式
这个函数首先检测工作路径下的@[email protected]是否存在 如果不存在 就从r.wrny中读取内容 并写入到@[email protected] 这个是病毒的勒索文档
这个函数的作用是获取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文件可以到我的Github上下载
https://github.com/TonyChen56/Virus-Analysis