逆向分析——使用 IDA 动态调试 WanaCrypt0r 中的 tasksche.exe
0x00 前言
2017 年 5 月 12 日全球爆发大规模蠕虫勒索软件 WanaCrypt0r 感染事件,各大厂商对该软件做了深入分析,但针对初学者的分析教程还比较少,复现过程需要解决的问题有很多,而且没有文章具体介绍勒索软件的实际运行流程,所以我写了这篇面向初学者的教程,希望帮助大家。
0x01 简介
本文将要介绍以下内容:
- 样本实际运行流程
- IDA 动态调试方法
- 具体调试 tasksche.exe 的过程
0x02 样本分析
测试环境: Win 7 x86
测试工具: IDA 6.8
样本下载地址:http://bbs.pediy.com/thread-217586-1.htm
经测试,该样本为 WanaCrypt0r 母体 mssecsvc.exe 释放出的敲诈者程序 tasksche.exe
因此不包含“Kill Switch”开关和 MS17-010 漏洞利用代码
样本流程分析:
通过逆向分析,样本流程如下图
注:样本流程图使用 processon 绘制,在线网址如下:https://www.processon.com/
0x03 实际测试
1、启动 IDA,加载样本文件 wcry.exe
找到 WinMain(x,x,x,x) 函数,在初始位置下断点(快捷键 F2),如下图
2、启动调试器
选择 Debugger(快捷键 F9)
选择 Local Win32 debugger,如下图
选择 Debugger-Continue process(快捷键 F9),进入调试界面,如下图
3、开始单步调试
单步步入快捷键 F7
单步步过快捷键 F8
执行到 call sub_401225,按 F7 单步步入,查看该函数的反汇编代码,如下图
为了便于分析,可以输入快捷键 F5 查看伪代码,如下图
通过代码猜测该函数的功能如下:
- 调用 GetComputerNameW 函数获得计算机名
- 使用 rand 函数生成一个随机数
- 二者结合生成一个唯一的 ID
动态执行至该函数结束,寄存器 EAX 的值保存函数返回结果,对应到上述函数,EAX 寄存器保存的是生成的 ID 值
EAX 的地址为 0040F8AC,查看该内存地址的内容为 vxdxwoohuuxv276,即生成的 ID 值为 vxdxwoohuuxv276
以上操作过程如下图
继续调试,执行到 jnz short loc_40208E,可看到程序出现分支,IDA 会自动提示接下来要执行的分支为左侧(该分支会闪烁),如下图
对照前文的样本流程图,可知此时并未进入安装模式
4、修改启动参数,进入安装模式
为了进入安装模式,需要在程序启动时加入参数/i
现在退出调试模式,选择 Debugger-Process options,填入参数/i,如下图
再次启动调试,执行到 jnz short loc_40208E,程序跳入右侧分支,进入安装模式,如下图
继续调试,执行到 call sub_401B5F
该函数的功能如下图
依次尝试在 c:\ProgramData、c:\Intel、%Temp%文件夹下创建以 ID 为名称的文件夹,直到成功为止
执行完该语句,查看路径 c:\ProgramData,发现新生成的文件夹 vxdxwoohuuxv276,如下图
继续调试,接下来的功能为将程序自身复制到上述目录,如下图
执行到 call sub_401F5D,该函数的功能如下:
创建服务,服务名称和显示名称均以 ID 命名,启动参数为 cmd.exe /c "C:\ProgramData\vxdxwoohuuxv276\tasksche.exe",对应子函数 sub_401CE8,如下图
创建互斥量 Global\MsWinZonesCacheCounterMutexA,用来避免程序重复启动,对应子函数 sub_401EFF,如下图
注:由于服务设置成自动执行,所以安装服务后会自动执行 C:\ProgramData\vxdxwoohuuxv276\tasksche.exe,不出意外,你的测试系统此时已经弹出勒索软件的主界面,如下图
至此,安装模式结束,如下图,接下来完成对左侧分支的调试
5、将启动参数取消,重新进入调试模式,进入左侧分支
如下图
执行到 call sub_4010FD,该函数的功能如下:
创建注册表项 HKEY_LOCAL_MACHINE\Software\WanaCrypt0r\wd
键值为程序绝对路径,如下图
执行到 call sub_401DAB,该函数释放资源中的 PE 文件,文件包含:
- b.wnry
- c.wnry
- r.wnry
- s.wnry
- t.wnry
- taskdl.exe
- taskse.exe
- u.wnry
- msg(目录)
如下图
执行到 call sub_401E9E,该函数功能如下:
加密 c.wnry 文件的第一行内容 13AM4VW2dhxYgXeQepoHkHSQuy6NgaEb94(软件作者的比特币地址)
继续调试,接下来执行 cmd 命令:
attrib.exe +h
用于将当前文件夹设置为隐藏属性,如下图
接着执行 cmd 命令:
icacls.exe . /grant Everyone:F /T /C /Q
用于为当前文件夹添加权限用户组 Everyone,主要用来开放访问权限,如下图
执行到 call sub_40170A,该函数用来动态获取 API 地址,主要为了实现接下来的内存加载 dll
执行到 call sub_4014A6,该函数用来解密 dll,可以在特殊位置下断点,从内存 dump 出该 dll 文件
通过分析代码,发现解密函数位于 sub_403A77,如下图
对应该函数,函数执行前,EAX 保存解密数据长度,函数执行后,EBX 保存解密 dll 文件的起始地址
完整过程如下图
函数执行前查看寄存器 EAX 的值,解密长度为 0x10000(截图未体现)
001790C8 保存解密 dll 文件的起始地址
将以上解密数据(数据范围 001790C8-001890C8)dump 并保存成 dll 文件,使用 ida 打开,识别为 dll 文件,导出函数为 TaskStart
注:我已将解密的 dll 文件提取并上传至 github,地址如下:https://github.com/3gstudent/WanaCrypt0r-Reverse-Analysis/blob/master/crypt.dll1
继续调试,执行到 call sub_402924,该函数用来内存加载 dll,传入导出函数 TaskStart
至此,tasksche.exe 任务完成,接下来的工作交由 dll 实现
0x04 小结
本文介绍了如何使用 IDA 对 WanaCrypt0r 中 tasksche.exe 进行动态调试,接下来会带来对解密 dll 的逆向分析过程,介绍 WanaCrypt0r 的加密流程。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论