内容保护 DDI 是 Direct3D 版本 9 DDI 的扩展,用于保护视频。 内容保护 DDI 包含本节中所述的入口点。
1. 内容保护 DDI 的架构定位
1.1 与 Direct3D 9 DDI 的关系
- 基础依赖:构建在标准 D3D9 DDI 之上(d3dumddi.h)
- 扩展性:新增 5 个专用入口点(见表 1)
- 安全边界:用户模式驱动(UMD)与内核模式驱动(KMD)协作完成硬件级保护
1.2 保护层级
层级 | 技术实现 | 防御目标 |
---|---|---|
应用层 | DRM API (PlayReady/Widevine) | 非法应用访问 |
驱动层 | 内容保护 DDI | 内存转储/中间人攻击 |
硬件层 | GPU 安全引擎 (如 Intel PAVP) | DMA 攻击/物理探测 |
2. 核心入口点详解
2.1 必须实现的 5 个关键函数
(1) CreateCryptoSession (D3DDDIARG_CREATECRYPTOSESSION)
typedef struct _D3DDDIARG_CREATECRYPTOSESSION {
HANDLE hCryptoSession; // 输出:会话句柄
CONST D3DDDI_CRYPTO_SESSION* pCryptoInfo; // 输入:加密参数
} D3DDDIARG_CREATECRYPTOSESSION;
功能:建立安全上下文
实现要点:
- 验证 pCryptoInfo->CryptoType(如 AES-128)
- 绑定解码器与显示目标(DXVA-HD)
- 返回的句柄用于后续操作
(2) DecryptionBlt (D3DDDIARG_DECRYPTIONBLT)
typedef struct _D3DDDIARG_DECRYPTIONBLT {
HANDLE hCryptoSession; // 加密会话
HANDLE hSrcResource; // 加密输入纹理
HANDLE hDstResource; // 解密输出纹理
UINT SubResourceIndex; // 子资源索引
DXVA_DECRYPT_BLOCK* pBlocks; // 解密块信息
} D3DDDIARG_DECRYPTIONBLT;
安全约束:
- 禁止 CPU 访问 hDstResource
- 必须使用 GPU 硬件解密引擎
- 内存传输路径需加密(如 Intel PAVP)
(3) GetEncryptedBlock
作用:获取加密数据块供硬件解码器使用
典型流:
应用 → DRM模块 → GetEncryptedBlock → DXVA解码器
(4) `OPM 相关函数
pfnOPMGetCertificate // 获取驱动数字证书
pfnOPMCreateProtectedOutput // 建立受保护输出链路
pfnOPMGetRandomNumber // 安全随机数生成
3. 安全数据传输流程
3.1 受保护视频播放示例
初始化阶段
sequenceDiagram
Application->>UMD: CreateCryptoSession(D3DCRYPTOTYPE_AES128)
UMD->>GPU: 初始化硬件解密引擎
GPU-->>UMD: 返回会话句柄
帧处理阶段
graph LR
A[加密视频帧] --> B(DXVA解码器)
B --> C{GetEncryptedBlock}
C --> D[GPU解密]
D --> E[DecryptionBlt到保护表面]
显示阶段
- 通过 OPM 验证显示器 HDCP 状态
- 仅允许加密信号输出(如 HDMI HDCP)
4. 驱动开发关键问题
4.1 内存保护机制
- 写时加密:D3DUSAGE_PROTECTED 资源在写入显存时自动加密
- 读时验证:任何 LockRect 尝试需返回 D3DERR_INVALIDCALL
4.2 多GPU 处理
// 在多适配器环境中需特殊处理
if (pAdapter->IsHybridGPU()) {
ForceUseSecureGPU(); // 强制使用带安全引擎的GPU
}
4.3 错误代码规范
错误码 | 触发条件 |
---|---|
D3DDDIERR_NOTAVAILABLE | 硬件不支持请求的加密类型 |
D3DDDIERR_INVALIDCALL | 尝试读取保护资源 |
5. 认证与测试
5.1 WHQL 测试要求
- 加密泄漏测试:注入伪造的 DecryptionBlt 请求检测数据泄露
- HDCP 一致性:模拟显示器热插拔和降级攻击
- 抗逆向工程:验证驱动是否混淆关键函数指针
5.2 调试技巧
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Direct3D]
"EnableContentProtectionDebug"=dword:00000001
启用调试日志后检查:
- 加密会话生命周期
- OPM 证书链验证过程
6. 现代系统兼容性
虽然基于 D3D9 DDI,但在 Windows 10/11 中仍需支持:
- 与 D3D11 保护资源互操作
- 虚拟化安全(VBS)集成
- HDR10+ 内容保护扩展