wannacry逆向分析初探(二)
本帖最后由 hercs 于 2018-8-7 16:44 编辑这次我们来看看解密要内存加载的dll的过程,这个解密过程和后面的文件加密采用的都是RSA+AES的方法,RSA加密AES的秘钥,嵌在文件头部,AES秘钥随机生成。
一、解密大致流程
KeyStruct是一个包含了解密需要的一些资源和信息的结构体,在解密开始前会初始化他,如图。
目前发现该结构体有这些成员,分别命名如上图,并在IDA离新建该结构体。
结构体初始化后就是加密函数的初始化,其实也是用的Window自带的加密函数。打开InitEncryptFunc函数如下
里面会调用GetAndTransferRSAKey函数获取RSA的Key,利用该Key通过RSA算法加密密就可以的到后面AES算法的Key了。
GetAndTransferRSAKey会分别依次调用Windows自带的CryptAcquireContextA和CryptImportKey,这两个函数的地址都是通过之前的GetRequiredSysApi保存在全局变量里的,在这里直接调用即可。
到这里初始化就结束了,接下来就是通过DecryptDll解密了,第一步当然还是要先通过RSA解密出AES的秘钥,其中未解密的AESKey是从t.wnry文件中获取的,t.wnry头部结构为WANACRY!标识(8字节),秘钥大小(4字节),秘钥(256字节),加密类型(4字节),原始文件长度(8字节)。
获取到AESkey后,利用前面获得的系统解密函数还有RSAkey来解密出AESkey.
后面会调用AesExpandKey来对AESkey进行扩展,然后在用该key解密dll。关于具体的扩展和加密细节,下次再说,我们这次在探索一下dll里面的加密大致流程。
一、Dll加密大致流程
dll中TaskStart先会执行是否运行在系统权限下,单例检查,Key检查等操作,然后会开一个线程检查是否运行在系统权限并提权,然后在注册表写入自启动。
系统权限提升通过taskse.exe
随后会检查秘钥是否已生成,若没有则初始化,分别保存在00000000.pky,00000000.eky
通过CryptGenRandom产生8字节随机值写入00000000.res。
随后会开启5个线程,执行一些任务,这个以后在分析,现在直接看后面的EncyptFile_100057C0()函数
首先会执行CreateShortCut函数,该函数如下
首先会复制u.wnry到@WanaDecryptor@.exe,然后在创建一个@WanaDecryptor@.exe.lnk的快捷方式,创建的BAT如下
然后会调用Create_Please_Read_Me__txt_10004DF0创建勒索文本文件
勒索文本如下
然后执行ExcuteEncryption,该函数最终会调用EncrptAllFilesInThisFolder,该函数会跳过以下目录和下面三个文件
然后CheckIfThisFileShouldBeEncrypted,该函数检查文件名后缀,符合以下类型则应当加密,将该文件加入一个加密链表的结构体中,OD截图如下
然后会执行EncryptFileInDifferentCases,该函数根据四种不同情况来进行处理,case1直接返回,case2是直接删除,case3加密文件,加一个后缀WNCYR,移除链表,case4加密链表中剩余的文件。
case3,4都会执行EnCryptFile函数,不管3,4最后都会执行到LABEL_8,然后执行加密函数EncryptFile_10001960,如下
EncryptFile_10001960中间加密策略如下图,如果caseNum=3,则
如果caseNum=4,则进行随机值检查,根据结果选择不同加密算法,然后写入加密文件头部数据
file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\455482753\QQ\WinTemp\RichOle\Q_WXLVC~YGYNA{NM`PJIFPI.png
如果是遇到的case3生成的WNCRY文件,则将尾部10000读取到头部,然后每次对后面的data中的100000字节进行加密。
高手哦。感谢楼主分享 谢谢分享。。。。。。。。 明人不说暗话:我看不懂
高手哦。感谢楼主分享 emmmmmThanks
高手哦。感谢楼主分享 也就是说其实私钥还是留在本地的? 感谢楼主分享分析逆向流程. 学习了 谢谢分享
页:
[1]
2