BitLocker加密卷“恢复密钥(数字密码)”提取还原

news2024/11/26 21:20:28

BitLocker是微软Windows自带的用于加密磁盘分卷的技术。

通常,解开后的加密卷通过Windows自带的命令工具“manage-bde”可以查看其恢复密钥串,如下图所示:

如图,这里的数字密码下面的一长串字符串即是下面要提取恢复密钥。

在计算机取证界,经常遇到嫌疑人的目标电脑的磁盘是经过BitLocker加密的,此时通常的做法是通过某种手段(WinPmem、DumpIt、DMA PCILeech,ColdBoot等)取得目标机内存镜像,同时对目标机的磁盘做一个磁盘镜像(WinFE,WinHex,FTKImage等)。

而后,对获取的内存镜像分析(MemProcFS、Volatility等工具)取得BitLocker的VMK密钥,然后通过VMK密钥解密目标磁盘镜像(取证大师等工具),进而获取磁盘中的文件。

这里讲的是通过VMK密钥 + 加密磁盘镜像获取明文恢复密钥串的方法,该方法国外的工具有Elcomsoft、Passware Kit等。

(文字的东西不想多说了,直接上代码,卷起来!)

关键参考代码如下:

//
// @Noema 2021-08-27
// 以下提取恢复密钥明文的方法通过逆向fveapi.dll得来
// 重点关注fveapi.dll中的CFveApiBase::GetAuthMethodInformation函数中的第一个FveDatumVmkQuerySavedKey函数
// 主要逻辑是通过VMK密钥解密Volume Master Key中的stretch key,从而得到恢复密钥的十六进制值,进而得到明文的恢复密钥
//

int libbde_volume_read_recovery_password(
	libbde_volume_t *volume,
	libbde_key_protector_t *key_protector,
	wchar_t *recovery_password_plain,
	uint32_t recovery_password_plain_length
)

{
	INT retn = -1;
	NTSTATUS ret;
	BCRYPT_ALG_HANDLE ba_handle = NULL;
	BCRYPT_KEY_HANDLE bk_handle = NULL;
	BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO paddinginfo = {0};
	BCRYPT_KEY_LENGTHS_STRUCT auth_tag_length_info = {0};
	UCHAR nonce[12] = {0};
	UCHAR tag[16] = {0};
	UCHAR data[1024] = {0};
	PUCHAR stretch_data = NULL;
	DWORD result = 0;
	DWORD object_length = 0;

	USHORT *recovery_data = NULL;
	WCHAR recovery_password[64] = {0};
	INT idx = 0;
	INT order = 0;

	uint8_t * volume_master_key = NULL;

	libbde_internal_volume_t *internal_volume = NULL;
	libbde_internal_key_protector_t *internal_key_protector = NULL;

	if (volume == NULL)
	{
		return -1;
	}
	if (key_protector == NULL)
	{
		return -1;
	}
	if (recovery_password_plain == NULL)
	{
		return -1;
	}

	internal_volume = (libbde_internal_volume_t *)volume;

	volume_master_key = internal_volume->io_handle->volume_master_key;

	internal_key_protector = (libbde_internal_key_protector_t *)key_protector;

	if (internal_key_protector->volume_master_key->protection_type != LIBBDE_KEY_PROTECTION_TYPE_RECOVERY_PASSWORD)
	{
		return -1;
	}

	do 
	{
		ret = BCryptOpenAlgorithmProvider(&ba_handle, L"AES", NULL, 0);
		if (ret != 0)
		{
			break;
		}

		ret = BCryptSetProperty(ba_handle, BCRYPT_CHAINING_MODE, (PUCHAR)BCRYPT_CHAIN_MODE_CCM, 0x20u, 0);
		if (ret != 0)
		{
			break;
		}

		ret = BCryptGetProperty(ba_handle, L"ObjectLength", (PUCHAR)&object_length, sizeof(object_length), &result, 0);
		if (ret != 0)
		{
			break;
		}

		ret = BCryptGetProperty(ba_handle, BCRYPT_AUTH_TAG_LENGTH, (PUCHAR)&auth_tag_length_info, sizeof(auth_tag_length_info), &result, 0);
		if (ret != 0)
		{
			break;
		}
		
		ret = BCryptGenerateSymmetricKey(ba_handle, &bk_handle, 0, 0, volume_master_key, 0x20, 0);
		if (ret != 0)
		{
			break;
		}

		stretch_data = internal_key_protector->volume_master_key->stretch_key->data;
		if (stretch_data == NULL)
		{
			break;
		}

		// nonce
		memcpy_s(nonce, 12, stretch_data + 8, 12);

		// auth tag
		memcpy_s(tag, 16, stretch_data + 8 + 12, 16);

		// encrypted data
		memcpy_s(data, sizeof(data), stretch_data + 8 + 12 + 16, 0x1C);

		// fill structure
		paddinginfo.cbSize = sizeof(paddinginfo);
		paddinginfo.dwInfoVersion = 1;
		paddinginfo.pbNonce = nonce;
		paddinginfo.cbNonce = 0x0c;
		paddinginfo.pbTag = tag;
		paddinginfo.cbTag = 0x10;

		// 解密
		ret = BCryptDecrypt(bk_handle, data, 0x1c, &paddinginfo, 0, 0, data, 0x1c, &result, 0);
		if (ret != 0)
		{
			break;
		}

		// 判断合法性
		if (*(PWORD)(data) < 0x0C || *(PWORD)(data) != 0x1C)
		{
			break;
		}
		if ( *(PWORD)(data + 8) != 0x1000)
		{
			break;
		}

		// 偏移到恢复密钥存储位置
		recovery_data = (USHORT *)(data + 0x0C);

		// 转换恢复密钥为字符串
		for ( ; idx<8; idx++, order += 7)
		{
			wsprintfW(&recovery_password[order], L"%06d-", recovery_data[idx] * 11);
		}
		recovery_password[wcslen(recovery_password) - 1] = L'\0';

		wcsncpy_s(recovery_password_plain, recovery_password_plain_length, recovery_password, _TRUNCATE);

		retn = 0;
	
	} while (0);

	if (bk_handle)
	{
		ret = BCryptDestroyKey(bk_handle);
	}
	if (ba_handle)
	{
		BCryptCloseAlgorithmProvider(ba_handle, 0);
	}
	
	return retn;

}

相关引用:

https://github.com/libyal/libbde

https://github.com/ufrisk/pcileech

https://github.com/ufrisk/pcileech-fpga

https://github.com/ufrisk/MemProcFS

https://github.com/volatilityfoundation/volatility

https://github.com/volatilityfoundation/volatility3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/598469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IMA/EVM完整性检测代码分析

IMA/EVM完整性检测 IMA&#xff08;Integrity Measurement Architecture&#xff09;是一个内核安全子系统&#xff0c;用于检测文件或数据的完整性和安全性。IMA的hook机制指的是内核接口钩子&#xff08;kernel interface hooks&#xff09;&#xff0c;用于向IMA注册和实现…

第三章 部署Web及WDS服务

♥️作者介绍&#xff1a;奇妙的大歪 ♥️个人名言&#xff1a;但行前路&#xff0c;不负韶华&#xff01; ♥️个人简介&#xff1a;云计算网络运维专业人员 目录 一.什么是web 1.www(world wide web)万维网 世界 维度 2.www服务软件 3.info…

ElementUI-Form表单二次封装

一、Form组件二次封装考虑组件构成&#xff1a; form组件&#xff1a;input text passworldselectcheckboxradio文本域日期 二、实现Form表单的二次封装&#xff1a; 1. 分析出对应的位置 开始抽离组件 2. 如果需要产生多个form表单&#xff0c;则需要产生多个el-form-item…

学习路之gis--百度离线地图下载制作

在有些情况下需要使用地图&#xff0c;但又不能访问外网&#xff0c;这时你需要一个离线地图。本文介绍如何制作百度离线地图。 下面将介绍如何实现一个离线版百度地图&#xff1a; 1. 下载百度地图瓦片 下载网址&#xff1a;望远网-百度地图下载 首先需选择下载地图瓦片的样式…

BUG: scheduling while atomic: fpv_cams/605/0x00010001

IIO框架下IMU驱动的接口在定时器中断内调用报错&#xff0c;因调用IO读定时间较长会导致睡眠的发生&#xff0c;因为内核总是崩。 尝试了几种解决方法&#xff1a; 1.在IIO框架里&#xff0c;使用 spidev 的接口来读写&#xff0c;错误依旧&#xff1b; 2.去掉IIO框架&#x…

香橙派One(全志H3芯片)编译烧写U-boot、Linux内核zImage、dtb

一、编译烧写u-boot 1.1 源码和工具下载&#xff1a; 香橙派提供了u-boot源码和交叉编译链工具&#xff1a; &#xff08;1&#xff09;u-boot&#xff08;2020.04&#xff09;下载地址&#xff1a;https://github.com/orangepi-xunlong/u-boot-orangepi &#xff08;2&#…

MyBatis - MyBatis Generator

文章目录 1.什么是 MyBatis Generator2.使用 MyBatis Generator2.1 导入依赖2.2 application 配置2.3 添加 Java 配置2.4 MBG 配置2.5 生成代码2.6 基本 CRUD 操作 3.进阶使用 MyBatis Generator3.1 基于条件的 CRUD3.2 子查询、Group 与 Join 查询3.3 一对一查询、一对多查询 …

ANSYS Workbench中的网格优化方法

自 50 年代后期以来&#xff0c;有限元法 (FEM) 已被用作解决工程问题的强大工具。当时的计算是手工进行的&#xff0c;该方法是基于力的&#xff0c;而不是我们今天使用的基于位移的方法。由于计算机工业的进步&#xff0c;已经开发出各种有限元商业软件。Ansys 可以被认为是全…

Nginx网站部署

Nginx网站部署 一、访问状态统计配置二、基于授权的访问控制三、基于客户端的访问控制四、基于域名的 Nginx 虚拟主机五、基于IP 的 Nginx 虚拟主机六、基于端口的 Nginx 虚拟主机 一、访问状态统计配置 1.先使用命令/usr/local/nginx/sbin/nginx -V 查看已安装的 Nginx 是否包…

常用抓包工具使用-wireshark使用(二)

常用抓包工具使用-wireshark使用&#xff08;二&#xff09; 文章目录 常用抓包工具使用-wireshark使用&#xff08;二&#xff09;前言一、wireshark安装1.1 windows安装1.2 mac安装 二、wireshark抓包和过滤2.1 打开Wireshark2.2 选择网络接口&#xff1a;2.3 wireshark抓包页…

【Nginx 网络服务】

目录 一、Nginx和Apache的优点和缺点二、编译安装Nginx服务1.关闭防火墙&#xff0c;将安装nginx所需软件包传到/opt目录下2.安装依赖包3.创建运行用户、组4.编译安装Nginx5.检查、启动、重启、停止 nqinx服务 三、认识Nginx服务的主配置文件 nginx.conf1、系统文件支持数量2&a…

商场内怎么导航?商场导航图怎么画?

商场内怎么导航&#xff1f;大型购物商场是目前一二线城市最常见的购物场所&#xff0c;占地面积较大&#xff0c;布局错综复杂&#xff0c;商品比较齐全&#xff0c;如果没有商场地图导航&#xff0c;会导致新顾客难以找到想要的商品&#xff0c;那么大型购物商场商场地图怎么…

索引特性.

目录 没有索引&#xff0c;可能会有什么问题认识磁盘MySQL与存储先来研究一下磁盘在看看磁盘中一个盘片扇区定位扇区结论磁盘随机访问(Random Access)与连续访问(Sequential Access) MySQL 与磁盘交互基本单位建立共识索引的理解建立测试表插入多条记录查看插入结果中断一下---…

打跑个人开源转角的“拦路虎”——我的开源之路

从参与Apache 开源项目&#xff0c;到凭借业务需求独自开发个人开源项目&#xff1b;从项目开源出来无人问津到至今500star&#xff0c;多个企业级用户&#xff0c;在开源过程中&#xff0c;我也从走过低谷&#xff0c;一度想过放弃&#xff0c;但仍然选择坚持至今日。 这一路…

Data Distillation: A Survey

本文是蒸馏学习综述系列的第二篇文章&#xff0c;Data Distillation: A Survey的一个翻译 数据蒸馏&#xff1a;综述 摘要1 引言2 数据蒸馏框架2.1 元模型匹配的数据蒸馏2.2 梯度匹配的数据蒸馏2.3 轨迹匹配的数据蒸馏2.4 分布匹配的数据蒸馏2.5 因式分解的数据蒸馏 3 数据模态…

深度探索:Qt CMake工程编译后的自动打包策略

深度探索&#xff1a;Qt CMake工程编译后的自动打包策略 1. 引言&#xff08;Introduction&#xff09;1.1 Qt和CMake的基本概念&#xff08;Basic Concepts of Qt and CMake&#xff09;1.2 自动打包的重要性&#xff08;Importance of Automatic Packaging&#xff09; 2. Qt…

ELK +Filebeat日志分析系统

一、 ELK日志分析系统概述 1、ELK简介 ELK是三个开源软件的缩写&#xff0c;分别表示&#xff1a;Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat&#xff0c;它是一个轻量级的日志收集处理工具(Agent)&#xff0c;Filebeat占用资源少&#xff0c…

我是如何将家里的台式机改成服务器的

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂 文章目录 前言准备工作电脑宽带公网ip光猫给成桥接方式设置路由器设置服务器静态ip地址前言 搞研发的伙伴们,都知道服务器是个什么东西,以及服务器的作用、费用,相信都一清二楚。一般,我们用服务器说的简单点就是放一…

自动驾驶车载MCU开发修炼秘籍

目录 车载MCU开发修炼秘籍1、恩智浦 S32K1XX系列2、英飞凌 AURIX TC3XX3、嵌入式实时操作系统-FreeRTOS4、车载实时操作系统-AUTOSAR 车载MCU开发修炼秘籍 1、恩智浦 S32K1XX系列 S32K14X学习笔记&#xff08;一&#xff09;–S32K汽车MCU资源总结 S32K14X学习笔记&#xff1a…

启用Windows防火墙后,FTP传输非常慢

我们有一个计划任务&#xff0c;该任务使用Windows命令行FTP程序在两个Windows服务器之间传输大文件&#xff08;〜130 MB&#xff09;。速度很慢&#xff08;大约需要30分钟&#xff09;&#xff0c;有时会在传输完成之前终止。服务器是2003年&#xff08;发送&#xff09;和2…