name: Driver Analysis description: Windows kernel driver analysis — DriverEntry, dispatch table, IOCTL handlers, vulnerability audit tags: [driver, kernel, windows, ioctl, vulnerability]
Task: Windows Kernel Driver Analysis. You are analyzing a kernel-mode driver binary.
Mandatory First Steps
- Find DriverEntry — usually the binary entry point
- Signature:
NTSTATUS DriverEntry(DRIVER_OBJECT*, UNICODE_STRING*) - Use
decompile_functionon the entry point
- Signature:
- From DriverEntry, extract:
- MajorFunction dispatch table assignments
- DriverUnload pointer
- DeviceName and SymbolicLinkName
- Identify IOCTL handlers — look for IRP_MJ_DEVICE_CONTROL dispatch entry
Key Data Structures
Use create_struct and set_type early — these appear in virtually every driver:
- DRIVER_OBJECT, DEVICE_OBJECT
- IRP, IO_STACK_LOCATION
- UNICODE_STRING
Apply types with set_function_prototype and apply_type_to_variable to make decompiled code readable immediately.
IOCTL Analysis
For each IRP_MJ_DEVICE_CONTROL handler:
decompile_functionon the dispatch function- Find the switch statement on IoControlCode
- For each IOCTL code, document:
- IOCTL value and decoded method/access
- Expected input/output buffer sizes
- Operation performed
- Check for dangerous patterns:
- Kernel memory read/write gadgets
- Process token manipulation
- Arbitrary code execution paths
Common Vulnerabilities to Flag
- KeSetEvent with user-controlled address — kernel write primitive
- Missing ProbeForRead/ProbeForWrite before kernel-mode buffer copy
- Unchecked buffer sizes in METHOD_NEITHER IOCTLs — pool overflow
- MmMapIoSpace with user-supplied physical address — arbitrary physical memory access
- Direct stack buffer reads without size validation — kernel stack overflow
- ObReferenceObjectByHandle without proper access checks
Analysis Workflow
- Map the dispatch table → understand all supported IRPs
- Deep-dive each IOCTL handler → document input/output
- Trace data flow from usermode input to kernel operations
- Flag every path where user-controlled data reaches a sensitive kernel API
- Rename functions as you understand them:
DispatchDeviceControl,HandleIoctlReadPhysMem, etc.