# 高级取证与实验后端设计

## 目标

本设计补齐以下能力，同时保持 KSword 的 R0/R3 分层、唯一共享协议、显式风险信息和可审计修改原则：

- 未挂载 NTFS、FAT12、FAT16、FAT32、exFAT 的原始浏览、读取、导出与命名数据流取证。
- 原始文件字节 PE 分析，以及内核地址和 PE 入口点反汇编。
- 基于可信磁盘映像的 FSD 与 IDT 预期基线。
- AHCI、NVMe、IDE 控制器级取证读写。
- 常驻多核 VMM 与 EPT 规则/事件，以及明确标记为部分实现的 nested VMX、shadow EPT 和 Hyper-V eVMCS 研究状态。
- 任意内核字节修改、直接磁盘写入和可关闭的重复模态确认。

危险操作不因风险而永久禁用。界面必须持续说明风险，R0 必须执行目标边界、代际、确认令牌和策略校验，修改路径必须保存前后证据与可用的恢复信息。

## 危险确认策略

重复危险操作模态框的策略不放在设置页。入口位于现有内核表项的多级操作链：
`右键菜单 → 高级分析 → 指令视图 → 字节事务 → 确认策略`。该策略只影响 R3 弹窗，不影响：

- 驱动确认令牌与调用权限。
- SafetyPolicy 和目标级预检。
- 修改前快照、目标代际和 compare-before-write。
- 写后读取验证、FUA/flush 和错误状态。
- 调用目标、前后哈希、结果及恢复信息审计。
- 功能页持续显示的数据损坏、无法启动、掉盘、蓝屏和不可恢复风险。

用户关闭重复确认后，操作入口仍须在状态区和日志中记录“确认已由持久策略跳过”，不得静默执行。每项底层能力也只从其所属页面的多级二级菜单进入，不建立设置页、主页、顶层页签或顶层按钮入口。

## 未挂载 Windows 文件系统

原始文件系统解析器使用有边界的字节读取接口，而不是依赖盘符或已挂载卷句柄。读取接口必须携带：

- 物理磁盘编号和后端。
- 分区起始偏移、分区长度和逻辑扇区大小。
- 所有整数运算的溢出检查。
- 单次读取、目录项、簇链和 MFT 记录上限。

NTFS 解析必须处理 USA fixup、属性列表、稀疏 data run、压缩/加密不可恢复状态、重解析点和命名 `$DATA` 流。FAT 系列和 exFAT 必须检测簇链环、越界簇、无效目录长度和损坏 LFN/文件名项。

参考：

- [FSCTL_GET_NTFS_FILE_RECORD](https://learn.microsoft.com/windows/win32/api/winioctl/ni-winioctl-fsctl_get_ntfs_file_record)
- [FSCTL_GET_NTFS_VOLUME_DATA reply](https://learn.microsoft.com/openspecs/windows_protocols/ms-fscc/a5bae3a3-9025-4f07-b70d-e2247b01faa6)
- [CreateFile direct-access storage handles](https://learn.microsoft.com/windows/win32/api/fileapi/nf-fileapi-createfilew)

## PE 与反汇编

PE 分析核心同时提供路径入口和只读字节入口。字节入口必须在解析每个 RVA、目录、节区和字符串前验证文件范围，路径入口仅负责读取文件并调用同一解析器。

反汇编组件与数据源解耦：

- 内核地址由 `ArkDriverClient` 分块读取。
- 原始 PE 使用 RVA 到文件偏移映射。
- 输出包含地址、机器码、助记符、操作数、模块名、模块偏移和符号提示。
- 修改动作以读取快照创建 mutation transaction，提交前复核原字节，提交后再次读取。1–64 字节活体内核补丁不是硬件原子 CAS，其他处理器仍可能并发执行或修改目标；该风险必须常驻显示。

解码器采用固定发布版本并保留第三方许可证。不得依赖未固定的主分支 ABI。

参考：

- [Microsoft PE/COFF format](https://learn.microsoft.com/windows/win32/debug/pe-format)
- [Zydis stable project and API policy](https://github.com/zyantific/zydis)

## 可信映像基线

可信基线由 R3 完成文件身份、签名、哈希、PE 映射和重定位，再把有界预期记录交给 R0 与实时状态比较。R0 不自行打开任意用户路径。

FSD 基线覆盖 MajorFunction、FastIoDispatch 和选定函数前导字节。IDT 基线只覆盖能够稳定绑定到已验证 ntos 映像和明确符号/配置项的向量。证据必须区分：

- 当前指针超出模块。
- 当前指针仍在模块内但偏离可信预期 RVA。
- 指针一致但函数前导字节不同。
- 映像身份、签名、哈希或重定位证据不足。
- 当前系统版本没有可靠预期值。

基线默认只读，不自动恢复。修改仍通过现有 mutation/restore 路径执行。

## 控制器级磁盘访问

Windows 存储设备栈由 class、port 和 miniport/function driver 共同拥有。真正的 MMIO/DMA 控制器后端不能把“向最底层 DeviceObject 发送 IRP”标记为控制器直通。

实现分为两种模式：

1. **独占控制器模式**：可选控制器 function/miniport 驱动拥有 PnP 分配的 translated resources、BAR、DMA adapter、队列和中断。仅用于显式重新绑定的非启动专用控制器。
2. **共享 live 研究模式**：允许强制访问正在由系统存储驱动拥有的控制器，但必须报告 ownership=shared、coherency=unprovable、recovery=not-guaranteed。该模式不能宣称可靠，也不能静默回退。

AHCI 后端拥有自己的 command list、received FIS 和 PRDT common buffers；NVMe 后端拥有自己的 Admin/IO SQ/CQ 与 PRP/SGL；IDE 后端只在独占模式执行带超时的 48-bit LBA PIO。所有后端必须提供取消、超时、flush/FUA、写后读取验证和控制器错误证据。

参考：

- [Windows storage port drivers](https://learn.microsoft.com/windows-hardware/drivers/storage/storage-port-drivers)
- [Windows storage drivers and device objects](https://learn.microsoft.com/windows-hardware/drivers/storage/storage-drivers-and-device-objects)
- [AHCI 1.3.1 specification](https://www.intel.com/content/www/us/en/io/serial-ata/serial-ata-ahci-spec-rev1-3-1.html)
- [NVMe Base Specification](https://nvmexpress.org/specifications/)

## 常驻 VMM 与 EPT

常驻 VMM 的研究代码为每逻辑处理器准备独立的 VMXON、VMCS、host stack 和退出遥测，全核启动与停止使用 processor-group aware rendezvous；VM-exit 路径必须位于 nonpaged 内存，禁止等待、分页分配或调用可能阻塞的 OS API。但是当前驱动可卸载且尚未接管 S3、S4、Modern Standby 以及映像卸载前的全 CPU 去虚拟化，因此公开的 `START_RESIDENT` 必须在分配宿主栈或改变 VMX 状态前返回 unsupported，查询也不得发布 resident/multicore active 能力。关闭 UI 危险确认不解除这个驱动硬门控。

当前 VM-exit 分发覆盖 CPUID、私有 VMCALL、EPT violation、monitor-trap 和受限的 nested VMX 指令状态机；其它退出保留证据后执行去虚拟化并 fail closed。它不能被描述为已经覆盖 MSR、CR、XSETBV、RDTSC/RDTSCP、APIC、中断注入或完整设备虚拟化的通用 VMM。

EPT identity map 的上界来自 `CPUID.80000008:EAX[7:0]` 的 MAXPHYADDR，并受当前 8 TiB 页表预算限制；映射覆盖 `[0, min(MAXPHYADDR, 8 TiB))`，RAM 叶按 MTRR 定型，固件、PCI/ReBAR MMIO 与其它物理空洞保守使用 UC。架构物理地址空间超过 8 TiB 时必须发布 `EPT_TRUNCATED`，常驻启动不得使用该截断视图。

EPT R/W/X 规则是取证 tripwire，不是可靠访问控制。严格规则命中时只记录证据并去虚拟化，不注入 `#PF`、`#VE` 或其它异常；CPU 从同一来宾 RIP 返回原生执行后，原访问可能重试并成功，因此 UI 和协议不得称其为“阻断”。EPT 叶不允许 `R=0,W=1`，所以移除读取权限必须同时移除写入权限；CPU 不支持 execute-only EPT 时还必须移除执行权限。重叠规则聚合处理，任一严格规则优先于临时放行。临时放行只允许单 VCPU，并要求 monitor-trap 与 single-context INVEPT；MTF 或必要 INVEPT 失败必须去虚拟化。规则表和拆分页在任一驻留 CPU 活动时保持不可变，ADD/REMOVE/CLEAR 返回 busy，只有 QUERY 可并发读取。

事件环使用固定 nonpaged slot 与单次 CAS 的 `busy|sequence` 发布状态；VM-exit writer 遇到冲突或迟到覆盖时不等待、不自旋，而是丢弃本次发布并计数。reader 只接受前后 publication state 一致的完整快照。当前实现不宣称具备完整的 split 合并、双 EPT 视图或 VMM 自保护隔离。

参考：

- [Intel 64 and IA-32 Software Developer's Manuals](https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html)

## Nested VMX 与 eVMCS

Nested VMX 独立于“在已有 hypervisor 中运行一次 guest”。实现需要：

- 虚拟化 VMX capability MSR。
- VMXON、VMXOFF、VMPTRLD、VMCLEAR、VMREAD、VMWRITE、VMLAUNCH、VMRESUME、INVEPT、INVVPID 语义。
- `vmcs12` 状态、`vmcs01` 到 `vmcs02` 合并、L2 退出反射和事件注入。
- L1 EPT 与 L0 EPT 组合得到 shadow EPT，并正确处理失效。
- MSR/IO bitmap、TSC、APIC 和异常优先级合并。

Hyper-V eVMCS 只按 TLFS CPUID 能力和版本发现，不按 Windows build 猜测。当前后端只报告 capability/partial 状态：`vmcs12` 只保存有边界的研究字段，`vmcs02` 合并、L2 运行、L2 退出反射、可用 shadow EPT 及 VP assist page 所有权切换均未完成并会被拒绝。eVMCS v1 的发现和 clean-field 能力不得显示为 active。

参考：

- [Hyper-V TLFS](https://learn.microsoft.com/virtualization/hyper-v-on-windows/tlfs/tlfs)
- [Hyper-V nested virtualization interfaces](https://learn.microsoft.com/virtualization/hyper-v-on-windows/tlfs/nested-virtualization)
- [Hyper-V feature discovery](https://learn.microsoft.com/virtualization/hyper-v-on-windows/tlfs/feature-discovery)

## CI 验证

本地不执行构建、编译、链接或测试。CI 应分别验证：

- R3 x64 Release 和 i18n 审计。
- 主驱动 x64 Release 与 ARM64 非 VMX 条件编译。
- 可选控制器驱动 x64 Release、INF 验证和静态驱动检查。
- 协议结构大小、版本兼容和项目文件完整性。
- VMM/控制器功能只在专用虚拟机或实验硬件的显式工作流执行，普通 CI 仅验证构建与静态契约。
