Steward
分享是一種喜悅、更是一種幸福
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 (ARM64)
‐ 開發環境
‐ Hello, world!
⊕ 使用範例 - Assembly (MASM32)
‐ 開發環境
‐ 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)
⊕ 使用範例 - Pascal (DDDK)
‐ 開發環境
‐ 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)
⊕ 使用範例 - C/C++ (DDK)
‐ 開發環境
‐ 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)
‐ Share Memory
⊕ 使用範例 - BASIC (FreeBASIC)
‐ 開發環境
‐ Hello, world!
Windows Virtual Device Driver (VxD)
⊕ 使用範例 - Assembly (MASM611)
‐ 開發環境
‐ make.bat
‐ main.def
‐ 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)
‐ 開發環境(armhf)
‐ 開發環境(aarch64)
‐ 開發環境(x86_64)
⊕ 使用範例 - C/C++ (Debian)
‐ 開發環境
‐ Hello, world!
‐ Netfilter Hooking
⊕ 使用範例 - 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事件
⊕ Vulnerability
‐ CVE-2021-3493
‐ 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檔案
‐ 如何編譯出Kernel Module vermagic有+號
‐ 如何取得API Function在Kernel版本的變動
‐ 如何知道目前process是否位於container裡面
‐ 如何確定container需要的kernel config選項已經開啟
‐ 解決module_put panic問題
‐ 解決Unknown relocation: 10問題
‐ 解決/sys/kernel/debug/沒有內容的問題
‐ 解決/sys/kernel/tracing/沒有內容的問題
‐ 解決scripts/mod/modpost: not found問題
‐ 解決Error: test_attr__enabled undeclared問題
‐ 解決netconfig.h: No such file or directory問題
‐ 解決Fatal error: asm/rwonce.h file not found問題
‐ 解決Error: modpost: __stack_chk_guard undefined!問題
Kernel Mode Driver Framework (KMDF)
⊕ 教學說明
‐ 1. 驅動程式進入點DriverEntry()
‐ 2. 系統透過呼叫AddDevice()來新增裝置
‐ 3. 系統透過呼叫DriverUnload()來卸載驅動程式
‐ 4. User Application透過File跟驅動程式溝通
‐ 5. File Buffer的使用策略
‐ 6. User Application透過IOCTL跟驅動程式溝通
‐ 7. IOCTL Buffer的使用策略
⊕ 使用範例 - Assembly (MASM32) - PNP
‐ 開發環境
‐ make.bat
‐ main.inf
‐ Hello, world!
‐ Handle File IRP
‐ Choose WdfDeviceIoBuffered
‐ Choose WdfDeviceIoDirect
‐ Choose WdfDeviceIoNeither
‐ 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
‐ Use WDF Timer
⊕ 使用範例 - Pascal (DDDK) - PNP
‐ 開發環境
‐ make.bat
‐ main.inf
‐ Hello, world!
‐ Handle File IRP
‐ Choose WdfDeviceIoBuffered
‐ Choose WdfDeviceIoDirect
‐ Choose WdfDeviceIoNeither
‐ 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
‐ Use WDF Timer
⊕ 使用範例 - C/C++ (WDF) - PNP
‐ 開發環境
‐ make.bat
‐ main.inf
‐ Hello, world!
‐ Handle File IRP
‐ Choose WdfDeviceIoBuffered
‐ Choose WdfDeviceIoDirect
‐ Choose WdfDeviceIoNeither
‐ 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
‐ Use WDF Timer
‐ 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)