前几天有朋友中了一个勒索病毒,于是花时间研究了一下,如果你也不幸中了这个病毒,可以尝试自己来破解,不用花钱解决,现在把我的分析过程分享给大家。
背景
这个勒索病毒分为两部分,加载器部分是由C++编写的,核心勒索模块则是由C#编写的。
病毒运行后会将系统超过400种后缀文件加密并删除原始文件(附加.locked后缀),并且向勒索攻击者邮箱发送勒索成功信息。在桌面上留下支*宝(对,没看错)付款码图片,让你打钱解决,2000块人民币!
以及一段繁体中文文字告知勒索信息。
逆向分析
".NET"初始化及解密勒索模块
首先调用OleInitialize()函数初始化COM(Component Object Model,组件对象模型)系统。
异或解密字符“Cor_Enable_Profiling”。
获取环境变量“Cor_Enable_Profiling”状态,如果禁用则继续执行代码。
此变量与Microsoft .NET Framework 应用程序能否正常执行相关。当设置为非零值时启用(0x01);否则被禁用(0x00)。该环境变量的判断实际上是比较敏感的,许多后门权限持久化操作都会查看或修改此环境变量,配合其他一些敏感操作就符合杀软检索特征,被干掉。
程序继续执行,创建当前进程快照,后续可以调用其他API函数来遍历快照中的进程信息。常见的操作包括枚举进程、枚举线程、获取进程模块列表等等。
遍历当前进程的全部模块信息,检查是否存在指定的模块(我不清楚这一步的目的,但是mscorjit.dll、clrjit.dll,都是.net程序关联的dll库),如果存在则关闭句柄并返回0,如果不存在程序继续执行,跳转至LABEL_10。
未检索到相应模块跳转至LABEL_10,关闭进程快照,解密字符“__”,调用FindResourceA()在当前内存模块中寻找勒索模块的密文载荷,然后做寻址加载、长度计算等。
动态调试查看定位内存信息,即部分密文shellcode。
对密文shellcode连续异或等解密操作。
完全解密获得一个完整的PE格式内存模块。
导出内存保存为文件查看基本信息,可以看到有加壳,开源工具”de4dot“即可解壳。
后续使用偏移寻址方式调用.net模块中的勒索功能,接下来就分析勒索模块。
勒索模块
接下来就单独看勒索模块,这是由C#.NET编写的,这个模块结构如下图所示:
前期准备工作
准备功能函数贴心的取名叫StartAction()。首先尝试杀掉一些安全软件的进程来尽可能的清理其运行环境。然后生成加密用户文件所需密钥的相关随机数,并使用事先内置在代码内的RSA公钥将声称的随机数加密后保存到本地。
-
尽可能的尝试杀掉360安全软件的关联进程。
-
生成后续加密用户文件使用的随机数(string_5),获取硬盘序列号(string_6),使用“255个随机字符+Lock+机器硬盘序列号”的格生成一个字符串。并利用软件内置的公钥(bytes)加密和编码这个字符串。
base64解码获取RSA公钥
xGYXpP2Yu33M5C8Rpn/+IPGF5Jkkjh5E4CyT7iBsYiOehTZ1+KlXnEtESwAvuPX3koGG+uWCOb/yb/CttkQWTYmBco1q3vkELyaHN/sZwOT866vA9IQHSmo3aQjf/6lTzmMXEAue4RKdXKqGKWoP5V9zL1gMZYp3yGmH7jxXSHc=
-
将加密结果经过UTF-8编码,在base64编码,最终存储在“c:\temp\libadvpack.dll”中。虽然命名为DLL,实际上它是一个文本文件。
加密文件选择
选中和拼接一些路径作为指定加密路径,所有被加密的文件均会被添加._locked扩展名。该勒索软件会对以下扩展名的文件进行加密(共469种)。
加密文件路径
C:\\Users\\\\Desktop\\
C:\\Users\\\\Downloads\\
C:\\Users\\\\Documents\\
C:\\Users\\\\Pictures\\
加密指定后缀文件:
.txt ;.doc ;.docx ;.rm ;.rrd ;.forge ;.sldasm ;.jpg ;.zpr ;.mp3 ;.qfx ;.ztmp ;.ace ;.mpp ;.raw ;.brd ;.dsn ;.pptx ;.rofl ;.plc ;.mdb ;.idf ;.xls ;.step ;.jpeg ;.3dm ;.ttxt ;.dgn ;.ad ;.bqy ;.fd ;.u8 ;.nc ;.kdb33 ;.qkg ;.kf5 ;.kdbx ;.kdb ;.ufd ;.kdy ;.emrg2 ;.edat2 ;.ebs2 ;.es2 ;.edat3 ;.ebs3 ;.es3 ;.tdms ;.lvm ;.spm ;.pug ;.xdr ;.inp ;.bw ;.aln ;.pre ;.prproj ;.d ;.chm ;.cdxml ;.cdx ;
.cds ;.sps ;.sav ;.tps ;.lgr ;.ltf ;.ldt ;.lng ;.lg4 ;.mw ;.sage ;.lab ;.edu ;.zda ;.zar ;.zmx ;.dxf ;.fn ;.bmk ;.bf3 ;.bf2 ;.bf1 ;.bd3 ;.bd2 ;.bd1 ;.cnc ;.nc ;.emf ;.mcb ;.gts ;.mgb ;.gen ;.xsr ;.t ;.pm ;.snn ;.out ;.rmg ;.rth ;.rst ;.esav ;.emat ;.db ;.hm ;.gra ;.res ;.req ;.cgr ;.ipt ;.igs ;.stp ;.crm ;.mat ;.xlxs ;.tgz ;.pcbdoc ;.min ;.cam ;.net ;.neu ;.asc ;.ms7 ;.ms8 ;.ms9 ;
.ms10 ;.ms11 ;.ms12 ;.ms13 ;.ms14 ;.ms15 ;.ms16 ;.m3u8 ;.rm ;.rmvb ;.mpeg ;.lnk ;.cs ;.odt ;.ods ;.odp ;.odm ;.odc ;.odb ;.docm ;.wps ;.xlsm ;.xlsb ;.xlk ;.ppt ;.pptx ;.pptm ;.dba ;.db0 ;.kdb ;.mpqge ;.vfs0 ;.mcmeta ;.m2 ;.lrf ;.vpp_pc ;.ff ;.cfr ;.snx ;.lvl ;.arch00 ;.ntl ;.fsh ;.w3x ;.rim ;.psk ;.tor ;.vpk ;.iwd ;.kf ;.mlx ;.fpk ;.dazip ;.vtf ;.vcf ;.esm ;.blob ;.dmp ;.layout ;.menu ;
.ncf ;.sid ;.sis ;.vdf ;.mov ;.fos ;.sb ;.itm ;.wmo ;.map ;.svg ;.cas ;.gho ;.syncdb ;.mdbackup ;.hkdb ;.hplg ;.hvpl ;.icxs ;.itdb ;.itl ;.mddata ;.sidd ;.sidn ;.bkf ;.qic ;.bkp ;.bc7 ;.def ;.dat ;.bc6 ;.pkpass ;.tax ;.gdb ;.qdf ;.t12 ;.t13 ;.bak ;.ibank ;.sum ;.sie ;.zip ;.d3dbsp ;.csv ;.wmv ;.avi ;.wma ;.m4a ;.rar ;.7z ;.mp4 ;.sql ;.psd ;.xml ;.html ;.aspx ;.asp ;.php ;.sln ;.mdb ;
.sql ;.csv ;.png ;.ofx ;.qbb ;.qbw ;.r ;.blend ;.ma ;.mb ;.avb ;.fcpx ;.config ;.arc ;.jssx ;.skp ;.vsd ;.max ;.dwf ;.wrl ;.sea ;.exb ;.rep ;.scada ;.catanalysis ;.catshape ;.catdrawing ;.catporduct ;.catpart ;.catp ;.cat ;.sec ;.mfg ;.frm ;.asm ;.drw ;.prt ;.cir ;.m4v ;.dxf ;.dcm ;.cls ;.class ;.avr ;.au ;.art ;.rwl ;.rw2 ;.r3d ;.ptx ;.pef ;.srw ;.x3f ;.der ;.cer ;.crt ;.pem ;.pfx ;
.p12 ;.p7b ;.pk7 ;.p7c ;.rb ;.css ;.js ;.flv ;.m3u ;.py ;.desc ;.xxx ;.wotreplay ;.big ;.pak ;.rgss3a ;.epk ;.bik ;.slm ;.lbf ;.sav ;.re4 ;.apk ;.bsa ;.ltx ;.accdb ;.pst ;.dwg ;.xf ;.dxg ;.wpd ;.rtf ;.wb2 ;.mdf ;.dbf ;.pdd ;.pdf ;.eps ;.ai ;.indd ;.cdr ;.jpg ;.jpe ;.dng ;.3fr ;.arw ;.srf ;.sr2 ;.bay ;.crw ;.cr2 ;.dcr ;.kdc ;.erf ;.mef ;.mrwref ;
.nrw ;.orf ;.raf ;.vcard ;.edi ;.md ;.enex ;.note ;.onenote ;.cpt ;.spx ;.gdb ;.atx ;.rda ;.rdata ;.ipynb ;.gps ;.pos ;.gdbindexes ;.gdbtable ;.shp ;.index ;.bat ;.wav ;.zip ;.ogg ;.divx ;.mkv ;.aps ;.abk ;.dot ;.java ;.bas ;.wki ;.pas ;.obj ;.msg ;.lst ;.lib ;.for ;.asm ;.c ;.com ;.int ;.dll ;.swf ;.mpg ;.flac ;.aac ;.amr ;.mmf ;.ram ;.au ;.aif ;.pic ;.gif ;.tif ;.rtf ;.mid ;.mxd ;
.img ;.ppt ;.xlsx ;.sldprt ;.ifc ;.rvt ;.logicx ;.sesx ;.vmx ;.pvm ;.nvram ;.vmdk ;.au ;.tsp ;.exe ;.gdf ;.cpp ;.cpp ;.c ;.h ;.m ;.prj ;.seq ;.plt ;.qif ;.odt ;.asset ;.litemod ;.iwi ;.das ;.upk ;.bar ;.hkx ;.ofd ;.out ;.vbs ;.pub ;.ps ;.pm5 ;.pcb ;.njx ;.vod ;.jiff ;.cpx ;.aid ;.dbb ;.jio ;.tiff ;.pcm ;.egd ;
加密路径和选择如图。
加密逻辑
勒索软件对文件大小大于或小于50M采用不同的AES加密模式。计算文件大小(M),更具大小做不同加密操作。
大于50M使用AES256 CFB算法加密。函数首先生成随机盐值,利用盐值将准备阶段拼接的字符迭代50000次,生成密钥和初始化向量,然后使用AES算法和密码对输入文件进行加密,并将加密后的数据写入新的输出文件中,最后删除原始的未加密文件。
小于50M使用AES256 CBC算法加密,和上诉的区别在于使用了固定的盐值(11223344)迭代1000次,再生成密钥和初始化向量。
后续操作
后续发送邮件至勒索软件使用者邮箱,具体信息包括,磁盘序列号、计算机名、加密的文件数量、RSA公钥加密的关联字符串。
勒索软件接收邮箱:
ac7d33419d00c1d9@tutanota.com
并且在桌面留下了勒索信息“重要資訊.txt”,文字为繁体中文。2000块,要是写了几个月的代码你给不给(手动狗头)。
支付码图片就编码存于勒索软件中,恶意程序将图片留在了桌面上“收款碼.jpg”,并且修改文件时间为勒索软件运行至此的系统时间。
编写一个GO语言的小脚本实现和勒索软件中相同的图片解码功能。
图片如下。