Wanacry加解密过程深入分析

Author: purpleroc@0xFA
Emal: admin@0xfa.club
Url:http://www.purpleroc.com

  昨天分析、调试了一把,没来得及整理文章,现在来好好理理思路吧。话说,这次敲诈者的作者也是费了心思,毕竟是要对抗全球安全人员的分析,所以大多数能想到的地方,也都考虑到了。废话也不多说了,抛开感染、触发条件等等情况,就单纯来看看它具体是怎么完成加解密的吧。
  对其进行描述并总结如下:

1、文件加密:

a. 文件是使用AES进行加密的。
b. 加密文件所使用的AES密钥(AESKEY)是随机生成的,即每个文件所使用的密钥都是不同的。
c. AESKEY通过RSA加密后,保存在加密后文件的文件头中。
d. 敲诈者会根据文件类型、大小、路径等来判断文件对用户的重要性,进而选择对重要文件的先行进行加密并擦写原文件,对认为不太重要的文件,仅作删除处理。

2、文件删除及擦写逻辑:

a. 对于桌面文档所有人\桌面所有人\文档四个文件夹下小于200M的文件,均进行加密后擦写原文件。
b. 对于其他目录下小于200M的文件,不会进行擦写,而是直接删除,或者移动到back目录(见后文分析)中。
c. 移动到back后,的文件命名为%d.WNCRYT,程序taskdl.ext会对back目录下的这些文件定时删除。
d. 对于大于200M的文件,只将文件头部64KB移动到尾部,并生成加密文件头,保存为WNCRYT,后复制WNCRYT头部,并建立与WNCRYT大小一致的文件WNCRY,往其中填充随机数。不对原文件做擦写等操作。

3、文件擦写方案:

a. 先重写尾部1k。
b. 判断大小后重写尾部4k。
c. 从文件头开始每256k填充一次。
d. 填写的内容为随机数或0x55

4、密钥关系:

  总结密钥及加密关系大致如下:
Alt text
a. 程序加密过程中,动态加载的dll里含有两个公钥(KEYBLOB格式),这里分别记为PK1PK2。其中PK2用于加密部分文件的AESKEY,该部分加密文件可本地直接解密,使用PK2加密过AESKEY的文件的路径存放在f.wnry中。而PK1用于加密DK3(见后文介绍)。
Alt text
b. 解密程序u.wnry(即界面程序@WanaDecryptor@.exe)中包含有一个私钥(KEYBLOB格式),该私钥与PK2配对,记为DK2。该DK2用于解密f.wnry中记录的文件。
Alt text
c. 程序在每次运行时,会随机生成一组公私钥,用于。记为PK3DK3。其中PK3保存在本地,主要用于加密各文件加密时随机生成的AESKEY。而DK3则由PK1加密后保存在本地,文件名为00000000.eky

5、解密过程:

a. f.wnry中记录的文件,主要使用DK2完成解密。
b. 其余文件若需要解密,则需点击check payment后,通过Tor将本地00000000.eky00000000.res文件信息上传到服务端,由服务端使用作者自己保存的DK1解密后,下发得到DK3,本地保存为00000000.dky
c. 得到DK3后,即可完成对磁盘中其余文件的解密。

  后文,贴上一些调试截图和IDA截图。

分析及调试验证

  将tasksche.exe拖到ida里可以发现,其加解密用到的是系统自带API,通过GetProcAddress来获取地址动态调用的。

Alt text
  于是,就可以以此为突破口来进行分析。

一、密钥分发过程

1、导入密钥DK2,存放于00154830

Alt text

2、解密t.wnry

Alt text
解密得到的t.wnry实则为一个DLL文件,该文件负责文件加密操作。

3、DLL线程导入PK1,存放于0016BE18

Alt text

4、生成PK3DK3

Alt text

5、导出PK3

Alt text
导出后,会调用writefile在本地生成00000000.pky

Alt text

6、使用PK1加密DK3

Alt text
由上图可以匹配PK3DK3。加密后,会调用writefile在本地生成00000000.eky
  至此,验证了密钥生成关系。

二、文件加密

1、导入PK3,放到0016D950

Alt text

2、导入PK2,放到0016E510

Alt text

3、生成AESKEY,并使用PK3加密

生成随机AESKEY

Alt text
使用PK3加密:

Alt text

4、使用PK2加密

Alt text
使用PK2加密后的文件,会写入f.wnry中:

Alt text
  选择使用PK2还是PK3,是随机的:

Alt text

三、文件删除和擦写条件

  调试时发现,敲诈者会对一些特定的文件再加密后对原文件进行擦写(填充随机数,为了防止数据回复)。操作首先找到擦写文件的逻辑,可以知道要擦写文件,有两个必要条件:

1、传入的this+902back目录必须不为空。
Alt text
2、传入给上层函数的参数a4,需要等于4。
Alt text
往上层函数追溯,发现,该参数来自于函数10002940
分别有3和4,两个参数:
Alt text

  而再往上层,该参数取决于函数10002E70
  通过分析,得知该函数逻辑如下,会对文件列表做四部处理:

第一步:对文件类型为类型一(见后文)进行处理,做大小判断,大于200M返回3,小于1k返回1,其余大小则返回4。类型二的文件,均返回1。
第二步:对剩余文件中,所有类型一的文件均返回1。而对其他类型文件,做大小判断,大于200M的文件返回3,大于1k小于200M的文件返回4,小于1k的文件返回1。
第三步:对剩余文件,返回4。
第四步:对wncryt文件,返回2,wncyrexedll文件,返回1。

  至于为什么要这么做,可能是考虑擦写效率问题,为了尽可能多的加密、擦写文件,耗时的文件、小于1k不重要的文件最后处理。其中,返回为1的,不做处理;返回为2的,做删除处理;返回为3的:做文件头转移处理;返回为4的,做完整文件加密处理
  其中判断文件类型的代码在:

Alt text
类型一

doc、docx、xls、xlsx、ppt、pptx、pst、msg、、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、max3ds、uot、stw、sxw、ott、odt、pem、p12、csr、crt、key、pfx、der

  如此,第二个条件已理清楚,剩下第一个,在分析时发现:程序运行后,首先对桌面文档所有人\桌面所有人\文档四个文件夹进行处理。

Alt text
  而对这几个文件夹处理的时候,back目录为空。对其他目录进行处理的时候,会进行判定:

Alt text
即:

1、处理C盘其他目录时,back目录为%temp%
2、处理其他盘符时,back目录为各盘符下的回收站目录,若回收站不存在,则创建

  由此,可以得到整体逻辑如下:

1、对于桌面文档所有人\桌面所有人\文档四个文件夹下的文件,文件类型为类型一类型二的文件,大小小于200M的,均进行加密后擦写原文件,大于200M的文件不做加密也不做擦写操作,仅作转移文件头处理。
2、对于其他目录下文件:由于back目录不为空,不会对原文件进行擦写,而是直接删除,或者移动到back目录中。移动到back后,的文件命名为%d.WNCRYT,程序taskdl.ext会对back目录下的这些文件定时删除。同样,大于200M的文件不做加密也不做擦写操作,仅作转移文件头处理,而后保存为WNCRYT,复制WNCRYT头部,并建立与WNCRYT大小一致的文件WNCRY,往其中填充随机数。

四、文件擦写方式

  擦写方式主要是对加密后的原文件进行重写。根据代码可知,其主要填充数据有两种:随机数、0x55

Alt text
  而擦写过程为:

1、先重写尾部1k
2、判断大小后重写尾部4k
3、从文件头开始每256k填充一次

五、解密通信

  敲诈者会在Tor目录下释放并拉起taskhsvc.exe,该工具启动后会监听本地9050端口,木马通过本地代理连接实现与Tor服务器的通信。

Alt text
  在点击“Check Payment”按钮后,上传本地reseky文件。

Alt text
  若私钥下发,则会在本地生成解密所需要的dky文件。

Alt text
  有精力可以再分析一下和Tor通信的协议,说不定,能有些啥出来呢~

Alt text

Alt text

六、RES文件解析

  解密同时需要res文件和eky,就来分析一下res文件格式。通过分析,可得其格式大致如下:

Alt text
  红色框为八字节随机生成,应该是用于唯一性判定;蓝色框中为敲诈者首次运行时间,即首个文件加密时间;橘色框中为最后一个文件加密时间;紫色框中为加密文件总数;褐色框中记录的是加密文件总大小。
  有这些信息后,作者应该可以初步对非正常用户进行排除。当然,具体如何判定,还不得而知。

总结

  至此,整体逻辑基本清晰。
  在擦写逻辑这块分析时间太长,还好也算理清楚了才敢发文。
  要指出的是:所有打着旗号能“解密”的工具都是噱头。
  而为什么有些工具的确能恢复部分数据呢?主要是因为,除开桌面和我的文档等保存的文件会被擦写外,其余的文件均制作删除操作。由于没有复写,所以使用常见的数据恢复工具如:winhex、diskgen等都能轻易对其进行恢复。
  至于某个公司说,他们破解了,但只能提供部分数据的恢复,这应该是个噱头,他们的工具也只是数据恢复工具。
  至于某个公司说,擦写了部分,他们能解密。实际是全部擦写了,至于还能不能恢复?你猜。
  至于某个公司说,可以使用卷影文件,对这个不了解,希望有用吧。

——Tracy_梓朋
2017年5月16日19:24:14