Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
DriverBuddyReloaded — Driver Buddy Reloaded는 Windows 커널 드라이버 리버스 엔지니어링 작업 중 일부 지루한 부분을 자동화하는 데 도움을 주는 IDA Pro Python 플러그인입니다. | Kitploit
도구/GitHubGitHub/voidsec/driverbuddyreloaded
Static AnalysisVulnerability AnalysisReverse EngineeringDebuggersBinary Analysis
GitHubvoidsec/driverbuddyreloaded

DriverBuddyReloaded

Driver Buddy Reloaded는 Windows 커널 드라이버 리버스 엔지니어링 작업 중 일부 지루한 부분을 자동화하는 데 도움을 주는 IDA Pro Python 플러그인입니다.

저장소 보기
435591개월 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
웹사이트

Driver Buddy Reloaded

Driver Buddy Reloaded

Table of Contents

  • Driver Buddy Reloaded
    • Table of Contents
    • Installation
    • Quick Usage
      • Advanced Usage
    • About Driver Buddy Reloaded
      • Finding DispatchDeviceControl
      • Labelling WDM and WDF Structures
      • Finding and Decoding IOCTL Codes
      • Flagging Functions
      • Finding DeviceName
      • Dumping Pooltags
      • Heuristic Vulnerability Checks
    • Feature Flags
    • Testing
    • Known Caveats and Limitations
    • Credits and Acknowledgements

Installation

설치 방법은 사용 중인 IDA 버전에 따라 다릅니다. 내장 플러그인 관리자(따라서 hcli 도구 및 ida-plugin.json 매니페스트)는 IDA 9.0 이상에서만 존재하기 때문입니다. IDA 7.6 및 8.x에는 플러그인 관리자가 없으며, 플러그인 폴더의 최상위 레벨만 스캔합니다.

IDA 9.0+ (plugin manager / hcli)

리포지토리에는 ida-plugin.json 매니페스트가 포함되어 있으므로, IDA 9.0+는 자체 하위 디렉터리에서 플러그인을 로드합니다. 다음과 같이 설치하세요:``` hcli plugin install DriverBuddyReloaded

root@kitploit:~
이 플러그인을 사용자 플러그인 폴더의 하위 디렉터리(예: `%APPDATA%\Hex-Rays\IDA Pro\plugins\DriverBuddyReloaded\` 또는 `~/.idapro/plugins/DriverBuddyReloaded/`)에 넣되, `DriverBuddyReloaded.py` 진입점은 해당 하위 디렉터리 *안에* 유지합니다. 이것이 의도된 레이아웃입니다. IDA가 매니페스트를 읽고, 선언된 진입점을 하위 디렉터리에서 로드하며, `sys.path`에 하위 디렉터리를 추가하여 진입점이 형제 `DriverBuddyReloaded` 패키지를 임포트할 수 있게 합니다. `DriverBuddyReloaded.py`를 최상위로 이동할 **필요가 없습니다**.

`hcli plugin status`로 설치를 확인한 다음 IDA를 시작하고 플러그인이 `편집 -> 플러그인` 아래에 나타나는지 확인합니다(시작 시 Python 오류가 있는지 출력 창 확인).

로컬 체크아웃에서 테스트를 위해 설치하려면(예: 자체 변경 후) 저장소 루트에서 `hcli plugin install .`을 실행합니다. `hcli plugin lint .`는 먼저 매니페스트/레이아웃의 유효성을 검사합니다.

### IDA 7.6 / 8.x (수동 복사)

이 버전에는 플러그인 관리자가 없으므로 `hcli`로 설치된 하위 디렉터리 플러그인은 인식되지 **않습니다**. `DriverBuddyReloaded` 폴더와 `DriverBuddyReloaded.py` 스크립트 파일을 IDA 플러그인 폴더의 **최상위**에 직접 복사합니다. 예:
- `%APPDATA%\Hex-Rays\IDA Pro\plugins\`
- `C:\Program Files\IDA Pro 8.4\plugins\`
- `~/.idapro/plugins/`

결과 레이아웃은 `plugins\DriverBuddyReloaded.py`와 `plugins\DriverBuddyReloaded\`(패키지 폴더)가 함께 있는 것입니다.

### 참고 사항

IDA가 Python 2로 구성된 경우, `idapyswitch` 바이너리(IDA 폴더에 있음)를 실행하여 Python 3으로 전환하세요.

**참고:** Driver Buddy Reloaded는 Python 3과 함께 IDA 7.6+, 8.x(8.4 포함) 및 9.0+에서 실행됩니다. 모든 버전별 IDA API 차이점(IDA 9.0에서 `get_inf_structure` 제거, `ida_struct` 모듈 및 `idc.*struc*` 헬퍼 제거 등)은 `DriverBuddyReloaded/ida_compat.py` 호환성 계층에서 내부적으로 처리됩니다.

## 빠른 사용법

자동 분석 기능을 사용하려면:

1. IDA를 시작하고 Windows 커널 드라이버를 로드합니다.
2. `편집 -> 플러그인 -> Driver Buddy Reloaded`로 이동하거나 `CTRL+ALT+A`를 눌러 자동 분석을 시작합니다.
3. "출력" 창에서 분석 결과를 확인하고, 실행 종료 시 열리는 **Driver Buddy Reloaded - Findings** 창을 확인합니다(행을 더블클릭하면 해당 주소로 이동합니다).
4. IDA의 DB 디렉터리 아래에 다음 파일들이 기록됩니다(모두 `<DRIVER_NAME>-YYYY-MM-DD-TIMESTAMP-` 접두사):
   - `findings.json` - 기계 판독 가능한 결과(IOCTL, 플래그된 함수, 장치 이름, 풀 태그, 호출 체인, 휴리스틱, 장치 ACL 감사, 심볼릭 링크, 내보내기 감사, 특권 명령어)
   - `report.html` - 독립 실행형, 심각도별로 그룹화된 HTML 보고서
   - `pooltags.txt` - WinDbg용 `pooltags.txt` 형식으로 덤프된 풀 태그
   - `autoanalysis.txt` - 전체 텍스트 분석 로그(출력 창 미러)

IOCTL을 디코딩하려면:

1. 의심되는 IOCTL 코드가 있는 줄에 마우스 커서를 놓습니다.
2. 마우스 오른쪽 버튼을 클릭하고 `Driver Buddy Reloaded -> Decode IOCTL`을 선택하거나 `CTRL+ALT+D` 단축키를 누릅니다.

분석을 다시 실행하지 않고도 언제든지 IOCTL 창이나 결과 창을 다시 열려면:

- `CTRL+ALT+I`를 누르면 IOCTL 창이 열립니다.
- `CTRL+ALT+F`를 누르면 결과 창이 열립니다.

### 고급 사용법

- [vulnerable_function_lists](https://github.com/voidsec/driverbuddyreloaded/blob/HEAD/DriverBuddyReloaded/vulnerable_functions_lists) 디렉터리에는 잠재적으로 위험한/문제가 있는 함수, Windows API 및 명령어 목록이 포함되어 있으며, 특정 함수/API가 나열된 이유에 대한 간단한 설명이 제공됩니다. `custom` 목록을 편집하여 드라이버별 함수를 포함할 수 있습니다.
  
  **참고**: `winapi_function_prefixes`는 함수 이름의 시작 부분과 부분 일치합니다(예: `Zw`는 `ZwClose`, `ZwCommitComplete` 등과 일치). 반면 `winapi_functions`는 정확히 일치하는 경우만 수행합니다.
- [find_opcodes.py](https://github.com/voidsec/driverbuddyreloaded/blob/HEAD/DriverBuddyReloaded/find_opcodes.py)에서 `find_opcode_data` 옵션(기본값 `False`)은 데이터 섹션에 있는 명령어 일치를 억제합니다([issue #11](https://github.com/VoidSec/DriverBuddyReloaded/issues/11)). `True`로 전환하면 데이터의 원시 바이트 일치도 표시됩니다. 이 방법으로 실제 명령어가 누락된 경우 보고된 주소로 이동하여 해당 바이트를 코드로 재정의하면 일반적으로 복구됩니다. 일치는 다른 단계와 마찬가지로 보고됩니다(결과 창, `findings.json`, `report.html`).
  
  **주의**: `True`로 전환하면 더 많은 오탐지가 발생합니다!

## Driver Buddy Reloaded 소개

**Driver Buddy Reloaded**는 IDA Pro Python 플러그인으로, Windows 커널 드라이버 리버스 엔지니어링 작업 중 일부 지루한 작업을 자동화하는 데 도움을 줍니다. 다음과 같은 여러 유용한 기능이 있습니다.

* 드라이버 유형 식별 (WDM, KMDF, UMDF, WDF, 미니필터, 스트림 미니드라이버, AVStream, PortCls)
* **모든** 드라이버 유형에 대한 `DispatchDeviceControl` / `DispatchInternalDeviceControl` 함수 찾기
  (`MajorFunction[IRP_MJ_DEVICE_CONTROL]` 저장소 스캔은 미니필터/WDF 드라이버에서도 핸들러를 찾고, 할당이 `DriverEntry` 대신 헬퍼에 있는 경우에도 찾습니다.)
* `WDF` 및 `WDM` 드라이버에 대한 공통 구조체 채우기
    * `IRP` 및 `IO_STACK_LOCATION`과 같은 구조체 식별 및 레이블링 시도
    * 일반적으로 레이블이 지정되지 않을 `WDF` 함수 호출에 레이블 지정
    * `IRP_MJ_FUNCTION` IDA 열거형을 생성하고 `DriverEntry`의 `MajorFunction` 배열 슬롯에 적용 (WDM)
* IOCTL 코드 찾기 및 디코딩
    * 식별된 디스패처 함수에 대한 자동 다중 전략 스캔 (커서 배치 불필요):
      디컴파일러 ctree (점프 테이블이나 이진 검색 디스패치로 숨겨진 코드를 복구하여 즉시 값으로 나타나지 않는 코드), IDA 스위치 테이블 복구, 원시 즉시 피연산자 폴백 (폴백은 실제로 IRP의 IoControlCode를 읽는 함수에서만 실행되므로 잘못 식별된 라이브러리 헬퍼가 내부 상수를 오탐지 IOCTL로 누출할 수 없음)
    * NTSTATUS 값이 IDA 타입 데이터베이스에서 동적으로 확인되고 (광범위한 하드코딩된 폴백 사용), 드라이버가 단순히 다운스트림으로 보내는 **출력** IOCTL (`IoBuildDeviceIoControlRequest` / `ZwDeviceIoControlFile` / ...)은 제외되어 드라이버 자체 공격 표면으로 오인되지 않음
* 오용되기 쉬운 함수 플래그 지정
* 잠재적 `DeviceName` 찾기 (mmap 스캔 + IDA 문자열 DB 폴백, 소스 주소 포함)
* `Pooltags` 덤프 (가져오기 기반 기본 + 레지스터 전파 폴백, 태그가 레지스터에 준비된 경우)
* 각 디스패처 및 해당 디스패처가 전이적으로 호출하는 함수에 대한 **휴리스틱 취약점 검사**: 검증되지 않은 사용자 복사, TOCTOU/이중 가져오기, 사용 후 해제 (함수 내 및 해제된 전역 변수를 통한 함수 간), 누락된 권한 게이트, IRQL 불일치, 안전하지 않은 MDL 매핑, 스택 할당 버퍼 (`_alloca`), 크기 검증 없는 풀 할당, 특권 CPU 명령어 (포트 I/O `in`/`out`, `mov cr*`), 임의 쓰기 (write-what-where), 및 `\Device\PhysicalMemory` 참조 (BYOVD 패턴) - [휴리스틱 취약점 검사](#heuristic-vulnerability-checks) 참조
* **장치 ACL 감사 및 심볼릭 링크 추적**: 보안 설명자 없이 생성된 `IoCreateDevice` 장치 (전역 접근 가능) / 약한 `IoCreateDeviceSecure` SDDL 플래그 지정, `IoCreateSymbolicLink` 대상 경로 디코딩
* **내보내기 감사**: 내부 교차 참조가 없는 드라이버 내보내기 플래그 지정 (잠재적 공격 표면)
* IOCTL별 **위험 점수** 디코딩 (`METHOD_NEITHER` / `FILE_ANY_ACCESS` 우선 순위 지정, 그리고 **자체** 케이스 핸들러에서 도달 가능한 위험한 싱크/명령어(`MmMapIoSpace`, `memcpy`, `__writemsr`, 포트 I/O, PCI-구성 액세스)에 대해서만 IOCTL 점수 상향 - 따라서 모놀리식 디스패처에서 양성 코드가 위험한 형제의 싱크로 인해 더 이상 타격을 받지 않으며, 귀속이 부정확한 경우 점수 상향은 강제로 CRITICAL이 아닌 제한됨), 모든 결과를 심각도별로 클릭 가능한 결과 창에 표시 (더블클릭하여 주소로 이동)
* 디스패치 / IOCTL 핸들러에서 위험한 싱크로의 **호출 체인 추적** (휴리스틱, 이름 기반)
* 결과를 기계 판독 가능한 **JSON** 파일 및 독립 실행형 **HTML** 보고서로 내보내기

![](https://assets.kitploit.com/production/public/readmes/5861/811a51641acd398e4a1ac0df3ea86575be806cdbd8e85397d07c07ef3b18974c.png)

### DispatchDeviceControl 찾기

이 도구는 자동으로 `DispatchDeviceControl` 루틴을 찾아 식별할 수 있습니다. 이 함수는 들어오는 모든 `DeviceIoControl` 코드를 해당 코드와 연결된 특정 드라이버 함수로 라우팅하는 데 사용됩니다. 이 함수를 자동으로 식별하면 각 드라이버에 대한 유효한 `DeviceIoControl` 코드를 훨씬 빠르게 찾을 수 있습니다. 또한 충돌로 인해 드라이버의 가능한 취약점을 조사할 때 이 함수의 위치를 알면 충돌하는 `DeviceIoControl` 코드와 관련된 특정 함수 호출에 초점을 좁히는 데 도움이 됩니다.

분석이 성공하면 일부 하위 함수는 다음과 같이 이름이 변경됩니다.

- `DriverEntry`: 드라이버가 로드된 후 호출되는 원래 첫 번째 드라이버 제공 루틴입니다. 드라이버 초기화를 담당합니다.
- `Real_Driver_Entry`: 일반적으로 `DriverEntry`에서 실행이 전송된 함수입니다. 일반적으로 `DeviceName`이 초기화되는 곳입니다.
- `DispatchDeviceControl`/`DispatchInternalDeviceControl`: 도구가 특정 오프셋에서 함수를 복구할 수 있는 경우 함수는 적절한 이름으로 이름이 변경됩니다.
- `Possible_DispatchDeviceControl_#`: 도구가 `DispatchDeviceControl` 또는 `DispatchInternalDeviceControl`을 복구할 수 없는 경우, 실험적 검색을 사용하여 실행 흐름을 따라가고 함수가 알려진 `IO_STACK_LOCATION` 및 `IRP` 주소를 로드하는 경우를 확인합니다. 이는 함수가 DispatchDeviceControl일 수 있음을 나타냅니다. 휴리스틱에 기반하므로 둘 이상의 결과를 반환할 수 있으며 오탐지가 발생하기 쉽습니다.

![](https://assets.kitploit.com/production/public/readmes/5861/6a79ef45d8df6c23fd5b67d0584787760336450a6e4d2f1f8a930cc953f0cff0.png)

### WDM 및 WDF 구조체 레이블링

여러 드라이버 구조체는 모든 `WDM`/`WDF` 드라이버 간에 공유됩니다. 이 도구는 `IO_STACK_LOCATION`, `IRP`, `DeviceObject` 구조체와 같은 이러한 구조체를 자동으로 식별할 수 있으며, 리버스 엔지니어링 프로세스 중 시간을 절약하고 이러한 함수가 사용되는 드라이버 영역에 컨텍스트를 제공하는 데 도움이 될 수 있습니다.

![](https://assets.kitploit.com/production/public/readmes/5861/58daa36949a8ecfcbb6f0237cfd524c00d2dc65ed4c107eb3e0e381abbbb532b.png)

### IOCTL 코드 찾기 및 디코딩

드라이버를 리버싱하는 동안 분석의 일부로 IOCTL 코드를 만나는 것은 일반적입니다. 이러한 코드를 디코딩하면 유용한 정보가 드러나고 취약점이 존재할 가능성이 더 높은 드라이버의 특정 부분에 주의를 집중시킬 수 있습니다.

잠재적인 IOCTL 코드를 마우스 오른쪽 버튼으로 클릭하면 컨텍스트 메뉴 옵션이 표시되며(의심되는 IOCTL 코드가 포함된 줄에 커서가 있을 때 `Ctrl+Alt+D` 단축키를 사용할 수도 있음) 값을 디코딩하는 데 사용할 수 있습니다. 그러면 디코딩된 모든 IOCTL 코드가 포함된 표가 출력됩니다. 디스어셈블리 보기에서 디코딩된 IOCTL 코드를 마우스 오른쪽 버튼으로 클릭하면 잘못된 것으로 표시할 수 있습니다. 그러면 IOCTL이 아닌 주석은 그대로 유지됩니다.

- 디코딩된 IOCTL은 출력 창에 인쇄되고 심각도 색상으로 구분된 IOCTL 창에 나열됩니다. 자동 분석 후에는 `findings.json` / `report.html`에도 기록됩니다.

자동 분석은 추가로 식별된 디스패처 함수에 대한 다중 전략 스캔을 실행하여 수동 커서 배치 없이 IOCTL을 자동으로 검색합니다. 각 디스패처에 대해 Hex-Rays 디컴파일러(사용 가능한 경우)를 사용하여 재구성된 제어 흐름에서 직접 스위치-케이스 레이블과 `==`/`!=` 비교 상수를 읽고, IDA의 스위치 테이블 메타데이터로 폴백한 다음 원시 즉시 피연산자 스캔으로 폴백합니다. 디컴파일러 경로는 디스어셈블리에 그대로 표시되지 않는 코드를 복구합니다. 예를 들어 컴파일러가 점프 테이블(즉시 값으로 테이블 기본/경계만 남음) 또는 이진 검색 비교 트리(중간 코드는 델타로만 남음)로 내보낸 디스패처가 있는 드라이버가 있습니다. 대표적인 코퍼스에서 이는 HEVD의 경우 7/28에서 28/28로, ALSysIO64의 경우 4/17에서 17/17로 복구율을 높였으며 오탐지는 없었습니다.

![](https://assets.kitploit.com/production/public/readmes/5861/2b0e646ecef812022e0bf79bd327aaa3fc63c93223620209a7ca63e247fa53b4.png)
![](https://assets.kitploit.com/production/public/readmes/5861/cc36d0572feb45c7e104f6f4f1ab1190d347b3956b0c00c509cde9562f850ef5.png)

### 함수 플래그 지정

Driver Buddy Reloaded에는 일반적으로 취약하거나 버퍼 오버플로 조건을 촉진할 수 있는 C/C++ 함수, 명령어 및 Windows API 목록([vulnerable_function_lists](https://github.com/voidsec/driverbuddyreloaded/blob/HEAD/DriverBuddyReloaded/vulnerable_functions_lists) 디렉터리 정의)이 있습니다. 발견된 모든 인스턴스는 자동 분석 중에 다시 보고되며, 사용자 제어 가능한 코드 경로가 민감한 함수에 도달하는지 찾는 데 도움이 될 수 있습니다.

![](https://assets.kitploit.com/production/public/readmes/5861/4bf753eb0e33c5e3260f2da9710d4d33948ebaf55eb7cf2dcb795758fcd4f527.png)

### DeviceName 찾기

도구는 자동으로 드라이버에 등록된 장치 경로(`DeviceName`)를 찾으려고 시도합니다. 바이너리 내부의 유니코드 문자열을 확인하여 경로를 찾을 수 없는 경우 분석가는 수동으로 Madiant의 [FLOSS](https://github.com/mandiant/flare-floss/)를 사용하여 난독화된 경로를 찾으려고 시도할 수 있습니다.

![](https://assets.kitploit.com/production/public/readmes/5861/0023b8dc5328ce292a3b35d276e48c96607dfb3fbbb852aac406382e25eeeef3.png)

### Pooltags 덤프

자동 분석 중에 도구는 `pooltags.txt` 형식으로 작동하는 형식으로 바이너리에서 사용되는 `Pooltags`를 덤프합니다. 출력은 파일 끝에 복사하여 붙여넣은 후 WinDbg에서 선택할 수 있습니다.

- `DriverName.sys-DATE-TIME_STAMP-pooltags.txt` 파일(덤프된 모든 Pooltags 포함)이 IDA의 DB 디렉터리 아래에 기록됩니다.

![](https://assets.kitploit.com/production/public/readmes/5861/f4de5449cc1ddb5f762bfe28d06c05aae42a9c01220033fbcf906de0ad039132.png)

### 휴리스틱 취약점 검사

`heuristics.py` 모듈은 호출 체인 추적 후에 실행되며 각 디스패처 **및 해당 디스패처가 전이적으로 호출하는 함수**를 검사합니다. 따라서 IOCTL별 핸들러(디스패처 프롤로그뿐만 아니라)가 분석됩니다. 호출된 함수 매칭은 가져오기 인식입니다(가져온 `call cs:__imp_<Name>`은 로컬 호출과 동일한 이름과 일치). **휴리스틱** 범주에서 결과를 내보냅니다(특권 명령어 결과는 **opcode** 범주 사용).

| 검사 | 플래그가 지정되는 항목 | 심각도 |
|---|---|---|
| 검증되지 않은 사용자 복사 | `memcpy`/`RtlCopyMemory`/등. 주변에 `ProbeForRead`/`ProbeForWrite`/안전 문자열 가드 없음 | HIGH (핸들러), MEDIUM (기타) |
| TOCTOU / 이중 가져오기 | 사용자 모드 포인터 필드가 중간에 `ProbeForRead` 없이 한 제어 흐름 경로에서 다시 읽힘 (`METHOD_NEITHER` 핸들러에서만, 따라서 커널 버퍼 재읽기는 플래그되지 않음) | MEDIUM |
| 사용 후 해제 | 해제된 포인터가 함수 내에서 재사용됨(레지스터 CFG 워크), 또는 전역 변수가 null로 설정되지 않고 해제된 후 다른 함수에서 역참조됨 | HIGH |
| 누락된 권한 게이트 | 경로의 어느 곳에서도 `SeAccessCheck`/`SeSinglePrivilegeCheck`/토큰 검사 없이 디스패처에서 민감한 op(`ZwOpenProcess`/`MmMapIoSpace`/PCI-구성/등.)에 도달 가능 | HIGH |
| IRQL 불일치 | IRQL을 높이는 함수도 있을 때 페이지 가능 / `Zw*` / `MmMap*` 호출 | MEDIUM |
| 안전하지 않은 MDL 매핑 | 디스어셈블리에 `UserMode`가 있는 `MmMapLockedPages`/`MmProbeAndLockPages`/등. | HIGH, 그 외 MEDIUM |
| 스택 할당 | `_alloca`/`_malloca`/`_chkstk` 호출 (대용량 또는 동적 스택 할당) | LOW |
| 크기 검증 없는 풀 할당 | 근처에 안전한 산술 가드 없이 `ExAllocatePool*` 호출 (할당 전 정수 오버플로 패턴) | HIGH |
| 특권 명령어 | 핸들러에서 도달 가능한 포트 I/O (`in`/`out`), 제어/디버그 레지스터 이동 (`mov cr*`/`mov dr*`), 디스크립터 테이블 로드, `cli`/`sti`/`hlt` (BYOVD 하드웨어 액세스 프리미티브) | CRITICAL (`out`) / HIGH (`in`) / MEDIUM |
| 임의 쓰기 (write-what-where) | 이중 역참조된 사용자 포인터 `*(*p) = c`를 통한 저장소; 제어된 복사 `*p = *q`는 약한 리드로 보고됨 | HIGH / MEDIUM |
| `\Device\PhysicalMemory` 참조 | 물리 메모리 장치 개체 문자열에 대한 교차 참조 (`ZwOpenSection`/`ZwMapViewOfSection`을 통한 BYOVD 패턴) | HIGH (핸들러), MEDIUM (기타) |

이것들은 **리드 생성기**일 뿐, 확인된 취약점이 아닙니다. HIGH/CRITICAL 결과는 수동 검토의 시작점으로 간주하세요.

## 기능 플래그

모든 선택적 분석 단계는 `DriverBuddyReloaded/config.py`에 의해 제어됩니다. `Feature` 클래스를 편집하여 활성화 또는 비활성화할 수 있습니다.

| 플래그 | 기본값 | 설명 |
|---|---|---|
| `IOCTL_SCAN` | `True` | IOCTL 검색 및 디코딩 (디스패처 스캔 + `IoControlCode` 폴백) |
| `IOCTL_DECOMPILER` | `True` | 디스패처 스캔에서 Hex-Rays ctree 사용 (점프 테이블 / 이진 검색 코드 복구) |
| `HEURISTICS` | `True` | 휴리스틱 취약점 검사 (위 표 참조) |
| `TOCTOU_CHECK` | `True` | 이중 가져오기 / TOCTOU 휴리스틱 |
| `UAF_DETECT` | `True` | 사용 후 해제 휴리스틱 (함수 내 레지스터 워크 + 함수 간 전역) |
| `ACL_AUDIT` | `True` | 전역 접근 가능한 `IoCreateDevice` / 약한 `IoCreateDeviceSecure` SDDL 플래그 지정 |
| `SYMLINK_TRACK` | `True` | `IoCreateSymbolicLink` 대상 경로 디코딩 |
| `CALLCHAIN` | `True` | 핸들러에서 위험한 싱크로의 BFS 호출 체인 추적 |
| `EXPORTS_AUDIT` | `True` | 내부 교차 참조가 없는 드라이버 내보내기 플래그 지정 |
| `POOLTAG_FALLBACK` | `True` | 레지스터 전파 풀 태그 스캐너 (가져오기 기반 스캔에서 아무것도 찾지 못할 때 사용) |
| `IRP_MJ_ENUM` | `True` | `IRP_MJ_FUNCTION` IDA 열거형을 생성하고 `MajorFunction` 슬롯에 적용 (WDM 전용) |
| `RISK_SCORING` | `True` | IOCTL 위험 점수 (METHOD/ACCESS 가중치 + 핸들러별 싱크 상향) |
| `RESULTS_WINDOW` | `True` | 분석 후 Driver Buddy Reloaded 결과 창 표시 |
| `JSON_EXPORT` | `True` | `findings.json` 쓰기 |
| `HTML_REPORT` | `True` | `report.html` 쓰기 |
| `SEGMENT_OPCODE_SCAN` | `False` | 선형 세션 전체 명령어 스캔 (노이즈 많음, 기본적으로 꺼짐) |

## 테스트

세 가지 계층, 빠른 것부터 철저한 것까지:

- **순수 Python 회귀 테스트** (IDA 필요 없음) - 라이브 데이터베이스를 건드리지 않는 모든 로직을 다룹니다.  ```
  python tests/test_dbr.py
  DBR_SDK=900 python tests/test_dbr.py   # simulate the IDA 9.0 import paths
  • 교차 버전 스모크 테스트 - IDA 7.6 SP1, 8.4 및 Free 9.3에서 실제 .sys 파일 매트릭스에 대해 전체 파이프라인을 실행하고 통과/실패 테이블을 출력합니다: pwsh tests/run_cross_version.ps1.
  • Golden 출력 회귀 테스트 (거짓 양성/거짓 음성 방지) - pwsh tests/run_golden.ps1은 tests/drivers/에 있는 각 참조 드라이버의 원본 복사본에 대해 전체 분석을 다시 실행하고, 결과를 커밋된 tests/drivers/<driver>.golden.json 기준선과 비교합니다 (카테고리, 제목, 심각도, IOCTL 코드/메서드/액세스에 대해 순서에 민감하지 않음). 추가된 결과(거짓 양성), 누락된 결과(거짓 음성) 또는 심각도 변경이 발생하면 실행이 실패합니다. 변경 사항이 의도적으로 결과를 변경하는 경우에만 Golden을 재생성하고 diff를 검토하십시오. Golden은 캡처된 IDA 디컴파일러 빌드(8.4)에 연결되어 있으므로 해당 버전으로 회귀 테스트를 실행하십시오.

알려진 주의사항 및 제한사항

  • IOCTL 후보는 _is_valid_ctl_code()에 의해 CTL_CODE 구조에 대해 검증됩니다: DeviceType 필드(비트 31-16)는 0이 아니어야 하며, 값이 알려진 NTSTATUS 코드나 0xFFFFFFFF (DWORD)-1 센티넬(예: WinRing0의 실제 디스패처 내부에서 보이는 비교 상수)과 일치하지 않아야 합니다. 이는 루프 카운터, 작은 즉시값 및 오류 코드를 배제하면서 공급업체 정의 장치 유형(0x8000+)을 포함한 모든 유효한 IOCTL을 보존합니다. 동일한 필터가 네 가지 검색 경로(IoControlCode xref 스캔과 세 가지 디스패처 수집기(디컴파일러 ctree, IDA 스위치 테이블 복구, 원시 즉시 피연산자 스캔)) 모두에 적용됩니다.
  • 위험 점수 및 호출 체인 추적은 휴리스틱, 이름 기반 리드 생성기이며 데이터 흐름 분석이 아닙니다. High/Critical 발견 사항은 확정된 취약점이 아닌 우선 확인할 지점으로 취급하십시오. 기능 토글은 DriverBuddyReloaded/config.py에 있습니다.
  • 실험적인 DispatchDeviceControl 검색은 x64 드라이버에서만 작동합니다.
  • find_opcodes.py에서 find_opcode_data 옵션(기본값 False)은 데이터 섹션에 있는 opcode 일치를 억제합니다. 이를 True로 전환하면 데이터의 원시 바이트 일치도 표시되지만 거짓 양성이 발생하기 쉽습니다. 실제 opcode가 누락된 경우 보고된 주소로 이동하여 바이트를 코드로 재정의하면 일반적으로 복구됩니다. 일치는 다른 모든 단계(결과 창, , )와 동일하게 보고됩니다.

크레딧 및 감사의 말

  • 2021년 Paolo Stagno / @Void_Sec에 의해 제작됨:
  • 위험 점수 및 보고 아이디어는 Juan Sacco의 Driver Buddy Revolutions에서 차용되었습니다.
  • DriverBuddy는 원래 NCC Group의 Braden Hollembaek과 Adam Pond가 작성했습니다.
  • Satoshi Tanda의 IOCTL 디코더 사용.
  • WDF 함수 구조체는 Red Plait의 작업을 기반으로 하며 Nicolas Guigo가 IDA Python으로 포팅했고, 이후 Braden Hollembaek과 Adam Pond가 업데이트했습니다.
  • Sam Brown의 F-Secure win_driver_plugin(특히 Alexander Pick의 포크)을 사용하여 장치 이름 및 풀 태그를 검색합니다.
  • 오른쪽 클릭 메뉴에 항목을 추가하는 원래 코드(및 기타 임의 코드 조각)는 'herrcore'에서 가져왔습니다.
  • JetBrains의 오픈 소스 개발을 위해 PyCharm을 사용하여 자랑스럽게 개발되었습니다.
도구 다운로드
findings.json
report.html