lagorceclovis-ship-it/reverse-engineering-byovd-kernel-zero-day

GitHub: lagorceclovis-ship-it/reverse-engineering-byovd-kernel-zero-day

一份基于逆向工程的BYOVD内核驱动加载链分析报告,涵盖从VMProtect保护样本到DSE绕过以及物理内存访问的技术细节。

Stars: 0 | Forks: 0

# BYOVD 内核驱动加载链分析 **作者:** Clovis Lagorce **日期:** 2026年5月 **联系方式:** lagorceclovis@gmail.com **背景:** 个人安全研究 — 负责任的披露 ## 免责声明 本分析仅针对为研究目的获取的二进制文件进行。未对所述技术进行任何恶意使用。相关发现已通过负责任的披露流程通知相关厂商。本公开文档中已刻意省略具体技术指标(哈希值、URL、化名、驱动名称),这些内容仅保留在私有披露报告中。 ## 摘要 本文档记录了对一个受 VMProtect 保护的 Windows x86-64 二进制文件的分析过程。分析揭示了一条多阶段的内核驱动加载链,利用 BYOVD(Bring Your Own Vulnerable Driver)技术绕过 DSE(驱动签名强制),最终加载一个未签名的自定义内核驱动。在提交时,该恶意样本未被任何反病毒引擎检测到。此外,该二进制文件呈现出与物理内存访问技术一致的特征,旨在绕过一款运行在用户态的商业反作弊解决方案。 本文件明确区分了已确认的观察结果、合理的推断以及未经证实的假设。 ## 环境与工具 | 工具 | 用途 | |---|---| | IDA Free 8.x | 静态分析、字符串提取、交叉引用 | | x64dbg(最新版本) | 动态分析、附加进程、内存转储 | | ScyllaHide 插件 | 绕过反调试(VMProtect 配置文件) | | PowerShell 5.1 | 自动化字符串提取、注册表取证 | | Python 3.x | 二进制解析、ASCII/UTF-16 提取 | | VirusTotal | 样本信誉查询 | 分析在隔离的 Windows 10 x64 系统上进行。 ## 1. 静态分析 ### 1.1 观察结果 该二进制文件大小约为 12 MB,目标架构为 x86-64。加载到 IDA Free 后,自动分析在特定地址范围内陷入循环,导致无法正常完成。该行为与 VMProtect 虚拟化技术一致,后者用专有字节码替换原生指令,并由嵌入式虚拟机执行。 尝试对识别出的入口函数进行 Hex-Rays 反编译失败,并显示以下消息: ``` Error: stack frame is too big ``` 检查函数元数据发现,其栈帧声明异常地大。这是 VMProtect 的一种已知技术,通过人为膨胀帧大小来超出反编译器的限制。 ### 1.2 静态分析的局限性 由于 VMProtect 的保护,以下内容无法通过静态分析可靠确定: - 运行时解密的字符串值(包括网络端点) - 虚拟化函数的精确控制流 - 运行时解析的 API 完整列表 ## 2. 动态分析 ### 2.1 反调试观察结果 在调试器下执行时,二进制文件显示一条警报,指示检测到调试器。识别出三个不同的机制: 1. 通过标准 Windows API(用户态)进行检查 2. 直接检查 PEB.BeingDebugged 字段,绕开 API 层 3. 在 VMProtect 虚拟机内部实现的额外检查,对常见的挂钩方法具有抵抗力 ### 2.2 绕过方法 二进制文件在无调试器的情况下启动。然后,x64dbg 被附加到正在运行的进程,并配置了 ScyllaHide 插件(VMProtect 配置文件)。该方法对机制(1)和(2)有效。机制(3)在附加时已经执行完毕。 **注意:** 此方法不能保证完全绕过反调试。 ## 3. 内存获取与字符串分析 ### 3.1 内存转储 在调试器附加且进程等待用户输入的情况下,从 x64dbg 控制台获取了 PE 段的内存快照。转储大小:约 21 MB。此时,这些段中由 VMProtect 加密的字符串已在内存中解密。 ### 3.2 字符串提取 一个 Python 脚本从转储中提取了所有可打印的 ASCII 和 UTF-16 LE 序列(最小长度 5)。共提取约 23,700 个字符串,其中约 300 个对应于安全相关的关键词。 ### 3.3 重要发现 **调试符号路径(PDB):** 转储中识别出两个 PDB 路径。PDB 路径是编译器生成的人工产物,嵌入了编译时源文件系统的路径。它们出现在分发的二进制文件中,表明调试符号未被移除。这些路径表明两个组件是在开发机器上编译的,并且文件路径中嵌入了化名。 **错误消息字符串:** 多个字符串提示存在一个带错误处理的 DSE 禁用机制。消息引用了启用和禁用 DSE 操作的失败条件,以及一个接受目标驱动路径作为参数的命令行用法字符串。 **内核函数引用:** 识别出三个日志/调试类型的字符串: ``` [DRIVER] BruteforceCR3: FOUND CR3=0x%llX [DRIVER] ReadFunc: MmMapIoSpaceEx PsGetProcessSectionBaseAddress ``` 这些字符串似乎是嵌入在内核驱动组件中的调试消息。它们的出现暗示(尽管不能最终证明)运行时使用了这些技术。 ## 4. 网络基础设施 ### 4.1 方法 许可证服务器 URL 在内存转储中未以明文形式出现,表明其在运行时解密。因此采用了 DNS 缓存分析作为替代方法: 1. 清空 DNS 解析器缓存 2. 执行二进制文件并提交测试输入 3. 检查 DNS 缓存中是否有新条目 ### 4.2 观察结果 执行后,DNS 缓存中出现了一个已知后端即服务平台的子域。该子域包含一个唯一项目标识符,平台提供商可将该项目与注册账户关联,从而便于通过适当法律途径进行识别。 解析出的 IP 地址属于一家主要 CDN 提供商,充当反向代理,遮蔽了真实的后端基础设施。 *完整域名、项目标识符和 IP 地址已省略,保留在私有披露报告中。* ## 5. 内核驱动加载链 ### 5.1 观察到的人工产物 **文件系统:** - 一个或多个 `.sys` 文件,文件名由随机生成的十六进制字符串组成,放置在用户可写的临时目录中 - 第二个 `.sys` 文件放置在系统临时目录中(随后被删除;注册表人工产物仍存在) **Windows 注册表:** 为每个 `.sys` 文件在 `HKLM\SYSTEM\CurrentControlSet\Services` 下创建了服务。关键属性如下: ``` Type : 0x1 (SERVICE_KERNEL_DRIVER) Start : 0x4 (SERVICE_DISABLED) ``` 加载后设置的 `SERVICE_DISABLED` 值与减少取证可见性的尝试一致。 ### 5.2 推断的加载链 **驱动加载顺序未直接在运行时观察到**,原因是许可证验证阻止了使用测试输入完整执行。以下内容基于文件系统、注册表和提取的字符串推断得出。 **步骤 1 — 合法的易受攻击驱动程序:** 加载一个由合法软件供应商签名的驱动程序。该驱动在 LOLDrivers 数据库中收录,已知通过 IOCTL 接口暴露内核内存读/写语。其合法签名允许其在 DSE 正常执行下加载。 **步骤 2 — 绕过 DSE:** 易受攻击的驱动被用来修改内核强制执行变量。该推断基于提取的、引用 DSE 操作的错误字符串。 **步骤 3 — 加载自定义驱动程序:** 加载一个带有 WDK 测试证书的驱动程序。在 `testsigning` 已禁用(通过 bcdedit 确认)的系统上,此类证书通常会阻止加载。其存在构成了先前 DSE 绕过的间接证据。 **步骤 4 — 清理:** 从磁盘中删除易受攻击的驱动文件。注册表中的服务条目被设置为 DISABLED。 *精确的驱动名称、IOCTL 代码和内核地址已省略。* ## 6. 自定义驱动程序样本 ### 6.1 Authenticode 签名 自定义的 `.sys` 文件带有以下签名(摘要): ``` Type de certificat : WDK Test Certificate (usage développement uniquement) Common Name : "WDKTestCert [pseudonyme], [numéro de série]" ``` WDKTestCert 是自签名的,使用 Windows Driver Kit 在本地生成。它仅用于开发。Windows 会拒绝带有此类证书的驱动程序,除非系统处于测试签名模式或 DSE 已被绕过。Common Name 字段包含一个开发者化名——这是一个操作安全失误,构成归属指标。 ### 6.2 VirusTotal 结果 提交到 VirusTotal 的 SHA-256 哈希值:**提交时 72 个引擎中 0 个检测到**。 这是一个单一的观察点。它并不意味永久性的规避能力,并且检测率可能会随着通知相关厂商后发生变化。 *此公开文档中省略了哈希值。* ## 7. 物理内存访问 ### 7.1 背景 该二进制文件似乎针对一个受商业反作弊解决方案保护的进程,该解决方案主要运行在用户态,监控标准的内存访问 Windows API。 ### 7.2 观察到的指标 从转储中提取的以下字符串暗示了物理内存访问技术。**这些未通过运行时直接观察得到确认。** ``` [DRIVER] BruteforceCR3: FOUND CR3=0x%llX [DRIVER] ReadFunc: MmMapIoSpaceEx PsGetProcessSectionBaseAddress ``` **CR3 寄存器:** 在 x86-64 架构中,CR3 寄存器包含活动进程页目录的物理基地址。枚举 CR3 值是一种已知技术,用于定位目标进程的物理内存空间,而无需使用受监控的虚拟内存 API。 **MmMapIoSpaceEx:** Windows 内核 API,将物理地址范围映射到虚拟地址空间,通常用于硬件访问。结合 CR3 枚举方法,其使用与安全研究文献中记录的物理内存读取技术一致。 **PsGetProcessSectionBaseAddress:** 返回进程可执行映像的基地址,用于定位内存中的目标进程。 ### 7.3 评估 如果按照提取字符串所暗示的方式实现,该方法将完全在内核模式下运行,并且不会产生被观察到的反作弊解决方案所监控的用户态 API 调用。然而,**这未通过运行时直接观察得到确认。** ## 8. 归属指标 未进行主动调查(OSINT、账户枚举)。识别出两个被动指标: | 指标类型 | 观察结果 | |---|---| | 二进制文件中的 PDB 路径 | 化名 A:“GDRVLoader” 组件在个人台式机上编译 | | Authenticode Common Name | 化名 B:由驱动开发者生成的 WDK 测试证书 | 暗示了两人开发,尽管不能排除单一开发者使用多个化名的可能性。 *完整化名保留在私有披露报告中。* ## 9. 分析局限性 - **执行不完整。** 许可证验证阻止了完整执行。驱动加载和物理内存访问未直接观察到。第 5 节和第 7 节的结论是推断。 - **内存覆盖不完整。** 转储仅覆盖 PE 段。堆和栈未捕获。 - **缺少内核调试。** 驱动行为是根据提取的字符串推断的,而非观察到的执行。 - **单一样本,单次执行。** 行为可能因系统版本或配置而异。 - **VirusTotal 快照。** 检测率反映的是特定时间点的情况。 ## 10. 发现总结 | 发现 | 置信度 | 依据 | |---|---|---| | VMProtect 混淆 | 高 | 静态分析 | | 多层反调试 | 高 | 动态观察 | | 内存转储 — 21 MB,23,700+ 个字符串 | 高 | 直接人工产物 | | 识别的 C2 域名 | 高 | DNS 缓存 | | %TEMP% 中的 .sys 文件 | 高 | 文件系统 | | 注册表中的内核驱动服务 | 高 | 注册表 | | 带有开发者化名的 WDKTestCert | 高 | Authenticode 签名 | | 提交时 VirusTotal 0/72 | 高 | VirusTotal 报告 | | DSE 绕过 | 中 | 间接 — testsigning=No + 加载了 WDKTestCert | | BYOVD 链 | 中 | 字符串人工产物 + 注册表 | | 物理内存访问 | 中 | 仅字符串人工产物 — 运行时未确认 | | 两名开发者归属 | 低-中 | PDB 路径 + 证书 CN | ## 11. 负责任的披露 相关发现已通知相关厂商,包括此处省略的完整技术指标。已通知反病毒厂商创建检测签名。 ## 参考 - LOLDrivers 项目 — loldrivers.io — 易受攻击的驱动程序数据库 - MITRE ATT&CK:T1014(Rootkit)、T1068、T1562.001 - Microsoft — 驱动签名强制文档、WDK 测试证书 - 关于通过 CR3/MmMapIoSpaceEx 进行物理内存读取的公开研究 *© 2026 Clovis Lagorce — lagorceclovis@gmail.com* *未经书面授权禁止转载。* *IDA Free · x64dbg · ScyllaHide · PowerShell · Python · VirusTotal*
标签:0day挖掘, AI合规, Ask搜索, BYOVD, Conpot, DAST, DSE绕过, Easy Anti-Cheat, IDA Free, IPv6, PowerShell, Python, responsible disclosure, ScyllaHide, VirusTotal, VMProtect, Web报告查看器, Windows安全, 内核安全, 内核零日, 内核驱动加载, 反作弊绕过, 反调试绕过, 合规性检查, 恶意软件分析, 情报收集, 无后门, 漏洞研究, 物理内存访问, 用户态绕过, 逆向工具, 驱动签名强制