新兴TOP2勒索软件!存在中国受害者的BianLian勒索软件解密原理剖析
字数 1603 2025-08-05 08:19:13
BianLian勒索软件解密原理与工具构建教学文档
1. 概述
BianLian是一种新兴的勒索软件,在2024年的威胁情报中排名第二(仅次于LockBit)。该勒索软件团伙已攻击了包括中国上海科博达科技在内的多家企业。BianLian的攻击模式包括:
- 利用漏洞在网络中传播
- 窃取高价值数据
- 对关键机器进行加密
2. 技术分析
2.1 样本特征
- 使用Golang语言编写
- 包含调试信息,便于逆向分析
- 加密后文件添加".bianlian"后缀
- 在多个目录创建"look at this Instruction.txt"勒索说明文件
2.2 文件加密流程
- 遍历A-Z盘识别系统驱动器
- 从待加密文件中读取指定大小数据块
- 使用AES CBC算法加密数据块
- 将加密数据写回原始文件(直接修改,无法通过常规恢复)
- 添加".bianlian"后缀
3. 加密原理深度剖析
3.1 加密算法
- 仅使用AES-256 CBC模式加密(未使用报告中提到的RSA算法)
- KEY和IV值内置于样本中
- 不同样本使用不同的加密参数组合
3.2 加密逻辑
采用两层校验机制决定是否加密文件:
第一层校验:
- 调用
project1_common_GetBlocksAmount函数 - 传入三个参数:文件大小、块数据大小、加密偏移位置
- 根据返回值决定是否加密
第二层校验:
- 计算实际读取的文件大小(从加密偏移开始)
- 比较实际读取大小与块大小是否相等
3.3 加密模式选择
根据文件大小采用不同加密策略:
| 文件大小范围 | 块大小 | 加密方式 |
|---|---|---|
| < 0x1000 | 16字节 | 按小数据块分别加密 |
| 0x1000-0x400000 | 计算得出 | 按大数据块整个加密 |
| > 0x400000 | 0x400000 | 按大数据块整个加密 |
3.4 关键参数
分析获得的样本密钥信息:
| 样本哈希 | 加密偏移 | KEY | IV |
|---|---|---|---|
| 1fd07b8d... | 9 | 633A56D0... | FC55A60A... |
| 3a2f6e61... | 1 | 26DD1B40... | D518BA92... |
| 46d340ea... | 0x34 | 979412FF... | 0FC14323... |
| af46356e... | 0x41 | 4A410596... | 5560E19D... |
| eaf5e26c... | 0x3d | 27CFAE34... | 223B67AC... |
4. 解密工具构建
4.1 设计思路
- 自动密钥识别:通过桌面desktop.ini文件测试内置密钥组
- 文件遍历:使用Everything工具获取加密文件列表
- 解密处理:根据文件大小应用对应解密逻辑
- 重命名:将.bianlian后缀改为.bak
4.2 核心代码实现
主逻辑(main.go)
func main() {
// 获取加密文件列表
files := common.FileToSlice("C:\\Users\\admin\\Desktop\\11.txt")
// 自动识别密钥
aeskey, aes_iv, offset := getAeskey()
// 遍历处理每个文件
for _, onefile := range files {
fileSize, _ := common.GetFileSize(onefile)
len_block := common.Calc_block(fileSize)
// 读取文件内容
fileData, _ := ioutil.ReadFile(onefile)
file_decodeData := []byte{}
// 根据文件大小选择解密方式
if common.GetBlocksAmount(fileSize, len_block, int64(offset)) > 0 {
if fileSize < 0x1000 {
// 小块解密逻辑
} else {
// 大块解密逻辑
}
// 写回解密数据
common.Writefile(strings.Split(onefile, ".bianlian")[0], string(file_decodeData))
// 重命名文件
os.Rename(onefile, strings.Split(onefile, ".bianlian")[0]+".bak")
}
}
}
密钥识别
func getAeskey() (aeskey []byte, aes_iv []byte, offset int) {
// 桌面ini文件路径
desktopini := filepath.Join(currentUser.HomeDir, "Desktop", "desktop.ini.bianlian")
// 内置密钥组
aeskeys := []string{"633A56D0...", "26DD1B40...", ...}
aesivs := []string{"FC55A60A...", "D518BA92...", ...}
offsets := []int{0x9, 0x1, 0x34, 0x41, 0x3d}
// 尝试每种密钥组合
for ii := 0; ii < 5; ii++ {
// 解密测试
// 成功标志:解密后包含"system32"字符串
if bytes.Contains(file_decodeData, []byte{0x73, 0x00, 0x79, 0x00, ...}) {
return // 返回正确密钥
}
}
return nil, nil, 0
}
加密块计算
func Calc_block(fileSize int64) (v27 int64) {
// 基本块大小计算
v27 = (fileSize / 0x1000) << 0xc
// 大文件特殊处理
if fileSize > 0x400000 {
// 使用大数运算调整块大小
num1 := big.NewInt(fileSize)
num2 := new(big.Int)
num2.SetString("CCCCCCCCCCCCCCCD", 16)
result := new(big.Int).Mul(num1, num2)
// ... 复杂运算 ...
if tmp3 >= 0x400000 {
v27 = 0x400000
}
}
if v27 < 16 {
v27 = 16
}
return
}
4.3 解密效果
- 测试环境解密成功率:578/578(3个因系统运行时修改导致MD5不匹配)
- 完美恢复原始文件结构
- 自动处理不同加密策略的文件
5. 防御建议
- 漏洞管理:及时修补已知漏洞,阻断传播途径
- 备份策略:实施3-2-1备份原则(3份副本,2种介质,1份离线)
- 网络隔离:关键系统实施网络分段
- 终端防护:部署具有行为检测的EDR解决方案
- 安全意识:培训员工识别钓鱼攻击等初始入侵手段
6. 总结
BianLian勒索软件通过精妙的双层校验机制和灵活的加密策略实现了高效的文件加密。本文提供的解密工具基于对加密逻辑的深入逆向分析,通过自动化密钥识别和自适应解密策略,可有效恢复被加密文件。防御方面需采取多层次的安全措施,特别关注初始入侵途径的阻断。