本次分析主要涉及到病毒的勒索部分,主要包括如下几点:
压缩文件格式
因为这里的资源是以压缩包的形式存在,所以有必要先了解相关的格式,对之后的代码分析很有帮助
文件头
数据核心目录
数据目录结束标识
具体的可以查看文章:ZIP文件格式分析
虽然不能够了解全部,但是哪些很重要还是显而易见的!
函数sub_401810(释放资源)概览
此后程序会获取DLL中的导出函数: StartSchedule,这个函数就是核心的加密函数了。我们可以通过提取出出来的DLL使用IDA进行辅助分析。
这个函数会创建一个脚本文件1.xml,执行之后就删除,产生的结果就是创建了名为Microsoft Updata Scheduler一个计划任务,每隔一分钟就会执行一次主程序!
函数sub_100010B0创建WannaDecryptor快捷方式分析
通过分析此脚本是VBS脚本
调用过程sub_10004170 ->sub_100040A0
如果是硬盘继续加密
函数sub_10002270分析
遍历文件
什么样的文件会被加密?
执行加密策略
函数sub_10002990分析
通过分析在第一轮加密中所有的后缀是第二种类型此轮都不会加密,会放到第二轮进行加密!
函数sub_10002990分析
无论是第一轮还是第二轮其实调用的加密函数一样的!
函数sub_10002180核心加密函数分析
之后在返回3/4的时候才执行加密,所以我们只关注返回3/4即可
类型为1的:
大小小于400kb,返回1,不执行加密
大小大于200mb,返回3,执行大文件加密策略
介于两者中间的,返回4,执行小文件加密策略
类型为2的:
大小小于400kb,返回1,不执行加密
大小大于200mb,返回3,执行大文件加密策略
介于两者中间的,返回4,执行小文件加密策略
大文件和小文件的加密策略不同的就是,大文件只是将头部的0x1000个字节写入到尾部,同时将头部清零,再然后写入指定的值,并不像小文件加密那样去创建新文件还要使用AES进行加密!
这部分内容是我在看其他分析文章的时候发现他们的样本中资源释放之后都有这样一个程序taskdl.exe,用来删除指定目录下的后缀名为WNCRYT的文件,但是我的资源中并没有而是存在于我的样本中,所以我就顺便分析一下了。
查壳
VC6.0编写,未加壳
使用LoadPE查看导入表,根据导入函数猜测功能
猜测可能和文件操作有关,因为导入函数中涉及到文件的删除和文件遍历等API。
具体分析
关于上述分析中的疑问
sub_401080函数分析
第一部分:获取系统盘temp文件夹路径,非系统盘获取RECYCLE文件夹路径,同时查找后缀名为.WNCRYT的文件
第二部分:遍历查找所有后缀名为.WNCRYT的文件
第三部分:通过遍历容器,删除文件,抹除对象元素,之后对容器申请的堆空间进行释放,此函数最终返回的是成功删除的文件个数!
补充部分:获取temp文件路径和RECYCLE文件路径函数逆向
加密总结(偷个懒使用参考文章内容,分析一致)
“
原始RSA私钥:用于解密受害者机器上的随机RSA私钥;
原始RSA公钥:用于加密受害者机器上的随机RSA私钥;
随机RSA私钥:用于解密AES密钥;
随机RSA公钥:用于加密AES密钥;
AES密钥:用于解密受害者机器上的数据。
”
文件总结:
taskdl.exe,删除临时目录下的所有“.WNCRYT”扩展名的临时文件。
u.wnry,解密程序,释放后名为@WanaDecryptor@.exe
b.wnry勒索图片资源。
t.wnry,解密后得到加密文件主要逻辑代码。
*r.wnry,勒索Q&A。
其他的文件我不太清除了,但是火绒实验室的分析给出了结果可以参考!
https://bbs.pediy.com/thread-217644.htm
https://bbs.pediy.com/thread-217662.htm
https://bbs.pediy.com/thread-249520.htm
<?xml version="1.0" encoding="UTF-16"?><Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"><RegistrationInfo>
<Author>Microsoft Windows</Author>
<Description>This task keeps your Windows up to date with the latest enhancements and security fixes</Description></RegistrationInfo>
<Triggers><TimeTrigger>
<Repetition><Interval>PT1M</Interval><StopAtDurationEnd>false</StopAtDurationEnd></Repetition>
<StartBoundary>2001-01-01T00:00:00</StartBoundary>
<Enabled>true</Enabled>
</TimeTrigger></Triggers>
<Principals><Principal id="Author"><UserId>WIN-0LRR8CGQ4H6\15pb-win7</UserId><LogonType>InteractiveToken</LogonType><RunLevel>LeastPrivilege</RunLevel></Principal></Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>false</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>true</WakeToRun>
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec><Command>
"C:\Users\15pb-win7\Desktop\ÓÀºãÖ®À¶WannaCryÑù±¾[ÃÜÂ룺15pb]\ÓÀºãÖ®À¶WannaCryÑù±¾[ÃÜÂ룺15pb]\Ä£¿é¶þ\8dd63adb68ef053e044a5a2f46e0d2cd.exe"
</Command><Arguments>/r 0</Arguments></Exec>
</Actions></Task>
第一种类型
".doc"".docx"".xls"".xlsx"".ppt"".pptx"".pst"".ost"".msg"".eml"
".vsd"".vsdx"".123"".wks"".wk1"".txt"".csv"".rtf"".pdf"".dwg"
".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"".vdi"".vmdk"".vmx"".gpg"
".aes"".ARC"".PAQ"".tar.bz2"".tbk"".bak"".tar"".tgz"".gz"".7z"".rar"
".zip"".backup"".bmp"".png"".gif"".raw"".cgm"".tif"".tiff"".nef"
".psd"".ai"".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"".js"".h"".pas"".cpp"".c"".cs"
".suo"".sln"".ldf"".mdf"".ibd"".myi"".myd"".frm"".odb"".dbf"".db"
".mdb"".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"
WCHAR RootPathName[2] = {0X20,0X00,0X3A,0X00};//其ASCII是(空格+“:”)
经查阅MSDN后了解函数GetDriveTypeA其参数根路径必须加上反斜杠,但是经过实际测试之后
即使不加反斜杠也是没有问题的!
char szPath[3] = { 0x43,0x3A,0x00 };
int type = GetDriveTypeA(szPath);
上述测试代码用来获取我电脑C盘的类型,得到的结果是正确的,所以不加就像病毒代码中的一样部件反斜杠来获取盘符类型也是没有问题的。
- 函数sub_401210(解密文件)概览
这里最终要的两个函数就是sub_4027D0(获取index)和函数sub_403A40(解密为PE文件),但是这两个函数都是数据操作,所以我在分析的时候使用的是OD的动态调试,最终的分析结果如下!
绿色部分就是函数sub_4027D0所执行的过程,红色部分就是函数sub_403A40执行过程
附上sub_403A40函数的简单分析
0x10字节的明文经过对核心加密文件的分析得出应该是AES密钥!
- 函数sub_401D40(PE文件展开)分析
这部分我也是通过OD进行调试的,但是UDD文件在回复虚拟机的时候被我搞丢了,所以这一部分就只能凭空说一下了,IDA的反编译我真的不想再看一眼!
解密之后的DLL文件我已经提取出来了,之后会放在附件中。
PE文件展开:通过镜像大小申请指定加载基址(默认加载基址0x10000000)的内存大小,之后根据区段表中各个区段的RVA进行贴到对应的位置。
修复IAT:遍历DLL的导入表获取函数的名称,再找到函数所在的DLL,遍历所在DLL的导出表,匹配函数名(序号)从而获取函数所在地址,最后填充到IAT表中
修改区段的属性:在区段表中最后一个字段描述了区段的属性,可以通过修改此值达到修改区段属性
调用TLS回调函数:由于此函数没有TLS回调就不会调用
其实此处还调用了重定位的修复,但是dll是按照0x10000000默认加载基址进行加载的所以程序将重定位部分的内存空间进行了释放!
说明
基础分析
基础静态
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)