
BYOVD-Forschungsanwendungsfälle mit Fokus auf der Erkennung verwundbarer Treiber und Reverse-Engineering-Methodik. (CVE-2025-52915, CVE-2025-1055, CVE-2026-3609, CVE-2026-8501).
BYOVD ist eine Sammlung von PoCs, die demonstrieren, wie verwundbare Treiber ausgenutzt werden können, um AV-/EDR-Lösungen zu deaktivieren.
Die Sammlung umfasst sowohl undokumentierte Treiber als auch solche, die bereits in LOLDDrivers oder den von Microsoft empfohlenen Treiber-Blockregeln abgedeckt sind.
Seit seiner ursprünglichen Entdeckung wurde der TfSysMon-Treiber zu LOLDrivers hinzugefügt und von Ransomware-Gruppen mithilfe des EDRKillShifter-Tools missbraucht, wie von Sophos und ESET berichtet.
Die BYOVD-Technik hat in der offensiven Sicherheit in letzter Zeit an Popularität gewonnen, insbesondere mit der Veröffentlichung von Tools wie SpyBoys Terminator (verkauft für 3.000 $) und dem ZeroMemoryEx Blackout-Projekt. Diese Tools nutzen verwundbare Treiber aus, um AV-/EDR-Agenten zu deaktivieren und so weitere Angriffe durch reduzierte Erkennung zu erleichtern.
Dieses Repository enthält mehrere PoCs, die zu Bildungszwecken entwickelt wurden und Forschern helfen zu verstehen, wie diese Treiber missbraucht werden können, um Prozesse zu beenden.
Das Projekt ist als Rust-Cargo-Workspace organisiert. Die meisten PoCs teilen sich eine gemeinsame Bibliothek (byovd-lib), die die Grundarbeit übernimmt: Treiberdienst-Lebenszyklus, IOCTL-Dispatch, Prozessüberwachung, Privilegienanpassung und Bereinigung. Jeder Killer ist ein schlankes Binärprogramm (~50–100 Zeilen), das nur seine treiberspezifische Konfiguration definiert. K7Terminator, Astra64-Killer, Ktapi-Killer und Xhunter1-Killer sind eigenständig – sie besitzen eigene [workspace]-Deklarationen und werden direkt aus ihren eigenen Verzeichnissen erstellt, nicht über den Root-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
Jedes `*-Killer/`-Verzeichnis enthält sein eigenes `Cargo.toml`, `src/main.rs` (die `DriverConfig`-Implementierung + CLI), `README.md` (Treiber-Hashes + Verwendung) sowie die passende `.sys`-Datei, die die Binärdatei zur Laufzeit lädt.
## 🔧 Erstellung
**Voraussetzungen:** Rust-Toolchain und Visual Studio Build Tools mit dem 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 werden in target/release/ ausgegeben. Kopieren Sie die entsprechende .sys-Treiberdatei in dasselbe Verzeichnis wie die ausführbare Datei, bevor Sie sie ausführen.
byovd-lib ist die gemeinsame Bibliothek, auf der alle PoCs (außer K7Terminator) aufgebaut sind. Sie stellt zwei komplementäre APIs bereit – eine deklarative High-Level-API für den Standardablauf „Treiber installieren, auf Sicht töten, aufräumen“ und eine imperative Low-Level-API für Killer, die einen benutzerdefinierten Ablauf benötigen (Anhängen an einen bereits geladenen Treiber, Verzweigen auf mehrere PIDs, strukturierte IOCTL-Puffer, benutzerdefinierte Wiederholungslogik usw.). Beide können in derselben Binärdatei gemischt werden.
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
### High-Level-API: `DriverConfig`-Trait + `run()`
Das verwenden die gebündelten Killer. Implementiere das Trait, rufe `byovd_lib::run()` auf, fertig.```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()
}
}