Windows驱动开发学习笔记(二)—— 驱动调试内核编程基础
生活随笔
收集整理的這篇文章主要介紹了
Windows驱动开发学习笔记(二)—— 驱动调试内核编程基础
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Windows驅動開發學習筆記(二)—— 驅動調試&內核編程基礎
- 基礎知識
- 驅動調試
- PDB(Program Debug Database)
- WinDbg 加載 PDB
- 實驗:調試 .sys 文件
- 第一步:編譯代碼
- 第二步:將 .sys 文件拷貝到虛擬機中
- 第三步:添加 pdb 文件路徑
- 第四步:部署 .sys 文件并運行
- 內核編程基礎
- 內核API的使用
- 未導出函數的使用
- 基本數據類型
- 返回值
- 內核中的異常處理
- 常用內核函數(內存操作)
- 內核字符串種類
- 內核字符串常用函數
基礎知識
驅動調試
當我們使用 windbg 查看某一個地址的反匯編時,例如:
windbg 能夠自動幫我們識別出該地址屬于哪個函數(紅框部分)
思考:windbg 是如何識別出該地址對應的函數的?
PDB(Program Debug Database)
WinDbg 加載 PDB
實驗:調試 .sys 文件
第一步:編譯代碼
#include "ntddk.h"//卸載函數 VOID DriverUnload(PDRIVER_OBJECT driver) {DbgPrint("驅動程序已停止.\r\n"); }//驅動程序入口函數,相當于控制臺的main函數 NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath) {__asm{int 3mov eax, eaxmov eax, eaxmov eax, eax}DbgPrint("驅動程序已運行.\r\n");//設置一個卸載函數 便于退出DriverObject->DriverUnload = DriverUnload;return STATUS_SUCCESS; }第二步:將 .sys 文件拷貝到虛擬機中
第三步:添加 pdb 文件路徑
第四步:部署 .sys 文件并運行
WinDbg 成功截獲中斷即可
內核編程基礎
內核API的使用
未導出函數的使用
描述:
獲取未導出的函數地址:
基本數據類型
在內核編程的時候,強烈建議大家遵守WDK的編碼習慣,不要這樣寫:unsigned long length;
WDK類型:
ULONG(unsigned long) PULONG(unsigned long *) UCHAR(unsigned char) PUCHAR(unsigned char *) UINT(unsigned int) PUNIT(unsigned int *) VOID(void) PVOID(void *)返回值
大部分內核函數的返回值都是NTSTATUS類型,如:
NTSTATUS PsCreateSystemThread(); NTSTATUS ZwOpenProcess(); NTSTATUS ZwOpenEvent();這個值能說明函數執行的結果,如:
STATUS_SUCCESS 0x00000000 成功 STATUS_INVALID_PARAMETER 0xC000000D 參數無效 STATUS_BUFFER_OVERFLOW 0x80000005 緩沖區長度不夠當調用的內核函數時,如果返回的結果不是STATUS_SUCCESS,就說明函數執行中遇到了問題,具體是什么問題,可以在ntstatus.h文件中查看
內核中的異常處理
描述:
Windows提供了結構化異常處理機制,一般的編譯器都是支持的,如下:
__try{//可能出錯的代碼 } __except(filter_value) {//出錯時要執行的代碼 }filter_value:
EXCEPTION_EXECUTE_HANDLER(1) //代碼進入except塊 EXCEPTION_CONTINUE_SEARCH(0) //不處理異常,由上一層調用函數處理 EXCEPTION_CONTINUE_EXECUTION(-1) //回去繼續執行錯誤處的代碼常用內核函數(內存操作)
內核字符串種類
ANSI_STRING字符串:
typedef struct _STRING {USHORT Length;USHORT MaximumLength;PCHAR Buffer; }STRING;UNICODE_STRING字符串:
typedef struct _UNICODE_STRING {USHORT Length;USHORT MaxmumLength;PWSTR Buffer; } UNICODE_STRING;內核字符串常用函數
總結
以上是生活随笔為你收集整理的Windows驱动开发学习笔记(二)—— 驱动调试内核编程基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PWN学习总结(四)—— BROP
- 下一篇: Windows驱动开发学习笔记(三)——