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。
|
| 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
MS111 主要逻辑
TR_ProcessWindow:遍历所有的隐藏窗口,并且不属于系统,并查找窗口所属的进程名,如果match到了一个特殊的进程名,就给他发一个消息让他恢复出来。
TR_PerformCheck:创建一个Process开始调用MS112
如果不是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 主要逻辑
根据最新的分析,这个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个字节包含通信包长度的头包,然后继续发送包含实际验证数据的包。
实际上在发送这两个包之前还发送了一个52字节的包,
发送完验证包后,开始接受返回数据。协议相同,先接受4个字节的包,确认要返回的实际数据的长度。然后分配一个带结构的Buffer,用来接收返回的数据,如果返回的数据太多,就一次只接收8k的数据。接收成功后把这些数据压缩保存到Buffer中。
接收的第一个包是返回的校验包,与先前发送的校验包大小一致。校验包的前4个字节是命令,第4-8个字节大概是一个唯一码,并把这个唯一码写到全局数据结构中去。然后开始接收真正的数据。并把265个字节写到全局数据结构中。
然后,接着从全局结构中取回Buffer构造一个新的数据结构,数据结构的前265字节是刚才请求回来的数据(这个数据在后面分析是一个PublicKey),接着4个字节是一个flag,最后四个字节是0x3E8。中间是0。数据结构的大小是0x210。通过从全局数据结构中取一个字符串,并使用上面的Buffer创建这个特殊文件。
接下来开始解密很多的本地加密字符串,然后组装在一起。后面分析到这实际上是在组装一个勒索的html文件。用浏览器加载这个html。
中间会删除一些文件,同时创建一个Process并向这个Process注入一段代码执行写文件的操作。
TED_CreateAWriteFileProcessThenExit
最后它会创建一个Windows窗口,这个窗口的尺寸等同于客户的屏幕大小,并将信息(大概是勒索信息)打印到窗口上。
这部分会根据是否有全局的窗口句柄来判断是否将信息打印到用户屏幕上去,或者是写入到一个Bmp文件中去。
之后会等待WM_QUIT消息,随后释放Mutex退出进程。这个Mutex应该是为了防止重入,进而在用户屏幕上绘制太多的信息。
0x41A77C应该是打印在用户屏幕上面的勒索信息,这个function涉及了大量的加密字符串的解密工作。
MS113主要逻辑
这个导出函数的主要逻辑是去Webserver上面下载数据并生成一个邪恶的dll。它首先会去尝试连接”144.76.82.19″的443端口SSL,如果这个server访问失败还有一个后备server地址是 “93.170.187.64”。
连接并校验成功后会先发送一个请求文件大小的包,根据请求到的文件大小创建一个缓冲区,并接收数据,完毕后会把这个数据写成一个image文件存放到本地磁盘上。
下面是卡巴斯基对这个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.
我尝试下载这个dll但是失败了,我不知道是不是webserver端的程序修改了还是什么其他原因。当我请求文件大小的时候webserver返回了一个比代码中size还要大的尺寸,以至于程序总是没有进行实际的请求工作就退出了。
我Patch了个size,提供了一个更大的size,第一次请求实际的数据时能够得到数据,但是第二次继续请求的时候没有任何数据到达。因此实际获取的数据长度与请求得到的文件长度不同,程序没有继续构建这个dll出来。Webserver逻辑变更也是有可能的,所以我无法释放出这个文件加以分析。
MS115主要逻辑
这个导出函数的工作就是monitor WerFault.exe,不停的杀这个process。然后判断它的父进程是否已经退出了,如果退出的话创建一个Process用伪装的svchost去loadCrypt然后调用MS112。看起来是一个守护进程。
加密用户数据的逻辑
这个逻辑主要在MS112中,从下面这个图可以看出来它会用随机算法build一个随机串出来,这个随机串用来给文件加密,这样它就不需要调用其它加密的API,保证了它的加密速度。Build这个随机串在生成勒索信息和真正加密用户文件中都有用到。当然它还会每隔8191个字节加密前64个字节用非对称RC4加密。

加密的逻辑是先将文件读到一个缓冲区中,然后进入一个循环中,循环每次增加8255个字节。在这个循环中拷贝缓冲区中的前64个字节到一个临时buffer中,然后用非对称的PublicKey进行RSA加密,然后将这个buffer拷贝到另外一个缓冲区中,由于加密后数据会变大,因此拷贝到另外的缓冲区中选择的size的大小是128字节。接下来的8191字节采用一个数学算法,利用随机生成的44字节的串对这部分数据进行加密,速度很快。完成后将这8191个字节拷贝到另外的缓冲区中。8191+64=8255
如果这一切完成了,它会写个0x3E8到文件末尾。还会把使用到的随机串用PublicKey加密了。
这块逻辑比较复杂,如果要准确的分析还需要动态调试验证一下,这里我还没有去做。把代码贴出来,大家自己感受吧。
TED_EncryptBytesByRC4每隔8255加密64字节头,强加密
TED_EncryptBytesByAlgorithm 剩下的8191采用随机串用数学算法加密,速度快,没有看到AES对称加密算法,和AESkey。
Random随机数生成一个64位的key的算法分析
这个算法的逻辑简单说就是,用两个Random函数生成2个随机数,一个是0-3用于选择使用哪一个字符数据,另一个0-44用户定位数组中哪一个字符。这样就组装除了一个64位的Key字符数组。放代码看的清楚。
种子算法:
伪随机算法:
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/
本文详细解析了CryptXXX勒索软件的工作原理和技术细节,包括其如何通过DLL注入和进程伪装技术实现隐蔽运行,以及如何利用随机算法加密用户文件。
135

被折叠的 条评论
为什么被折叠?



