Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
DriverBuddyReloaded — Driver Buddy Reloaded ist ein IDA Pro Python-Plugin, das hilft, einige mühsame Reverse-Engineering-Aufgaben von Windows-Kernel-Treibern zu automatisieren. | Kitploit
Tools/GitHubGitHub/voidsec/driverbuddyreloaded
Statische AnalyseSchwachstellenanalyseReverse EngineeringDebuggerBinäranalyse
GitHubvoidsec/driverbuddyreloaded

DriverBuddyReloaded

Driver Buddy Reloaded ist ein IDA Pro Python-Plugin, das hilft, einige mühsame Reverse-Engineering-Aufgaben von Windows-Kernel-Treibern zu automatisieren.

Repository anzeigen
43559vor 1 MonatVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
Webseite

Driver Buddy Reloaded

Driver Buddy Reloaded

Inhaltsverzeichnis

  • Driver Buddy Reloaded
    • Inhaltsverzeichnis
    • Installation
    • Schnellstart
      • Erweiterte Nutzung
    • Über Driver Buddy Reloaded
      • DispatchDeviceControl finden
      • WDM- und WDF-Strukturen beschriften
      • IOCTL-Codes finden und entschlüsseln
      • Funktionen markieren
      • DeviceName finden
      • Pooltags ausgeben
      • Heuristische Schwachstellenprüfungen
    • Funktionsflags
    • Testen
    • Bekannte Einschränkungen und Fallstricke
    • Danksagungen und Anerkennungen

Installation

Die Installationsmethode hängt von Ihrer IDA-Version ab, da der integrierte Plugin-Manager (und damit das hcli-Tool und das ida-plugin.json Manifest) nur in IDA 9.0 und höher existiert. IDA 7.6 und 8.x haben keinen Plugin-Manager und durchsuchen nur die oberste Ebene des Plugin-Ordners.

IDA 9.0+ (Plugin-Manager / hcli)

Das Repository enthält ein ida-plugin.json Manifest, sodass IDA 9.0+ das Plugin aus seinem eigenen Unterverzeichnis lädt. Installieren Sie es mit:``` hcli plugin install DriverBuddyReloaded

root@kitploit:~
Dies legt das Plugin in ein Unterverzeichnis Ihres Benutzer-Plugins-Ordners (z.B.
`%APPDATA%\Hex-Rays\IDA Pro\plugins\DriverBuddyReloaded\` oder `~/.idapro/plugins/DriverBuddyReloaded/`), wobei der Einstiegspunkt `DriverBuddyReloaded.py` *innerhalb* dieses Unterverzeichnisses bleibt. Dies ist das beabsichtigte Layout: IDA liest das Manifest, lädt den deklarierten Einstiegspunkt aus dem Unterverzeichnis und fügt das Unterverzeichnis zu `sys.path` hinzu, sodass der Einstiegspunkt das benachbarte Paket `DriverBuddyReloaded` importieren kann. Sie müssen `DriverBuddyReloaded.py` **nicht** in die oberste Ebene verschieben.

Überprüfen Sie die Installation mit `hcli plugin status`, starten Sie dann IDA und bestätigen Sie, dass das Plugin unter `Edit -> Plugins` erscheint (überprüfen Sie das Ausgabefenster auf etwaige Python-Fehler beim Start).

Um aus einem lokalen Checkout zu Testzwecken zu installieren (z.B. nach eigenen Änderungen), führen Sie `hcli plugin install .` vom Repository-Stammverzeichnis aus; `hcli plugin lint .` validiert zuerst das Manifest/Layout.

### IDA 7.6 / 8.x (manuelles Kopieren)

Diese Versionen haben keinen Plugin-Manager, daher wird ein per `hcli` installiertes Unterverzeichnis-Plugin **nicht** erkannt. Kopieren Sie den Ordner `DriverBuddyReloaded` und die Skriptdatei `DriverBuddyReloaded.py` direkt in die **oberste Ebene** des IDA-Plugins-Ordners, zum Beispiel:
- `%APPDATA%\Hex-Rays\IDA Pro\plugins\`
- `C:\Program Files\IDA Pro 8.4\plugins\`
- `~/.idapro/plugins/`

Das resultierende Layout ist `plugins\DriverBuddyReloaded.py` zusammen mit `plugins\DriverBuddyReloaded\` (dem Paketordner).

### Hinweise

Wenn Ihre IDA für Python 2 konfiguriert ist, führen Sie die Binärdatei `idapyswitch` (im IDA-Ordner) aus, um auf Python 3 umzustellen.

**HINWEIS:** Driver Buddy Reloaded läuft auf IDA 7.6+, 8.x (einschließlich 8.4) und 9.0+ mit Python 3. Alle versionsspezifischen IDA-API-Unterschiede (die Entfernung von `get_inf_structure`, des `ida_struct`-Moduls und der `idc.*struc*`-Helfer in IDA 9.0 usw.) werden intern von der Kompatibilitätsschicht `DriverBuddyReloaded/ida_compat.py` behandelt.

## Kurzanleitung

So verwenden Sie die Autoanalyse-Funktion:

1. Starten Sie IDA und laden Sie einen Windows-Kernel-Treiber.
2. Gehen Sie zu `Edit -> Plugins -> Driver Buddy Reloaded` oder drücken Sie `CTRL+ALT+A`, um die Autoanalyse zu starten.
3. Überprüfen Sie das "Output"-Fenster auf die Analyseergebnisse und das **Driver Buddy Reloaded - Findings**-Fenster, das am Ende des Durchlaufs geöffnet wird (doppelklicken Sie auf eine Zeile, um zu ihrer Adresse zu springen).
4. Die folgenden Dateien werden im DB-Verzeichnis von IDA geschrieben (alle mit `<DRIVER_NAME>-YYYY-MM-DD-TIMESTAMP-` beginnend):
   - `findings.json` - maschinenlesbare Ergebnisse (IOCTLs, markierte Funktionen, Gerätenamen, Pooltags, Call-Chains, Heuristiken, Geräte-ACL-Prüfung, symbolische Links, Exports-Prüfung, privilegierte Opcodes)
   - `report.html` - ein eigenständiger, nach Schweregrad gruppierter HTML-Bericht
   - `pooltags.txt` - ausgegebene Pooltags im `pooltags.txt`-Format für WinDbg
   - `autoanalysis.txt` - das vollständige Textanalyseprotokoll (spiegelt das Ausgabefenster wider)

So decodieren Sie einen IOCTL:

1. Platzieren Sie den Mauszeiger auf der Zeile, die einen vermuteten IOCTL-Code enthält.
2. Klicken Sie mit der rechten Maustaste und wählen Sie `Driver Buddy Reloaded -> Decode IOCTL`; alternativ drücken Sie die Tastenkombination `CTRL+ALT+D`.

Um das IOCTLs-Fenster oder das Findings-Fenster jederzeit wieder zu öffnen (ohne die Analyse erneut auszuführen):

- Drücken Sie `CTRL+ALT+I`, um das IOCTLs-Fenster zu öffnen.
- Drücken Sie `CTRL+ALT+F`, um das Findings-Fenster zu öffnen.

### Erweiterte Nutzung

- Das Verzeichnis [vulnerable_function_lists](https://github.com/voidsec/driverbuddyreloaded/blob/HEAD/DriverBuddyReloaded/vulnerable_functions_lists) enthält Listen potenziell gefährlicher/problembehafteter Funktionen, Windows-APIs und Opcodes; eine kurze Beschreibung, warum eine bestimmte Funktion/API aufgelistet wurde, wird bereitgestellt. Sie können die `custom`-Liste bearbeiten, die treiberspezifische Funktionen enthalten kann.
  
  **Hinweis**: `winapi_function_prefixes` führt eine partielle Übereinstimmung am Anfang des Funktionsnamens durch (z.B. passt `Zw` auf `ZwClose`, `ZwCommitComplete` usw.), während `winapi_functions` nur exakte Übereinstimmungen durchführt.
- In [find_opcodes.py](https://github.com/voidsec/driverbuddyreloaded/blob/HEAD/DriverBuddyReloaded/find_opcodes.py) unterdrückt die Option `find_opcode_data` (Standard `False`) Opcode-Übereinstimmungen, die in Datenabschnitte fallen ([Issue #11](https://github.com/VoidSec/DriverBuddyReloaded/issues/11)). Wenn Sie sie auf `True` setzen, werden auch rohe Byte-Übereinstimmungen in Daten sichtbar; falls auf diese Weise ein echter Opcode übersehen wurde, kann er in der Regel wiederhergestellt werden, indem Sie zur gemeldeten Adresse gehen und die Bytes als Code neu definieren. Übereinstimmungen werden wie jede andere Stufe gemeldet (Ergebnisfenster, `findings.json`, `report.html`).
  
  **Achtung**: Wenn Sie es auf `True` setzen, werden mehr Fehlalarme generiert!

## Über Driver Buddy Reloaded

**Driver Buddy Reloaded** ist ein IDA Pro Python-Plugin, das hilft, einige mühsame Reverse-Engineering-Aufgaben für Windows-Kernel-Treiber zu automatisieren. Es bietet eine Reihe praktischer Funktionen, wie zum Beispiel:

* Identifizieren des Treibertyps (WDM, KMDF, UMDF, WDF, Mini-Filter, Stream Minidriver, AVStream, PortCls)
* Lokalisieren der `DispatchDeviceControl`- / `DispatchInternalDeviceControl`-Funktionen für **jeden** Treibertyp (ein `MajorFunction[IRP_MJ_DEVICE_CONTROL]`-Store-Scan findet den Handler selbst in einem Minifilter/WDF-Treiber, der auch ein Legacy-Steuergerät bereitstellt, und selbst wenn die Zuweisung in einem Helfer und nicht in `DriverEntry` lebt)
* Befüllen gemeinsamer Strukturen für `WDF`- und `WDM`-Treiber
    * Versucht, Strukturen wie die `IRP` und `IO_STACK_LOCATION` zu identifizieren und zu beschriften
    * Beschriftet Aufrufe von `WDF`-Funktionen, die normalerweise unbeschriftet wären
    * Erstellt einen IDA-Enum `IRP_MJ_FUNCTION` und wendet ihn auf die `MajorFunction`-Array-Slots in `DriverEntry` an (WDM)
* Finden und Decodieren von IOCTL-Codes
    * Automatischer Multi-Strategie-Scan identifizierter Dispatcher-Funktionen (keine Cursorplatzierung erforderlich): Decompiler ctree (stellt Codes wieder her, die durch Jump-Table- oder Binary-Search-Dispatch versteckt sind und nie als Immediates erscheinen), IDA-Switch-Table-Recovery und einen rohen Immediate-Operanden-Fallback (der Fallback läuft nur auf einer Funktion, die tatsächlich das IoControlCode des IRP liest, sodass ein falsch identifizierter Bibliothekshelfer seine internen Konstanten nicht als falsche IOCTLs durchsickern lassen kann)
    * NTSTATUS-Werte werden dynamisch aus der IDA-Typdatenbank aufgelöst (mit einem breiten hartcodierten Fallback), und **ausgehende** IOCTLs, die der Treiber lediglich nachgelagert sendet (`IoBuildDeviceIoControlRequest` / `ZwDeviceIoControlFile` / ...), werden ausgeschlossen, damit sie nicht mit der eigenen Angriffsfläche des Treibers verwechselt werden
* Markieren von Funktionen, die zu Fehlgebrauch neigen
* Finden potenzieller `DeviceName` (mmap-Scan + IDA Strings DB Fallback, mit Quelladresse)
* Ausgeben von `Pooltags` (importbasierter Primär-Scan + register-propagierter Fallback für Tags, die in einem Register zwischengespeichert sind)
* **Heuristische Sicherheitsprüfungen** für jeden Dispatcher und die von ihm transitiv aufgerufenen Funktionen: nicht validierte Benutzerkopie, TOCTOU/Double-Fetch, Use-After-Free (intra-funktional und cross-funktional über einen freigegebenen Globalen), fehlendes Privilegientor, IRQL-Konflikt, unsicheres MDL-Mapping, stack-allocierte Puffer (`_alloca`), Pool-Allokation ohne Größenvalidierung, privilegierte CPU-Anweisungen (Port-I/O `in`/`out`, `mov cr*`), beliebiges Schreiben (Write-What-Where) und `\Device\PhysicalMemory`-Referenzen (BYOVD-Muster) - siehe [Heuristische Sicherheitsprüfungen](#heuristic-vulnerability-checks)
* **Geräte-ACL-Prüfung und Symbolic-Link-Tracking**: markiert `IoCreateDevice`-Geräte, die ohne Sicherheitsdeskriptor (weltweit zugänglich) / mit schwachen `IoCreateDeviceSecure`-SDDLs erstellt wurden, und decodiert Zielpfade von `IoCreateSymbolicLink`
* **Exports-Prüfung**: markiert Treiber-Exporte ohne interne Cross-Referenzen (potenzielle Angriffsfläche)
* **Risikobewertung** decodierter IOCTLs pro IOCTL (Priorisierung von `METHOD_NEITHER` / `FILE_ANY_ACCESS`, und Erhöhung eines IOCTL nur für die gefährlichen Sinks/Opcodes, die von seinem **eigenen** Case-Handler erreichbar sind – `MmMapIoSpace`, `memcpy`, `__writemsr`, Port-I/O, PCI-Config-Zugriff – sodass ein harmloser Code in einem monolithischen Dispatcher nicht mehr mit den Sinks eines gefährlichen Geschwisterteils in Verbindung gebracht wird; wenn die Zuordnung ungenau ist, wird die Erhöhung gedeckelt und nicht auf KRITISCH erzwungen) und Präsentation aller Ergebnisse, nach Schweregrad, in einem anklickbaren Ergebnisfenster (Doppelklick, um zur Adresse zu springen)
* **Verfolgen von Call-Chains** von Dispatch-/IOCTL-Handlern zu gefährlichen Sinks (heuristisch, namensbasiert)
* Exportieren der Ergebnisse als maschinenlesbare **JSON**-Datei und einen eigenständigen **HTML**-Bericht

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

### Finden von DispatchDeviceControl

Das Tool kann die `DispatchDeviceControl`-Routine automatisch lokalisieren und identifizieren. Diese Funktion wird verwendet, um alle eingehenden `DeviceIoControl`-Codes an die spezifische Treiberfunktion weiterzuleiten, die mit diesem Code verbunden ist. Die automatische Identifizierung dieser Funktion macht das Finden der gültigen `DeviceIoControl`-Codes für jeden Treiber viel schneller. Darüber hinaus hilft die Kenntnis der Position dieser Funktion bei der Untersuchung möglicher Schwachstellen in einem Treiber aufgrund eines Absturzes, den Fokus auf den spezifischen Funktionsaufruf zu legen, der mit dem abstürzenden `DeviceIoControl`-Code verbunden ist.

Bei erfolgreicher Analyse werden einige Subs wie folgt umbenannt:

- `DriverEntry`: die ursprüngliche erste treiberbereitgestellte Routine, die nach dem Laden eines Treibers aufgerufen wird. Sie ist für die Initialisierung des Treibers verantwortlich.
- `Real_Driver_Entry`: normalerweise die Funktion, an die die Ausführung von `DriverEntry` übergeben wurde. Hier wird normalerweise der `DeviceName` initialisiert.
- `DispatchDeviceControl`/`DispatchInternalDeviceControl`: wenn das Tool in der Lage war, die Funktionen an bestimmten Offsets wiederherzustellen, werden die Funktionen dann mit dem entsprechenden Namen umbenannt.
- `Possible_DispatchDeviceControl_#`: wenn das Tool `DispatchDeviceControl` oder `DispatchInternalDeviceControl` nicht wiederherstellen konnte, verwendet es eine experimentelle Suche, die dem Ausführungsfluss folgt und nach Fällen sucht, in denen die Funktion bekannte `IO_STACK_LOCATION`- und `IRP`-Adressen lädt; dies deutet darauf hin, dass die Funktion der DispatchDeviceControl sein könnte. Da es auf Heuristiken basiert, kann es mehr als ein Ergebnis zurückgeben und ist anfällig für Fehlalarme.

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

### Beschriften von WDM- und WDF-Strukturen

Mehrere Treiberstrukturen werden von allen `WDM`/`WDF`-Treibern gemeinsam genutzt. Das Tool kann diese Strukturen automatisch identifizieren, wie z.B. die `IO_STACK_LOCATION`-, `IRP`- und `DeviceObject`-Strukturen, und kann helfen, Zeit während des Reverse-Engineering-Prozesses zu sparen und Kontext für Bereiche des Treibers zu liefern, in denen diese Funktionen verwendet werden.

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

### Finden und Decodieren von IOCTL-Codes

Beim Reverse-Engineering von Treibern ist es üblich, im Rahmen der Analyse auf IOCTL-Codes zu stoßen. Diese Codes geben, wenn sie decodiert werden, nützliche Informationen preis und können den Fokus auf bestimmte Teile des Treibers lenken, in denen Schwachstellen wahrscheinlicher sind.

Durch Rechtsklick auf einen potenziellen IOCTL-Code wird eine Kontextmenüoption angezeigt (alternativ mit der Tastenkombination `Ctrl+Alt+D`, wenn der Cursor auf der Zeile mit einem vermuteten IOCTL-Code steht), mit der der Wert decodiert werden kann. Dadurch wird eine Tabelle mit allen decodierten IOCTL-Codes ausgegeben. Durch Rechtsklick auf einen decodierten IOCTL-Code in der Disassembly-Ansicht kann er als ungültig markiert werden; dadurch bleiben alle Nicht-IOCTL-Kommentare erhalten.

- Die decodierten IOCTLs werden im Ausgabefenster ausgegeben und im farbcodierten IOCTLs-Fenster aufgelistet; nach der Autoanalyse werden sie auch in `findings.json` / `report.html` aufgezeichnet.

Die Autoanalyse führt zusätzlich einen Multi-Strategie-Scan über identifizierte Dispatcher-Funktionen durch, um IOCTLs automatisch zu entdecken, ohne dass eine manuelle Cursorplatzierung erforderlich ist. Für jeden Dispatcher verwendet es den Hex-Rays-Decompiler (wenn verfügbar), um Switch-Case-Labels und `==`-/`!=`-Vergleichskonstanten direkt aus dem rekonstruierten Kontrollfluss zu lesen, und fällt auf IDAs Switch-Table-Metadaten und dann auf einen rohen Immediate-Operanden-Scan zurück. Der Decompiler-Pfad stellt Codes wieder her, die nie wörtlich in der Disassembly erscheinen – z.B. Treiber, deren Dispatcher der Compiler als Sprungtabelle emittiert hat (nur die Tabellenbasis/-grenze überlebt als Immediates) oder als Binary-Search-Vergleichsbaum (Zwischencodes überleben nur als Deltas). In einem repräsentativen Korpus erhöhte dies die Wiederherstellung von 7/28 auf 28/28 (HEVD) und von 4/17 auf 17/17 (ALSysIO64) ohne Fehlalarme.

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

### Markieren von Funktionen

Driver Buddy Reloaded enthält Listen von C/C++-Funktionen, Opcodes und Windows-APIs (definiert im Verzeichnis [vulnerable_function_lists](https://github.com/voidsec/driverbuddyreloaded/blob/HEAD/DriverBuddyReloaded/vulnerable_functions_lists)), die häufig anfällig sind oder Pufferüberlaufbedingungen begünstigen können. Alle gefundenen Instanzen werden während der Autoanalyse gemeldet und können bei der Suche nach möglichen benutzergesteuerten Codepfaden helfen, die zu sensiblen Funktionen führen.

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

### Finden von DeviceName

Das Tool versucht automatisch, die registrierten Gerätepfade (`DeviceName`) des Treibers zu finden. Wenn keine Pfade durch Suchen nach Unicode-Strings innerhalb der Binärdatei gefunden werden können, kann der Analyst manuell versuchen, Madiants [FLOSS](https://github.com/mandiant/flare-floss/) zu verwenden, um obfuskierte Pfade zu finden.

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

### Ausgeben von Pooltags

Während der Autoanalyse gibt das Tool auch die von der Binärdatei verwendeten `Pooltags` in einem Format aus, das mit `pooltags.txt` funktioniert. Die Ausgabe kann dann am Ende der Datei kopiert und später von WinDbg übernommen werden.

- Eine Datei `DriverName.sys-DATE-TIME_STAMP-pooltags.txt`, die alle ausgegebenen Pooltags enthält, wird im DB-Verzeichnis von IDA geschrieben.

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

### Heuristische Sicherheitsprüfungen

Das Modul `heuristics.py` wird nach der Call-Chain-Verfolgung ausgeführt und untersucht jeden Dispatcher **und die von ihm transitiv aufgerufenen Funktionen** – es werden also die pro-IOCTL-Handler und nicht nur der Dispatcher-Prolog analysiert. Die Callee-Erkennung ist importbewusst (ein importierter `call cs:__imp_<Name>` stimmt mit demselben Namen wie ein lokaler Aufruf überein). Es gibt Ergebnisse in der Kategorie **heuristic** aus (Ergebnisse zu privilegierten Anweisungen verwenden die Kategorie **opcode**):

| Check | Was wird gemeldet | Schweregrad |
|---|---|---|
| Nicht validierte Benutzerkopie | `memcpy`/`RtlCopyMemory`/usw. ohne nahegelegene `ProbeForRead`/`ProbeForWrite`/Safe-String-Überprüfung | HOCH (Handler), MITTEL (andere) |
| TOCTOU / Double Fetch | erneutes Lesen eines Benutzermodus-Zeigerfelds auf einem Kontrollflusspfad ohne dazwischenliegende `ProbeForRead` (nur bei METHOD_NEITHER-Handlern, sodass Kernel-Puffer-Nachlesen nicht markiert werden) | MITTEL |
| Use-after-free | ein freigegebener Zeiger, der intra-funktional wiederverwendet wird (Register-CFG-Walk), oder ein globaler Zeiger, der freigegeben wurde, ohne auf Null gesetzt zu werden, und dann von einer anderen Funktion dereferenziert wird | HOCH |
| Fehlendes Privilegientor | eine sensible Operation (`ZwOpenProcess`/`MmMapIoSpace`/PCI-Konfiguration/usw.), die von einem Dispatcher erreichbar ist, ohne dass irgendwo auf dem Pfad eine `SeAccessCheck`/`SeSinglePrivilegeCheck`/Token-Überprüfung vorhanden ist | HOCH |
| IRQL-Konflikt | Aufruf von paginierbaren / `Zw*` / `MmMap*`-Funktionen, wenn auch eine IRQL-erhöhende Funktion vorhanden ist | MITTEL |
| Unsicheres MDL-Mapping | `MmMapLockedPages`/`MmProbeAndLockPages`/usw. mit `UserMode` in der Disassembly | HOCH, sonst MITTEL |
| Stack-Allokation | `_alloca`/`_malloca`/`_chkstk`-Aufruf (große oder dynamische Stack-Allokation) | NIEDRIG |
| Pool-Allokation ohne Größenvalidierung | `ExAllocatePool*`-Aufruf ohne nahegelegene sichere arithmetische Überprüfung (Integer-Überlauf-vor-Allokation-Muster) | HOCH |
| Privilegierte Anweisung | Port-I/O (`in`/`out`), Steuer-/Debug-Register-Verschiebung (`mov cr*`/`mov dr*`), Descriptor-Table-Load, `cli`/`sti`/`hlt` von einem Handler erreichbar (BYOVD-Hardwarezugriffs-Primitive) | KRITISCH (`out`) / HOCH (`in`) / MITTEL |
| Beliebiges Schreiben (Write-What-Where) | ein Speicherzugriff über einen doppelt dereferenzierten Benutzerzeiger `*(*p) = c`; eine kontrollierte Kopie `*p = *q` wird als schwächerer Hinweis gemeldet | HOCH / MITTEL |
| `\Device\PhysicalMemory`-Referenz | Cross-Referenz auf den Zeichenfolgenstring des physischen Speichergeräteobjekts (BYOVD-Muster über `ZwOpenSection`/`ZwMapViewOfSection`) | HOCH (Handler), MITTEL (andere) |

Dies sind **Hinweisgeneratoren**, keine bestätigten Schwachstellen. Behandeln Sie HOHE/KRITISCHE Ergebnisse als Ausgangspunkte für die manuelle Überprüfung.

## Feature-Flags

Alle optionalen Analysestufen werden durch `DriverBuddyReloaded/config.py` gesteuert. Bearbeiten Sie die Klasse `Feature`, um sie zu aktivieren oder zu deaktivieren:

| Flag | Standard | Beschreibung |
|---|---|---|
| `IOCTL_SCAN` | `True` | IOCTLs entdecken & decodieren (Dispatcher-Scan + `IoControlCode`-Fallback) |
| `IOCTL_DECOMPILER` | `True` | Hex-Rays ctree im Dispatcher-Scan verwenden (stellt Sprungtabellen-/Binary-Search-Codes wieder her) |
| `HEURISTICS` | `True` | Heuristische Sicherheitsprüfungen (siehe Tabelle oben) |
| `TOCTOU_CHECK` | `True` | Double-Fetch / TOCTOU-Heuristik |
| `UAF_DETECT` | `True` | Use-after-free-Heuristiken (intra-funktionaler Register-Walk + cross-funktionaler Globaler) |
| `ACL_AUDIT` | `True` | Markieren von weltweit zugänglichen `IoCreateDevice`-Geräten / schwachen `IoCreateDeviceSecure`-SDDLs |
| `SYMLINK_TRACK` | `True` | Decodieren von Zielpfaden von `IoCreateSymbolicLink` |
| `CALLCHAIN` | `True` | BFS-Call-Chain-Verfolgung von Handlern zu gefährlichen Sinks |
| `EXPORTS_AUDIT` | `True` | Markieren von Treiber-Exporten ohne interne Cross-Referenzen |
| `POOLTAG_FALLBACK` | `True` | Register-propagierter Pooltag-Scanner (verwendet, wenn der importbasierte Scan nichts findet) |
| `IRP_MJ_ENUM` | `True` | IDA-Enum `IRP_MJ_FUNCTION` erstellen und auf `MajorFunction`-Slots anwenden (nur WDM) |
| `RISK_SCORING` | `True` | IOCTL-Risikobewertung (METHOD/ACCESS-Gewichtungen + per-Handler-Sink-Erhöhung) |
| `RESULTS_WINDOW` | `True` | Driver Buddy Reloaded-Ergebnisfenster nach der Analyse anzeigen |
| `JSON_EXPORT` | `True` | `findings.json` schreiben |
| `HTML_REPORT` | `True` | `report.html` schreiben |
| `SEGMENT_OPCODE_SCAN` | `False` | Linearer segmentweiter Opcode-Scan (verrauscht, standardmäßig aus) |

## Testen

Drei Ebenen, von schnell bis gründlich:

- **Reine Python-Regression** (keine IDA erforderlich) - deckt die gesamte Logik ab, die nicht die Live-Datenbank berührt:  ```
  python tests/test_dbr.py
  DBR_SDK=900 python tests/test_dbr.py   # simulate the IDA 9.0 import paths
  • Cross-version smoke – führt die vollständige Pipeline unter IDA 7.6 SP1, 8.4 und Free 9.3 gegen eine Matrix von echten .sys-Dateien aus und gibt eine Bestehen/Fehlschlag-Tabelle aus: pwsh tests/run_cross_version.ps1.
  • Golden-Output-Regression (der Schutz gegen falsch Positive / falsch Negative) – pwsh tests/run_golden.ps1 führt die vollständige Analyse auf einer unveränderten Kopie jedes Referenztreibers in tests/drivers/ erneut aus und vergleicht die Ergebnisse mit der festgeschriebenen Basislinie tests/drivers/<driver>.golden.json (reihenfolgeunabhängig bezüglich Kategorie, Titel, Schweregrad und IOCTL-Code/-Methode/-Zugriff). Jeder hinzugekommene Befund (falsch positiv), fehlender Befund (falsch negativ) oder Änderung des Schweregrads führt zum Fehlschlagen des Durchlaufs. Ein Golden sollte nur neu generiert werden, wenn eine Änderung absichtlich die Befunde verändert, und das Diff sollte überprüft werden. Goldens sind an die IDA Decompiler-Build gebunden, mit der sie erstellt wurden (8.4), daher sollte die Regression mit dieser Version ausgeführt werden.

Bekannte Einschränkungen und Grenzen

  • IOCTL-Kandidaten werden gegen die CTL_CODE-Struktur durch _is_valid_ctl_code() validiert: Das DeviceType-Feld (Bits 31-16) muss ungleich Null sein, und der Wert darf weder einem bekannten NTSTATUS-Code noch dem Sentinel 0xFFFFFFFF (DWORD)-1 entsprechen (eine Vergleichskonstante, die in echten Dispatchern vorkommt, z. B. WinRing0). Dadurch werden Schleifenzähler, kleine Unmittelbare und Fehlercodes ausgeschlossen, während alle gültigen IOCTLs einschließlich herstellerdefinierter Gerätetypen (0x8000+) erhalten bleiben. Derselbe Filter wird auf alle vier Erkennungspfade angewendet: den IoControlCode-Querverweisscan und die drei Dispatcher-Sammler (Decompiler-CTree, IDA-Switchtable-Wiederherstellung und der rohe Immediate-Operand-Scan).
  • Risikobewertung und Call-Chain-Tracing sind heuristische, namensbasierte Hinweisgeneratoren, keine Datenflussanalyse; behandeln Sie Befunde mit hohem/kritischem Schweregrad als Orte, die zuerst untersucht werden sollten, nicht als bestätigte Schwachstellen. Featureschalter befinden sich in DriverBuddyReloaded/config.py.
  • Experimentelle DispatchDeviceControl-Suche funktioniert nur für x64-Treiber
  • In find_opcodes.py unterdrückt die Option find_opcode_data (Standardwert ) Opcode-Übereinstimmungen, die in Datensektionen fallen. Wenn sie auf gesetzt wird, werden auch rohe Byte-Übereinstimmungen in Daten angezeigt, was zu Fehlalarmen neigt; falls ein echter Opcode übersehen wurde, kann man zur gemeldeten Adresse gehen und die Bytes als Code neu definieren, um ihn normalerweise wiederherzustellen. Übereinstimmungen werden wie bei jeder anderen Stufe gemeldet (Ergebnisfenster, , ).

Danksagungen und Anerkennungen

  • Erstellt 2021 von Paolo Stagno alias @Void_Sec:
  • Ideen für Risikobewertung und Berichterstattung adaptiert von Driver Buddy Revolutions von Juan Sacco.
  • DriverBuddy wurde ursprünglich von Braden Hollembaek und Adam Pond von der NCC Group geschrieben.
  • Verwendet Satoshi Tandas IOCTL-Dekoder.
  • Die WDF-Funktionen-Struktur basiert auf Red Plaits Arbeit und wurde von Nicolas Guigo nach IDA Python portiert, später aktualisiert von Braden Hollembaek und Adam Pond.
  • Verwendet Sam Browns F-Secure win_driver_plugin zum Abrufen von Gerätenamen und Pool-Tags, insbesondere Alexander Picks Fork.
  • Der ursprüngliche Code zum Hinzufügen von Elementen zum Rechtsklick-Menü (und möglicherweise einige andere zufällige Snippets) stammt von 'herrcore'.
  • Stolz entwickelt mit PyCharm für Open Source-Entwicklung von JetBrains
Tool herunterladen
False
True
findings.json
report.html