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)
‐
開發環境
‐
make.bat
‐
main.inf
‐
Hello, world!
‐
Handle File IRP
‐
Choose DO_BUFFERED_IO
‐
Choose DO_DIRECT_IO
‐
Choose DO_NEITHER_IO
‐
Handle IOCTL IRP
‐
Choose METHOD_BUFFERED
‐
Choose METHOD_IN_DIRECT、METHOD_OUT_DIRECT
‐
Choose METHOD_NEITHER
‐
Use KSystemThread
⊕
使用範例 - Assembly (MASM32)
‐
開發環境
‐
make.bat
‐
main.inf
‐
Hello, world!
‐
Handle File IRP
‐
Choose DO_BUFFERED_IO
‐
Choose DO_DIRECT_IO
‐
Choose DO_NEITHER_IO
‐
Handle IOCTL IRP
‐
Choose METHOD_BUFFERED
‐
Choose METHOD_IN_DIRECT、METHOD_OUT_DIRECT
‐
Choose METHOD_NEITHER
‐
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)
‐
開發環境
‐
make.bat
‐
main.inf
‐
Hello, world!
⊕
使用範例 - C/C++ (DDK)
‐
開發環境
‐
make.bat
‐
main.inf
‐
Hello, world!
‐
Handle File IRP
‐
Choose DO_BUFFERED_IO
‐
Choose DO_DIRECT_IO
‐
Choose DO_NEITHER_IO
‐
Handle IOCTL IRP
‐
Choose METHOD_BUFFERED
‐
Choose METHOD_IN_DIRECT、METHOD_OUT_DIRECT
‐
Choose METHOD_NEITHER
‐
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
‐
Use Deferred Procedure Call(DPC)
‐
Use Asynchronous Procedure Call(APC)
‐
Register Notification for Thread Creation
‐
Register Notification for Process Creation
⊕
使用範例 - C/C++ (DriverWorks)
‐
開發環境
‐
make.bat
‐
main.inf
‐
Hello, world!
⊕
使用範例 - Pascal (DDDK)
‐
開發環境
‐
main.inf
‐
make.bat
‐
Hello, world!
‐
Handle File IRP
‐
Choose DO_BUFFERED_IO
‐
Choose DO_DIRECT_IO
‐
Choose DO_NEITHER_IO
‐
Handle IOCTL IRP
‐
Choose METHOD_BUFFERED
‐
Choose METHOD_IN_DIRECT、METHOD_OUT_DIRECT
‐
Choose METHOD_NEITHER
‐
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
‐
ProbeForRead()、ProbeForWrite()
‐
NT Namespace("\\.\"、"\??\")轉置測試
‐
如何移除已經簽章的驅動程式
‐
如何使用私人憑證加簽驅動程式
‐
如何使用Verifier驗證驅動程式
‐
如何停止Windows 7數位簽章檢查
‐
如何停止Windows 10數位簽章檢查
‐
如何停止Windows XP數位簽章警告視窗
‐
如何使用RunDLL32.exe安裝驅動程式
‐
如何在User Mode開啟"\Device\"下的驅動程式(非Symbolic Link)
‐
解決DbgView無法在Windows x64輸出訊息的問題
‐
解決Unresolved symbol _DriverEntry@8問題
‐
解決Dbgv.sys The process cannot access the file問題
‐
解決The third-party INF does not contain digital signature information問題
‐
解決Unresolved external symbol SDDL_DEVOBJ_SYS_ALL_ADM_RWX_WORLD_RW_RES_R問題
‐
為何ZwAllocateVirtualMemory無法配置超過0x80000000位址
Windows NT Driver (Legacy)
⊕
教學說明
‐
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 (MASM32)
‐
開發環境
‐
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)
⊕
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
‐
Timer
‐
GPIO Input
‐
IRQ
‐
SoftIRQ
‐
Tasklet
‐
Workqueue
‐
KThread
⊕
Char Device
‐
Device Node
‐
Class Device
‐
File Read/Write
‐
Device I/O Control
⊕
使用範例 - Assembly (MIPSel)
‐
開發環境
‐
Hello, world!
⊕
使用範例 - C/C++ (QEMU)
‐
開發環境
⊕
使用範例 - C/C++ (PocketBeagle)
‐
開發環境
‐
Hello, world!
‐
GPIO Output
‐
Timer
‐
GPIO Input
‐
IRQ
‐
SoftIRQ
‐
Tasklet
‐
Workqueue
‐
KThread
⊕
Char Device
‐
Device Node
‐
Class Device
‐
File Read/Write
‐
Device I/O Control
⊕
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
‐
Hello, world!
‐
Event(Sync、Async)
‐
解析Oneshot執行流程
‐
Oneshot、Begin差異
‐
解決Module version mismatch問題
‐
解決While resolving probe point問題
⊕
Fanotify
‐
監看某個特定資料夾的OPEN事件
‐
Tainted Flags
‐
pr_xxx()、dev_xxx()區別
‐
cdev_add()、register_chrdev()
‐
dma_mmap_coherent()、remap_pfn_range()
‐
Kernel command line(CONFIG_CMDLINE)加上"--"
‐
如何列印時間
‐
如何使用sysfs
‐
如何使用sysdig
‐
如何取得目前PID
‐
如何替換開機圖片
‐
如何調整fbcon的字型
‐
如何開啟dynamic debug
‐
如何取得目前task struct
‐
如何取得目前cgroup_path
‐
如何取得系統Export Symbols
‐
如何產生全部選項為no的.config檔案
‐
如何取得API Function在Kernel版本的變動
‐
如何知道目前process是否位於container裡面
‐
如何確定container需要的kernel config選項已經開啟
‐
解決module_put panic問題
‐
解決Unknown relocation: 10問題
‐
解決scripts/mod/modpost: not found問題
‐
解決netconfig.h: No such file or directory問題
‐
解決Error: test_attr__enabled undeclared問題
‐
解決Fatal error: asm/rwonce.h file not found問題
‐
解決Error: modpost: __stack_chk_guard undefined!問題
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)
⊕
教學說明
‐
1. 檔頭資訊
‐
2. I/O Request Packet(IRP)
‐
3. Command處理流程
‐
4. 支援的Command
‐
5. Status屬性
‐
6. Command 0 - Initialization
‐
7. Command 1 - Media Check
‐
8. Command 2 - Get BPB Parameter
‐
9. Command 3 - IOCTL Input
‐
10. Command 4 - Input
‐
11. Command 5 - Nondestructive Input
‐
12. Command 6 - Input Status
‐
13. Command 7 - Input Flush
‐
14. Command 8 - Output
‐
15. Command 9 - Output with Verify
‐
16. Command 10 - Output Status
‐
17. Command 11 - Output Flush
‐
18. Command 12 - IOCTL Output
‐
19. Command 13 - Open
‐
20. Command 14 - Close
‐
21. Command 15 - Removable Media
‐
22. Command 16 - Output til Busy
‐
23. Command 19 - Generic IOCTL
‐
24. Command 23 - Get Logical Device
‐
25. Command 24 - Set Logical Device
‐
26. Command 25 - IOCTL Query
⊕
使用範例 - Assembly (MASM)
‐
開發環境
‐
Hello, world!
VxWorks
‐
如何透過DBG Debug
‐
使用範例 - C/C++
‐
開發環境
‐
Hello, world!
‐
Handle File
‐
Handle IOCTL
‐
Handle Select
‐
Use MUX Binding
‐
Use Watchdog
‐
Create Pipe
‐
Register Task Hook
‐
Register RTP Hook
‐
Register Module Hook
‐
Register Syscall Hook (Group)
‐
Register Syscall Hook (Entry and Exit)