Global Data Structure

Named ImageOffset Description
pConfig 0x4259A0 全局配置信息,窗口句柄,全局标志位,当前进程是否是Svchost本身等。
szMutexCrypt pConfig+0x100 全局互斥对象的名称,
szModuleFullPath pConfig+0x121 Crypt.dll的当前完整路径 (C:\Tmp\Crypt_Patched.dll)
dwOSVer pConfig+0x26B 操作系统的主版本号和次要版本号
szModuleDirectory pConfig+0x663 Crypt.dll的当前所在目录
dwPlatform pConfig+0x26C 64 or 32 代表不同的平台
dwWebServerID pConfig+0x26A 0x13524C90 or 0x40BBAA5D
  pConfig+0x563  
  pConfig+0x8A5  
szWebserverIp pConfig+0x26A “144.76.82.19” or “93.170.187.64”
lpPubKeyString 0x4272B8 .BSS 运行时释放到这里
dwRandomSeed 0x423008 .data 随机数种子,每次运行都不一样

Export Function

funcName ImageOffset Description
DllEntryPoint 0x422028 这个入口会根据当前执行的进程名称来判断是第一次被调用(rundll32.exe),还是之后的伪装调用(svchost.exe)。如果是第一次调用,做一些初始化的工作,将rundll.exe从系统目录拷贝到当前module目录中并重命名为svchost.exe,然后用伪装的svchost加载crypt.dll并调用MS111。这回导致新进程再去load crypt.dll进而反复启动新的进程,这是系统中出现一大堆svchost.exe的原因。

0x41FFFF位置打patch 90 81 C4 28 00 00 00让它无法启动好多的进程方便调试。只要不是svchost启动的,暂时就不会干不好的事情。

MS111 0x421E1C 首先判断一下是否已经在入口中执行了伪装svchost加载模块的流程,如果没有创建一个新的进程调用MS112。如果执行了,先等6分钟,然后启动2条线程TR_ProcessWindow和TR_PerformCheck,然后进入消息循环等待进程退出的消息。
MS112(Encrypt) 0x4213C0 首先从全局信息中取出互斥对象的名称,然后打开这个互斥对象。根据后面的分析这个互斥对象应该是每个Process都是唯一的,没有确认。成功创建了Mutex后先组装一个神秘的字符串没有调,然后根据一个标志来决定是否创建一个Process去执行MS113. 然后检查全局数据结构,取出一个特殊文件的路径,判断这个文件存在不存在。
MS113(FillConfig) 0x421384 这个函数只做一件主要的事情,就是去webserver上面下载一个危险的dll。

https://www.proofpoint.com/tw/threat-insight/post/cryptxxx-ransomware-learns-samba-other-new-tricks-with-version3100

MS114 0x421E0C Set一个全局标志后,调用MS112. MS112会根据是否设置了这个全局标志来决定是否调用MS113.
MS115(Deamon) 0x421254 每隔200ms检查一下系统中是否存在WerFault.exe(CrashReport),如果存在就杀掉这个进程。同时检查当前进程的父进程是否已经退出了,如果退出了就用系统中保存的伪装的svchost加载crypt.dll并调用MS112,然后退出。
RSA Key
—–BEGIN CERTIFICATE—–

BgIAAACkAABSU0ExAAQAAAEAAQBfFTOUbZiP6u9PppNyTSXM+Y5W9pEcKe68HJYq

dLYpXL+XCzXTUgsSRJ1iNmXqrhUEqz3hOi93Bw53U28gvnJTHRboA32xzli688MQ

eJz7kis1d2G+o8bz+VHO/7qsX+jlBLkP86a6+MYvvhZW+Z0HcsZbMjn6/yCgbhF8

BhpvuQ==

—–END CERTIFICATE—

写了个程序把image中的所有加密字符串解密出来。

Encrypt Decrypt
 EncryptString DecryptString

这是一个html,被解密后释放出来。是一个勒索页面

The blackmail html which Extracted from decrypt
 blackmail

DllEntryPoint

DllEntryPoint

MS111 主要逻辑

MS111

TR_ProcessWindow:遍历所有的隐藏窗口,并且不属于系统,并查找窗口所属的进程名,如果match到了一个特殊的进程名,就给他发一个消息让他恢复出来。

TR_ProcessWindow

TR_PerformCheck:创建一个Process开始调用MS112

TR_PerformCheck

如果不是Svchost.exe创建新的Process开始调用MS112,进程退出。

执行的Commandline如下:

C:\Users\ADMINI~1\Desktop\_00310~1\svchost.exe C:\Users\ADMINI~1\Desktop\_00310~1\_00310000_pe.dll, MS112

MS112 主要逻辑

MS112

根据最新的分析,这个Func是用来加密用户文件,并显示勒索信息的。

首先从全局信息中取出互斥对象的名称,然后打开这个互斥对象。根据后面的分析这个互斥对象应该是每个Process都是唯一的,没有确认。成功创建了Mutex后先组装一个神秘的字符串,根据是否已经获得了全局数据结构来决定是否创建一个Process去执行MS113,MS113会去webserver请求全局数据结构.

然后检查全局数据结构,取出一个特殊文件的路径,判断这个文件存在不存在。

如果存在,就把文件中的内容读取到一个Buffer中,这个Buffer是有结构的,它的0x20C偏移是0x3E8这是一个Marker。

如果这个文件不存在,那么请求webserver给它发送一个这份文件内容的数据。它会初始化一个请求数据结构,其中前4个字节是请求的command,最后四个字节是marker。中间的内容根据全局数据结构填充。

请求的数据使用Https安全协议加密,它有两个webserver(”144.76.82.19″ or “93.170.187.64”),当一个请求失败时会尝试第二个webserver。

首先发送校验包,用于服务器确认通信合规。先发送4个字节包含通信包长度的头包,然后继续发送包含实际验证数据的包。

TED_SendAuthenticationPackage

实际上在发送这两个包之前还发送了一个52字节的包,

发送完验证包后,开始接受返回数据。协议相同,先接受4个字节的包,确认要返回的实际数据的长度。然后分配一个带结构的Buffer,用来接收返回的数据,如果返回的数据太多,就一次只接收8k的数据。接收成功后把这些数据压缩保存到Buffer中。

接收的第一个包是返回的校验包,与先前发送的校验包大小一致。校验包的前4个字节是命令,第4-8个字节大概是一个唯一码,并把这个唯一码写到全局数据结构中去。然后开始接收真正的数据。并把265个字节写到全局数据结构中。

TED_RequestForSpecialInfo

然后,接着从全局结构中取回Buffer构造一个新的数据结构,数据结构的前265字节是刚才请求回来的数据(这个数据在后面分析是一个PublicKey),接着4个字节是一个flag,最后四个字节是0x3E8。中间是0。数据结构的大小是0x210。通过从全局数据结构中取一个字符串,并使用上面的Buffer创建这个特殊文件。

SR_WriteSpecialFile

接下来开始解密很多的本地加密字符串,然后组装在一起。后面分析到这实际上是在组装一个勒索的html文件。用浏览器加载这个html。

中间会删除一些文件,同时创建一个Process并向这个Process注入一段代码执行写文件的操作。

TED_CreateAWriteFileProcessThenExit

最后它会创建一个Windows窗口,这个窗口的尺寸等同于客户的屏幕大小,并将信息(大概是勒索信息)打印到窗口上。

这部分会根据是否有全局的窗口句柄来判断是否将信息打印到用户屏幕上去,或者是写入到一个Bmp文件中去。

SR_PrintScreenAndSave2File

之后会等待WM_QUIT消息,随后释放Mutex退出进程。这个Mutex应该是为了防止重入,进而在用户屏幕上绘制太多的信息。

0x41A77C应该是打印在用户屏幕上面的勒索信息,这个function涉及了大量的加密字符串的解密工作。

MS113主要逻辑

这个导出函数的主要逻辑是去Webserver上面下载数据并生成一个邪恶的dll。它首先会去尝试连接”144.76.82.19″的443端口SSL,如果这个server访问失败还有一个后备server地址是 “93.170.187.64”。

连接并校验成功后会先发送一个请求文件大小的包,根据请求到的文件大小创建一个缓冲区,并接收数据,完毕后会把这个数据写成一个image文件存放到本地磁盘上。

TED_DownloadStillerx_dll

下面是卡巴斯基对这个dll的分析介绍

StillerX

In order to further monetize the infections, CryptXXX downloads a DLL which acts as a credential stealing module. Internally referenced as “stiller.dll”, “stillerx.dll” and “stillerzzz.dll”, this DLL works as a plugin, but can also be used as a standalone stealer. The stealer, like the ransomware, is written in Delphi, and uses the object-oriented capabilities offered by the language. Its relatively large size on disk (around 1.2mb) is due to the static linking of several third party libraries such as DCPcrypt used for retrieving and decrypting locally stored credentials.

https://www.proofpoint.com/tw/threat-insight/post/cryptxxx-ransomware-learns-samba-other-new-tricks-with-version3100

我尝试下载这个dll但是失败了,我不知道是不是webserver端的程序修改了还是什么其他原因。当我请求文件大小的时候webserver返回了一个比代码中size还要大的尺寸,以至于程序总是没有进行实际的请求工作就退出了。

我Patch了个size,提供了一个更大的size,第一次请求实际的数据时能够得到数据,但是第二次继续请求的时候没有任何数据到达。因此实际获取的数据长度与请求得到的文件长度不同,程序没有继续构建这个dll出来。Webserver逻辑变更也是有可能的,所以我无法释放出这个文件加以分析。

MS115主要逻辑

这个导出函数的工作就是monitor WerFault.exe,不停的杀这个process。然后判断它的父进程是否已经退出了,如果退出的话创建一个Process用伪装的svchost去loadCrypt然后调用MS112。看起来是一个守护进程。

MS115_TerminateWerfault

加密用户数据的逻辑

这个逻辑主要在MS112中,从下面这个图可以看出来它会用随机算法build一个随机串出来,这个随机串用来给文件加密,这样它就不需要调用其它加密的API,保证了它的加密速度。Build这个随机串在生成勒索信息和真正加密用户文件中都有用到。当然它还会每隔8191个字节加密前64个字节用非对称RC4加密。

加密的逻辑是先将文件读到一个缓冲区中,然后进入一个循环中,循环每次增加8255个字节。在这个循环中拷贝缓冲区中的前64个字节到一个临时buffer中,然后用非对称的PublicKey进行RSA加密,然后将这个buffer拷贝到另外一个缓冲区中,由于加密后数据会变大,因此拷贝到另外的缓冲区中选择的size的大小是128字节。接下来的8191字节采用一个数学算法,利用随机生成的44字节的串对这部分数据进行加密,速度很快。完成后将这8191个字节拷贝到另外的缓冲区中。8191+64=8255

如果这一切完成了,它会写个0x3E8到文件末尾。还会把使用到的随机串用PublicKey加密了。

这块逻辑比较复杂,如果要准确的分析还需要动态调试验证一下,这里我还没有去做。把代码贴出来,大家自己感受吧。

TED_EncryptUserFile

TED_EncryptBytesByRC4每隔8255加密64字节头,强加密

TED_EncryptBytesByAlgorithm  剩下的8191采用随机串用数学算法加密,速度快,没有看到AES对称加密算法,和AESkey。

Random随机数生成一个64位的key的算法分析

这个算法的逻辑简单说就是,用两个Random函数生成2个随机数,一个是0-3用于选择使用哪一个字符数据,另一个0-44用户定位数组中哪一个字符。这样就组装除了一个64位的Key字符数组。放代码看的清楚。

TED_BuildKeyWithRandom

种子算法:

SR_System__Randomize

伪随机算法:

SR_Random

Other

由于恶意软件是delphi写的,因此了解一下delphi使用的字符串的结构对分析代码有些帮助。

AnsiString的内部结构

被感染后会将rundll32.exe从windows目录中拷贝过来并改名为svchost,然后都用svchost启动,起到伪装迷惑的作用。

然后创建一个Process,进程的Commandline如下:

C:\Users\ADMINI~1\Desktop\_00310~1\svchost.exe C:\Users\ADMINI~1\Desktop\_00310~1\_00310000_pe.dll, MS111

这个过程是在Dll load的时候做的,所以它只要一load就会创建一个Process再去load自己,这样就会存在很多个Process在系统中。为了调试方便,可以打patch,让它不要去创建进程。

由于会写一个bmp文件出来,这个bmp文件的内容也是勒索信息,被用于屏幕保护。所以需要知道bmp的结构才能分析对应的代码。

原文地址: http://ec2-52-196-167-189.ap-northeast-1.compute.amazonaws.com/wordpress/index.php/2016/07/15/cryptxxx-analysis/

Ransomware CryptXXX Analysis相关推荐

  1. Ransomware Cerber Analysis

    Cerber是一个可执行程序,它的感染后行为没有CryptXXX这么隐蔽,可以说分析它的行为并不困难,但是它对内部数据的保护比CryptXXX做的好.例如: 我可以写一个简单反向算法就可以将Crypt ...

  2. Ransomware Locky Analysis

    Locky的变种非常的多,这个样本来自下面的Url,是最新的一种变种. 这是程序在刚开始执行时与释放了Image并替换了之后的对比,很明显发生了进程替换,因此进行分析之前有必要把它内部释放出来的ima ...

  3. Algorithm, Secret key and Protocol

    最近在对基于区块链构建的信任社会(未来社会形态)非常感兴趣,区块技术去中心化的特性,让没有金融机构成为了可能(包括央行,以及各种商业银行). 除了在数字货币领域大放异彩外,在包括供应链,网络购物,公平 ...

  4. Afraidgate: Major Exploit Kit Campaign Swaps Locky Ransomware for CryptXXX

    目录 An Evolving Campaign The Angler/Bedep/CryptXXX Combo Conclusion Indicators of Compromise By Brad ...

  5. 【翻译】WannaCry ransomware attack

    来源[维基百科-wannacray] WannaCry ransomware attack From Wikipedia, the free encyclopedia The WannaCry ran ...

  6. Tryhackme-Malware Analysis

    Malware Analysis 文章目录 Malware Analysis **History of Malware** task1 Introduction task2 The Creeper P ...

  7. All Your PLCs Belong to Me: ICS Ransomware Is Realistic

    你所有的PLC都属于我:ICS勒索软件是现实的 一.摘要 二.介绍 三.系统模型和威胁模型 (一)系统模型 (二)威胁模型 四.实验评估 (一)评估指标 1. PLC评估 2.监控计算机评估 (二)攻 ...

  8. TensorRT Analysis Report分析报告

    TensorRT Analysis Report 一.介绍 TensorRT是一个高性能的深度学习推理(Inference)优化器,可以为深度学习应用提供低延迟.高吞吐率的部署推理.TensorRT可 ...

  9. PCA(Principal Component Analysis)的原理、算法步骤和实现。

    PCA的原理介绍:  PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分 ...

最新文章

  1. 获取 一个文件 在沙盒Library/Caches/ 目录下的路径
  2. js截屏代码_JavaScript网页截屏方法,你get到了嘛?
  3. 知乎自动批量软件使用教程
  4. 您也使用托管C++吗?
  5. python编辑器_python编辑器,作为小白该如何抉择?
  6. python调用R语言,关联规则可视化
  7. html5 white space,CSS white-space 属性
  8. 玩转 SpringBoot 2 快速整合 Listener
  9. 【题解】(排序) —— POJ 0810:距离排序
  10. 日常开发中的几个常用跨域处理方式
  11. 常见的深度学习面试题及解答(一)
  12. 滴滴章文嵩:我们比AlphaGo面临的问题要复杂很多很多倍
  13. plsql的注册激活
  14. 南通大学python期末考试试卷答案_南通大学自动评教脚本(python)
  15. 看到别人比自己优秀,为何会难受?
  16. 阿里云商标注册快速上手笔记(新手图文教程)
  17. 一位Java工程师的阶段性工作总结
  18. matlab地球月球卫星关系,Matlab 卫星绕地球旋转演示动画
  19. 应届生VS往届生,谁更“吃香”?
  20. 小微商家大调查:三成是夫妻店,八成受假钞困扰

热门文章

  1. Android如何使用API
  2. 关于IE记录Cookie的问题
  3. 最小二乘算法MATLAB代码实现
  4. 数据科学学习课件:实用数据挖掘与人工智能
  5. Python:Selenium错误小结
  6. [云炬创业基础笔记]第七张创业资源测试13
  7. 《应试教育洗礼的“好”学生的学习行为特征分析》 2019-11-02
  8. 云炬Android开发笔记 6启动图功能开发与封装
  9. 云炬Android开发笔记 3-3基础框架可用性验证
  10. connection getconnection()为什么要关闭_为什么转速低于600r/min排汽缸喷水要自动关闭_搜狐汽车...