前言
病毒分析很心酸,真的会秃头。
这个是关于Criakl勒索病毒安全预警:https://baijiahao.baidu.com/s?id=1621544930994823264&wfr=spider&for=pc感谢这些安全专家吧,唉。不说了。头发真的都掉完了~~~
一:目录
1.目录2.Ioc3.行为分析4.样本分析5.技术总结
二:IoC
2.1 母文件
1.样本名称:ab82cb53a9c89f2e808288957be88b38.vir2.样本md5:ab82cb53a9c89f2e808288957be88b383.是否加壳:UPX4.编译语言:vc++5.样本来源:来自于网络收集2.2 子文件
1.样本名称:3bd50eabb01b9561afa046b34729b104.vir2.样本md5:3bd50eabb01b9561afa046b34729b1043.是否加壳:无4.编译语言:Borland Delphi(2.0-7.0)5.样本来源:母文件中释放而来2.3 url
http://62.210.137.204/1/inst.php
三:行为分析
行为分析:
四:样本分析
4.1 母体文件(Crikl.d)
加载名为ZZZZZ的资源文件,利用ResourceHack查看,可以明显看到文件被加密了。
解密资源文件,解密算法不做分析,直接OD运行跑起来就好了。根据查看Hex很明显看出来这是一个可执行文件
在调试过程中,发现病毒并没有采用明文的方式构建字符串,而是将字符串加密了,发现调用了几个关键的函数如下,可以知道Criakl使用了较为常见的傀儡进程的技术:ZwUnmapViewOfSection:解除文件映射关系VirtualAllocEx:分配内存空间WriteProcessMemory:写进程内存SetThreadContext:设置进(线)程上下文ResumeThread:唤起主线程
根据PE结构修复PE节区表:不然进程是跑不起来的。如下也符合Delphi程序的节区表特性
接下来,我们已经得到了PE数据了,我们需要做的是将恶意代码dump下来。如图:可以发现这是一个伪装成压缩包的恶意程序,但是这个程序dump出来是有问题的。
但是这个程序是可以运行的,根据追踪,发现他在temp目录下释放了一个ycvA文件,而且发现这个文件是一个PE文件。并且执行的流程都和我们dump出来的一样。我们有理由怀疑这个是同一个文件。
巧合的是:我得到两份Criakl病毒样本,一份是变种a,一份是变种d,其中释放出来的恶意(同dump出来的文件),和变种a的MD5是一样的。可以知道病毒作者在变种a的基础上加了一层保护,形成的变种d。
4.2 子文件(Criakl.a)
程序流程分析
以下是第一种情况:不是由变种d创建的进程引发的。
第一步:Dephi程序,直接定位到关键函数
第二歩:利用Iswow64函数判断当前计算机的位数,如果是32位机器,构造Program Files
第三步:构造c://Program Files//Rarlab目录
第四步:检查进程的默认SID,这一步的目的是为了判断本进程是否由Criakl.d创建的进程。
第五步:如果C://Program Files//RarLab目录不存在,创建该目录,用于存放是否的恶意文件
第六步:判断当前执行的文件是否有RarLab目录下释放的恶意文件执行的。
第七步:如果不是从RarLab下执行的恶意代码,则将当前执行的恶意样本写一份,释放到RarLab目录下
第八步:将释放的文件的时间修改为和svchost.exe一样,目的还是为了迷惑受害者。
第九步:最后执行C:Program FilesRarLabyvcA.vir文件以下是第二种情形:不是由变种d创建的进程引发,但是创建进程的文件目录是在RarLab下
判断是否带有参数install以及计算机的位数,然后设置注册表run键,最后执行感染流程。但是这里作者是通过0号参数是文件名写入run键下的,但是作者没有对获取的文件名做验证,导致如图获取的文件名是位于桌面的分析样本,实际中,应该是位于RarLab目录下的样本。
以下是第三种情况:是由变种d创建的进程引发的。
第一步:判断当前进程是否是在C:DOCUME~1hackyLOCALS~1TempRarLab目录下,如果是则执行感染机制,否则创建该目录,用来释放恶意文件。
第二歩:和第一种情况相同,修改文件访问时间,并且创建新的进程。然后退出本进程
执行流程分析
判断C:Program FilesRarLabwinrar.tmp文件是否存在
如果winrar.tmp文件存在第一步:读取winrar.tmp里面的数据。然后创建d.bat
第二步:之后的这个判断永远为假,对其交叉引用发现只有使用,没有修改部分,也就是说这个变量是一个常量字符串。两个比较必为假。不知道作者这步的意义是什么?【存疑】
如果winrar.tmp文件不存在
第一步:生成36轮次的随机数,然后获取本地时间,这些随机数和时间用于以后修改被感染文件的文件名。格式为随机数字符串+日期+时间+随机数(字符串),
第二歩:然后经过9层加密后得到字符串,这个字符串是形成加密文件的名称的组成部分以及后期加密用的数据元
第三步:以Post提交请求,但是这个网站现在已经访问不了了,应该执行CC服务器的职责。
第三步:创建RarLab/winrar.zip,内容是之前的数据数据+这次产生的随机数据
第四步:获取本地磁盘盘符信息,然后进行26次循环,遍历和加密文件
第五步:创建d.bat,用于删除所有的.dat和.exe文件,以及做本地回环测试
加密流程分析
整个加密流程,差不多分析了两天,里面的工程量异常巨大,频繁调用了相同的结构,但是这些结构都是采用了随机数进行加密,不清楚作者的真实意图是什么,经过分析了部分加密样本的形式,可能存在以下特征(这只是我的个人猜测):对于较小的文件,采用填充随机字段+附加数据的方式加密文件,对于大文件,直接附加数据的方式加密。
首先对于x://windows目录不进行加密
先读取文件的内容,读取完毕后,在判断文件末尾是否存在{CRYPTENDBLACKDC}字段
进行了40轮次数据加密,由于程序使用了Randomize(),造成了加密的数据很大程度是随机的。
对于大文件来说,Criakl直接附加额外的数据,一般是通过GetPostion函数获取的设备相对位置和被加密文件的MD5值,并写入文件的末尾。
接下来将一些数字写入,这些数据分别代表的参数由ReOpenBuff.cBytes
,ReOpenBuff.szPathName
,ReOpenBuff.szPathName[32]
等等。然后写入一个通过两次设备相对位置获取的一个字符串32位字符串
然后附加一个随机字符+时间+随机字符的机器ID,以及文件名和结束的感染标志
最后修改被感染文件名:filename+id-{id}-email-email@gmail.com-ver-4.0.0.0.cbf
五:技术总结
5.1 Delphi程序逆向
首先逆Delphi程序有一个神器:Delphi_Decompiler,而delphi编译出来的PE文件可能会有CODE,DATA,BSS,.IDAta,tls,.rdata,.rsrc这些段。.rsrc段比较重要,这里除了一般的资源以外,还有工程信息和DFM资源信息,这一节开始部分是常规的资源表。Delphi程序(exe)常见的入口点如下,InitExe会从.rsrc读取出资源里的drm,然后调用StartExe来从InitRoutineTable读取所有的FunTable,挨个执行对应的Routine。CreateForm创建Form是整个程序初始化的主要流程:
delphi exe入口:
push ebp
mov ebp, esp
add esp, 0FFFFFFF4h
mov eax, offset InitRoutineTable
call @@InitExe//mov eax, ds:off_442C20
mov eax, [eax]
call unknown_libname_291
mov ecx, ds:off_442AB4
mov eax, ds:off_442C20
mov eax, [eax]
mov edx, off_441498
call @TApplication@CreateForm mov eax, ds:off_442C20
mov eax, [eax]
call @TApplication@Run call @@Halt0
![](https://i.imgur.com/teeomOk.png)
如何定位?很简单的。先用Delphi_Decompiler查看Form,一旦找到Form,直接在IDA里面跟就能找到具体的函数,最后OD下断点即可!
Dephi采用的是Fast函数调用方式,也就是说前面3个参数用寄存器EAX,EDX,ECX保存,剩下的参数利用栈保存,返回值返回的是指针而非数据,这就需要逆向分析时先用OD转到Hex窗口,在用里面的地址值去查看具体的数据。
参考自:https://www.52pojie.cn/thread-141040-1-1.html
5.2 加密过程定位
整个分析过程中关于加密过程所浪费的时间占了60%的时间。但是也没有分析出什么特别有效的东西(写不出解密工具),把我这几天的小小体会分享一下。
一拿到函数流程,很dan疼,可以看到流程异常复杂,之前的勒索病毒都是利用windows提供的CSP加密,所以加密流程不是很复杂(比这个明了)。全篇2600的代码量也是非常大的了,那么如何去分析呢??
我的做法是先找入口FirstFile,出口FindClose,中间过程FindNNext。确定了三个点,之后只需要在循环里面进行就好了。然后就是调试了。
2600多行的代码调试起来相当麻烦,所以我先对其下断点,首先是递归函数,一个断点,有个rename
下一个断点,剩下是关于WriteFile下断,以及其他的重要的函数(PS:还要下一个硬件断点,emmmm忘记在哪里了)如图:
每当停下来的时候,就可以利用IDA查看交叉引用了。查看数据流的过程。
本文由安全客原创发布
转载自安全客 - 有思想的安全新媒体