Windows Driver Model (WDM)
⊕
教學說明
‐
1. 驅動程式進入點DriverEntry()
‐
2. 系統透過呼叫AddDevice()來新增裝置
‐
3. 系統透過呼叫DriverUnload()來卸載驅動程式
‐
4. User Application透過File跟驅動程式溝通
‐
5. File Buffer的使用策略
‐
6. User Application透過IOCTL跟驅動程式溝通
‐
7. IOCTL Buffer的使用策略
‐
8. Queue Irp的操作步驟
‐
9. Cancel Irp的操作步驟
‐
10. 同步化物件的使用說明
⊕
使用範例 - Assembly (ObjAsm)
‐
開發環境
⊕
使用範例 - Assembly (MASM32)
‐
開發環境
‐
make.bat
‐
main.inf
‐
Hello, world!
‐
Handle File IRP
‐
Choose DO_BUFFERED_IO for File IRP
‐
Choose DO_DIRECT_IO for File IRP
‐
Choose DO_NEITHER_IO for File IRP
‐
Handle IOCTL IRP
‐
Choose METHOD_BUFFERED for IOCTL IRP
‐
Choose METHOD_IN_DIRECT、METHOD_OUT_DIRECT for IOCTL IRP
‐
Choose METHOD_NEITHER for IOCTL IRP
‐
Use Thread
‐
Use I/O Timer
‐
Use DPC Timer
‐
Handle StartIo IRP
‐
Queue IRP
‐
Cancel IRP
‐
Use Cancel-Safe IRP Queue(CSQ)
‐
Use Spin Lock
‐
Use Event
‐
Use Mutex
‐
Use Semaphore
⊕
使用範例 - BASIC (FreeBASIC)
‐
開發環境
‐
Hello, world!
⊕
使用範例 - C/C++ (DDK)
‐
開發環境
‐
main.inf
‐
sources
‐
makefile
‐
Hello, world!
⊕
File
∗
IRP
∗
DO_BUFFERED_IO
∗
DO_DIRECT_IO(PIO)
∗
DO_DIRECT_IO(DMA)
∗
DO_NEITHER_IO
⊕
IOCTL
∗
IRP
∗
METHOD_BUFFERED
∗
METHOD_IN_DIRECT、METHOD_OUT_DIRECT
∗
METHOD_NEITHER
∗
Thread
⊕
Timer
∗
I/O
∗
DPC
∗
StartIO
∗
Queue IRP
∗
Cancel IRP
∗
Cancel-Safe IRP Queue(CSQ)
⊕
Synchronization
∗
Spin Lock
∗
Event
∗
Mutex
∗
Semaphore
∗
Deferred Procedure Call(DPC)
∗
Asynchronous Procedure Call(APC)
∗
PsSetCreateThreadNotifyRoutine()
∗
PsSetCreateProcessNotifyRoutine()
⊕
使用範例 - C/C++ (DriverWorks)
‐
開發環境
‐
main.inf
‐
sources
‐
makefile
‐
Hello, world!
⊕
使用範例 - Pascal (DDDK)
‐
開發環境
‐
main.inf
‐
make.bat
‐
Hello, world!
⊕
File
∗
IRP
∗
DO_BUFFERED_IO
∗
DO_DIRECT_IO(PIO)
∗
DO_DIRECT_IO(DMA)
∗
DO_NEITHER_IO
⊕
IOCTL
∗
IRP
∗
METHOD_BUFFERED
∗
METHOD_IN_DIRECT、METHOD_OUT_DIRECT
∗
METHOD_NEITHER
∗
Thread
⊕
Timer
∗
I/O
∗
DPC
∗
StartIO
∗
Queue IRP
∗
Cancel IRP
∗
Cancel-Safe IRP Queue(CSQ)
⊕
Synchronization
∗
Spin Lock
∗
Event
∗
Mutex
∗
Semaphore
∗
WinDbg Symbol路徑
∗
停止Win7數位簽章檢查
∗
停止Win10數位簽章檢查
∗
使用私人憑證加簽驅動程式
∗
使用Verifier驗證驅動程式
∗
如何移除已經簽章的驅動程式
∗
關閉WinXP數位簽章警告視窗
∗
解決DbgView輸出訊息的問題
∗
解決DbgView的Dbgv.sys問題
∗
ZwQueryValueKey()使用方式
∗
Namespace("\\.\"、"\??\")
∗
__try __except在使用上的限制
∗
Multi-core上的DISPATCH_LEVEL
∗
如何使用rundll32.exe安裝驅動程式
∗
ProbeForRead()、ProbeForWrite()
∗
RtlQueryRegistryValues()使用方式
∗
解決"INF does not contain digital ..."問題
∗
解決"unresolved symbol _DriverEntry@8"問題
∗
解決"unresolved symbol SDDL_DEVOBJ..."問題
∗
為何ZwAllocateVirtualMemory無法配置超過0x80000000位址
∗
如何在User Mode開啟"\Device\"下的驅動程式(非Symbolic Link)
Windows NT Driver (Legacy)
⊕
Assembly
‐
開發環境
∗
DriverEntry()
∗
DriverUnload()
∗
Hello, world!
⊕
File
∗
IRP
∗
DO_BUFFERED_IO
∗
DO_DIRECT_IO(PIO)
∗
DO_DIRECT_IO(DMA)
∗
DO_NEITHER_IO
⊕
IOCTL
∗
IRP
∗
METHOD_BUFFERED
∗
METHOD_IN_DIRECT、METHOD_OUT_DIRECT
∗
METHOD_NEITHER
∗
Thread
⊕
Timer
∗
I/O
∗
DPC
∗
StartIO
∗
Queue IRP
∗
Cancel IRP
∗
Cancel-Safe IRP Queue(CSQ)
⊕
Pascal
‐
開發環境
∗
DriverEntry()
∗
DriverUnload()
∗
Hello, world!
⊕
File
∗
IRP
∗
DO_BUFFERED_IO
∗
DO_DIRECT_IO(PIO)
∗
DO_DIRECT_IO(DMA)
∗
DO_NEITHER_IO
⊕
IOCTL
∗
IRP
∗
METHOD_BUFFERED
∗
METHOD_IN_DIRECT、METHOD_OUT_DIRECT
∗
METHOD_NEITHER
∗
Thread
⊕
Timer
∗
I/O
∗
DPC
∗
StartIO
∗
Queue IRP
∗
Cancel IRP
∗
Cancel-Safe IRP Queue(CSQ)
⊕
C/C++
‐
開發環境
∗
DriverEntry()
∗
DriverUnload()
∗
Hello, world!
⊕
File
∗
IRP
∗
DO_BUFFERED_IO
∗
DO_DIRECT_IO(PIO)
∗
DO_DIRECT_IO(DMA)
∗
DO_NEITHER_IO
⊕
IOCTL
∗
IRP
∗
METHOD_BUFFERED
∗
METHOD_IN_DIRECT、METHOD_OUT_DIRECT
∗
METHOD_NEITHER
∗
Thread
⊕
Timer
∗
I/O
∗
DPC
∗
StartIO
∗
Queue IRP
∗
Cancel IRP
∗
Cancel-Safe IRP Queue(CSQ)
∗
Share Memory
⊕
BASIC
‐
開發環境
‐
Hello, world!
Linux Device Driver(LDD)
⊕
Assembly (ARM)
∗
開發環境
∗
hello, world!
∗
gpio output
∗
mod_timer
∗
gpio input
∗
request_irq
∗
softirq
∗
tasklet
∗
workqueue
∗
kthread
⊕
chrdev
∗
mknod
∗
device
∗
read、write
∗
ioctl
⊕
Assembly (MIPSel)
∗
開發環境
∗
hello, world!
⊕
C/C++
∗
開發環境
∗
hello, world!
∗
gpio output
∗
mod_timer
∗
gpio input
∗
request_irq
∗
softirq
∗
tasklet
∗
workqueue
∗
kthread
⊕
chrdev
∗
mknod
∗
device
∗
read、write
∗
ioctl
⊕
Falco
∗
架構簡介
∗
install falco
∗
build ebpf
∗
build pdig
∗
build kernel
∗
build plugins/k8saudit
∗
build libscap、libsinsp
∗
如何開啟k8saudit rule
∗
如何載入modern bpf driver
∗
如何讓k8saudit plugin直接讀取audit log檔案
∗
解決"Cannot find source file: ../libs/userspace/libscap/scap_udig.c"問題
⊕
eBPF
∗
開發環境
∗
解決"cannot import name BPF from bcc"問題
⊕
SystemTap
∗
開發環境
∗
overview
∗
event(sync、async)
∗
hello, world!
∗
解析oneshot執行流程
∗
oneshot、begin的差異
∗
解決"module version mismatch"問題
∗
解決"while resolving probe point"問題
⊕
fanotify
∗
監看某個特定資料夾的OPEN事件
∗
using sysfs
∗
build sysdig
∗
tainted flags
∗
pr_xxx()、dev_xxx()
∗
cdev_add()、register_chrdev()
∗
dma_mmap_coherent()、remap_pfn_range()
∗
Kernel command line(CONFIG_CMDLINE)加上"--"
∗
列印時間
∗
如何取得目前PID
‐
如何取得API Function在Kernel版本的變動
∗
如何控制背光亮度
∗
如何替換開機圖片
∗
如何調整fbcon的字型
∗
如何開啟dynamic debug
∗
如何取得目前task struct
∗
如何取得目前cgroup_path
∗
如何取得系統上的Export Symbols
∗
如何產生全部選項為no的.config檔案
∗
如何知道目前process是否位於container裡面
∗
如何知道container需要的kernel config選項
∗
解決"module_put"問題
∗
解決"unknown relocation: 10"問題
∗
解決"scripts/mod/modpost: not found"問題
∗
解決"error: test_attr__enabled undeclared"問題
∗
解決"fatal error: asm/rwonce.h file not found"問題
Kernel Mode Driver Framework (KMDF)
⊕
Assembly (PNP)
∗
開發環境
∗
DriverEntry()
∗
AddDevice()
∗
DriverUnload()
∗
Hello, world!
⊕
File
∗
IRP
∗
WdfDeviceIoBuffered
∗
WdfDeviceIoDirect(PIO)
∗
WdfDeviceIoDirect(DMA)
∗
WdfDeviceIoNeither
⊕
IOCTL
∗
IRP
∗
METHOD_BUFFERED
∗
METHOD_IN_DIRECT、METHOD_OUT_DIRECT
∗
METHOD_NEITHER
∗
Thread
⊕
Timer
∗
I/O
∗
DPC
∗
WDF
⊕
Pascal (PNP)
∗
開發環境
∗
DriverEntry()
∗
AddDevice()
∗
DriverUnload()
∗
Hello, world!
⊕
File
∗
IRP
∗
WdfDeviceIoBuffered
∗
WdfDeviceIoDirect(PIO)
∗
WdfDeviceIoDirect(DMA)
∗
WdfDeviceIoNeither
⊕
IOCTL
∗
IRP
∗
METHOD_BUFFERED
∗
METHOD_IN_DIRECT、METHOD_OUT_DIRECT
∗
METHOD_NEITHER
∗
Thread
⊕
Timer
∗
I/O
∗
DPC
∗
WDF
⊕
C/C++ (PNP)
∗
開發環境
∗
DriverEntry()
∗
AddDevice()
∗
DriverUnload()
∗
Hello, world!
⊕
File
∗
IRP
∗
WdfDeviceIoBuffered
∗
WdfDeviceIoDirect(PIO)
∗
WdfDeviceIoDirect(DMA)
∗
WdfDeviceIoNeither
⊕
IOCTL
∗
IRP
∗
METHOD_BUFFERED
∗
METHOD_IN_DIRECT、METHOD_OUT_DIRECT
∗
METHOD_NEITHER
∗
Thread
⊕
Timer
∗
I/O
∗
DPC
∗
WDF
∗
WHQL測試流程
∗
WDFAPI定義值
∗
淺談WDFFunctions
∗
淺談Digital Signature、Timestamp、Certificate
∗
如何在Pascal中取得WDFFunction和WdfDriverGlobals
∗
解決"Failed to connect to OM"問題
MS-DOS Device Driver (MDD)
⊕
Assembly
⊕
Basic
∗
開發環境
∗
基本觀念
∗
I/O Request Packet(IRP)
⊕
Advanced
⊕
Char
⊕
Hello, world!
⊕
Block
∗
Hello, world!
VxWorks
‐
23.09
‐
C/C++
‐
開發環境
‐
Hello, world!
‐
File
‐
IOCTL
‐
Select
‐
MUX Binding
‐
Watchdog
‐
Pipe
‐
Task Hook
‐
RTP Hook
‐
Module Hook
‐
Syscall Hook (Group)
‐
Syscall Hook (Entry and Exit)