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)