背景
本文将重点分析我们在该用户受害设备上提取到的 LockBit 4.0 加密器样本,揭示其程序行为及加密特征。在此前的分析中,我们曾对一款盗版LockBit 3.0加密器进行深入研究,发现其在对MSSQL数据库文件加密时,仅加密了文件头部内容,主体数据并未受损。基于这一特征,我们通过修复数据库结构的方式成功实现了数据恢复,相关技术细节可参考文章【病毒分析】lockbit家族百万赎金不必付!技术手段修复被加密的数据库,附溯源分析报告 。我们将在接下来的两篇文章中,深入解析该版本解密器存在缺陷的技术原因,并免费公开本次成功研发的专属数据恢复工具,欢迎持续关注。
2. 恶意文件基础信息
2.1 恶意文件基本信息
描述说明名称f53f84ac24e0ae43cd5b59a0e031d6423f8dce2400d21e0d59ea5511b57f256f.vir大小61,952 bytes样本路径C:usersmcadmindesktop操作系统windows架构80386类型PE文件字节序小端MD5004422b08f2b638179d5a75e64bf0af9SHA1af726bedd69174990bb6b1dea902f318ca780adfSHA256bd0649d701f4092c4431b1e597d9a61afff7fcad0b304e1f433cffff42190760
2.2 勒索信
文件名:Restore-My-Files.txt
2.3其他注意事项
分析的样本中加密器与提供的解密器不配套,但核心加密算法完全一致,仅存在密钥差别,后文将详细解释.
附件给出的是自实现的可用解密器.
3.加密后文件分析
3.1 威胁分析
病毒家族Lockbit系列首次出现时间/捕获分析时间2025/4/14威胁类型勒索软件,加密病毒加密文件扩展名.随机12bytes小写hex字符串勒索信文件名Restore-My-Files.txt有无免费解密器?无联系邮箱无感染症状无法打开存储在计算机上的文件,以前功能的文件现在具有不同的扩展名(例如,solar.docx.随机12bytes小写hex字符串)。桌面上会显示一条勒索要求消息。网络犯罪分子要求支付赎金(通常以比特币)来解锁您的文件。感染方式受感染的电子邮件附件(宏)、恶意广告、漏洞利用、恶意链接受灾影响所有文件都经过加密,如果不支付赎金就无法打开。其他密码窃取木马和恶意软件感染可以与勒索软件感染一起安装。
3.2 加密的测试文件
3.2.1 文件1 sierting.txt
加密前:
加密后:
3.2.2 文件2 公司logo 透明.png
加密前:
加密后:
3.3 加密后文件特征
3.3.1 加密后文件名
加密文件名 = 原始文件名+.(12bytes随机小写hex字符串) ,例如:sierting.txt.12345678abcd
3.3.2 加密后文件结构
在文件中,在被加密数据之后,多出92bytes附加信息,结构如下:
3.3.3 加密算法概览
使用自定义512位类sha512哈希算法生成文件密钥的加密密钥,使用了chacha20-poly1305算法,具体使用chacha20作为文件加密算法,文件加密密钥使用ecdh密钥交换算法(x25519)生成,使用poly1305算法和普通的异或计算字符串校验被加密文件的密钥.
4.代码分析
4.1 程序执行流程
4.2 相关函数分析
4.2.1 脱壳
该样本使用自定义加壳器加壳,脱壳方式如下:
使用pe编辑器打开样本文件,去除PE文件头中的aslr配置(动态基址).
入口函数如下:
找到其中的常量跳转,即为跳往oep的指令:
动调程序,下硬件断点并跟进,到达oep:
设置好入口点,自动查找iat即可(如有错误项则删除):
dump修复好后,打开dump修复后文件,改变data(入口点所在段)属性为下图:
保存,即脱壳成功.
4.2.2 加密算法相关
4.2.2.1 对于此样本中密钥交换的解释
假设有两个端点进行密钥交换,为加密端(器)和解密端(器).加密端存有黑客公钥,解密端存有黑客私钥.
加密端加密时候使用随机算法生成每个文件的文件私钥(经过一定处理的随机32bytes长字节串),根据文件私钥和32bytes的数字0x9进行标量乘法,计算出文件公钥写入被加密后的文件,使用文件私钥和黑客公钥生成共享密钥,使用共享密钥进行文件加密.
解密时,读取文件中的文件公钥,与解密器中的黑客私钥进行密钥交换得到与上文相同的共享密钥,然后使用共享密钥解密文件.
4.2.2.2 加密主函数分析
多线程部分:
使用双线程加密,一个获取路径,一个加密路径对应的文件.
加密部分:
计算计数器的地方有一些干扰指令,但是动调能得出初始结果为1.
先获取随机密钥(32bytes,后作为文件块密钥),然后将其前[0,24]下标对应byte和[8,32]下标对应byte异或,存入新数组v179.
再次生成32bytes随机数,作为x25519的随机标量(文件私钥).
执行x25519标量乘法,即32bytes大数0x9和文件私钥相乘,与黑客公钥交换得到共享密钥v217.
自定义哈希结构体内容(开头部分代码和常数模仿sha512,具有一定迷惑性):
将字节串拼接(共享密钥+文件公钥),使用自定义哈希计算得到64bytes的结果,取前32bytes.
将前面取得的32bytes哈希再次以同样的方法哈希,取前24bytes.
使用得到的24bytes哈希初始化自定义的chacha20密钥ctx,使用自定义的初始化算法.
自定义chacha20结构体内包含数据如下:
和标准chacha20的密钥结构相同,此处使用的是8bytes counter和8bytes nonce这一标准.
然后加密该结构体.样本中算法与标准chacha20的区别就是此处有加密这64bytes数据.
密钥流生成时,key为一个32bytes字节串,拷贝加密后的ctx中的[0:16]字节到key的[0:16]下标处,再拷贝加密后的ctx中的[48:64]字节到key的[16:32]下标处,拷贝B的[16:24]字节,作为加密文件密钥的nonce传入密钥拓展函数.这些密钥数据用于chacha20-poly1305校验以及加密加密文件用的密钥. 复制代码 隐藏代码//密钥流生成算法int __usercall file_enc_or_gen_key@(char *action@,int output@,unsigned int input_len,int key,int nonce,__int64 counter){int i; // ebpint v9; // eaxint j; // eaxchar *v11; // eaxint k; // ecxint v14[4]; // BYREFchar v15[32]; // BYREF__int64 v16; // char v17[8]; // BYREFint v18[16]; // BYREFint v19[20]; // BYREFcpy_dw((int)&unk_420498, (int)v14, 4);// 拷贝n个dwordscpy_dw(key, (int)v15, 8);cpy_dw(nonce, (int)v17, 2);v16 = counter;for ( i = 0; i != input_len >> 6; ++i ){chacha20_main(v18, v14);// 标准20轮chacha20算法操作v9 = 0;if ( action ){while ( v9 != 16 ){*(_DWORD *)(output + v9 * 4) = *(_DWORD *)&action4] ^ (v18 + v14);++v9;}action += 64;output += 64;}else{while ( v9 != 16 ){*(_DWORD *)(output + v9 * 4) = v18 + v14;++v9;}output += 64;action = 0;}LODWORD(v16) = v16 + 1;if ( !(_DWORD)v16 )++HIDWORD(v16);}if ( (input_len & 63) != 0 ){chacha20_main(v18, v14);for ( j = 0; j != 16; ++j )v19 = v18 + v14;v11 = a2;if ( action )v11 = action;for ( k = 0; (input_len & 63) != k; ++k )*(_BYTE *)(output + k) = *((_BYTE *)v19 + k) ^ v11;zeroit((int)v19, 64); // 清零n个bytes}zeroit((int)v18, 64);return zeroit((int)v14, 64);}
使用chacha20-poly1305算法校验密钥,使用前面拓展的密钥流,输入文件公钥和加密文件的密钥,输出16字节校验码.
拷贝16bytes校验码,进行第二次校验,得到最终文件尾部附加信息,先行写入文件.
第二次校验,生成8bytes随