內核調試工具筆記

http://bbs.pediy.com/thread-201125.htm 轉


小白真誠分享不是裝逼,大神勿噴!同是小白人,多贊多快樂! 做者:精靈(^_^)/淘氣鬼 Windows調試員工具包自帶有4個不一樣的調試器 微軟控制檯調試器:cdb.exe          用於調試用戶模式的應用程序運行於基本的控 NT符號調試器   NTSD.exe          命令行制臺 微軟內核調試器    KD.exe          用於系統內核調試 微軟windows 內核調試 Windbg.exe   窗口類型系統內核調試 配置CDB.exe 1.創建調試環境 2.獲取必要的符號文件 調試環境由三個環境變量組成 ① _NT_SOURCE_PATH  目標二進制源代碼文件路徑 ② _NT_SYBOL_PATH   符號文件目錄根節點路徑 ③ _NT_DEBUG_LOG_FILE_OPEN 指定用於記錄調試會話框日誌文件 符號文件由兩部分組成 ① 共有符號信息:包含應用程序的函數名、地址、每一個局部變量的描述,複合數據類型 ② 私有符號信息:表述相似於局部變量的程序元素,是源代碼執行到機器指令映射更加方便,容易 文件符號路徑:    SRV*C:\Symbols*http://msdl.microsoft.com/download/sysbols CDB.exe調試用戶模式應用程序方式 ① CDB.exe啓動應用程序               例如:cdb.exe FileName.exe ② 將CDB.exe附加至已經運行的進程裏cdb.exe -p ProcessID /cdb.exe -pn FileName.exe  ③ CDB.exe針對某個進程進行非入侵式調試     cdb.exe -pv -p ProcessID                                              Cdb.exe -pv -pn FileName.exe 如下命令均在windbg下執行 調試命令行解釋及示例: bl                列舉已存在的斷點 bc breakpoint      刪除指定斷點 bp  FunctionName 在指定的函數起點中設置斷點 bp               當前的地址(EIP值)下斷點   示例:           依次執行如下命令 bp               如今當前位置下斷點 bp WriteFile       給WriteFile函數起點下斷點 bl               獲得以下結果 bc 0,1            刪除ID爲0 ,1斷點 bl               獲得空列表結果 -g 忽略程序的入口斷點      -G 忽略程序的終點 CTRL B 組合件 再ENTER 緊急逃生出口,有效阻止系統崩潰 g 執行到下一個斷點 t 執行下一條指令,單步步入F8/F11(至關於OD的F7) p 執行到下一條指令,單步步過 F10(至關於OD的F8) gu 執行到當前函數結束並返回到上一函數處 q 退出 檢查符號命令 x module!symbol     報告指定符號的地址 x*!                列舉當前加載的全部模塊 x module!*          列舉指定模塊全部的符號及其地址 x module!symbol*    列舉全部與」arg」通配符過濾器匹配的符號 例如:依次輸入如下命令行 0:000> x*!          列舉當前加載的全部模塊 start             end                 module name 00000000`00400000 00000000`00417000   image00000000_00400000   (deferred)              00000000`74a60000 00000000`74a68000   wow64cpu   (deferred)              00000000`74a70000 00000000`74acc000   wow64win   (deferred)              00000000`74ad0000 00000000`74b0f000   wow64      (deferred)              00000000`76f30000 00000000`770d9000   ntdll      (export symbols)       C:\Windows\SYSTEM32\ntdll.dll 00000000`77110000 00000000`77290000   ntdll32    (deferred)              0:000> x ntdll*! 00000000`76f311f0 ntdll!RtlWalkHeap (<no parameter info>) 00000000`76f313a0 ntdll!RtlpEnsureBufferSize (<no parameter info>) 00000000`76f318a0 ntdll!RtlDeleteAce (<no parameter info>) 00000000`76f31b24 ntdll!vsnwprintf_s (<no parameter info>) 00000000`76f31c00 ntdll!RtlCreateActivationContext (<no parameter info>) 00000000`76f31ec0 ntdll!isalpha (<no parameter info>) 00000000`76f31ef0 ntdll!ultoa (<no parameter info>) ………… 0:000> x ntdll!RtlWalkHeap           報告指定符號的地址 00000000`76f311f0 ntdll!RtlWalkHeap (<no parameter info>) 0:000>  x ntdll!RtlWalkHeap*        列舉全部與」arg」通配符過濾器匹配的符號 00000000`76f311f0 ntdll!RtlWalkHeap (<no parameter info>) lm                列舉全部已加載的全部模塊 !lmi*              擴展命令接收以模塊名或者基地址爲參數 以顯示模塊的相關信息 lm v               同上 dt                 顯示類型命令                例如:依次輸入如下命令行 0:000> lm          列舉全部已加載的全部模塊 start             end                 module name 00000000`00400000 00000000`00417000   image00000000_00400000   (deferred)              00000000`74a60000 00000000`74a68000   wow64cpu   (deferred)              00000000`74a70000 00000000`74acc000   wow64win   (deferred)              00000000`74ad0000 00000000`74b0f000   wow64      (deferred)              00000000`76f30000 00000000`770d9000   ntdll      (export symbols)       C:\Windows\SYSTEM32\ntdll.dll 00000000`77110000 00000000`77290000   ntdll32    (deferred)              0:000> !lmi*       擴展命令接收以模塊名或者基地址爲參數 以顯示模塊的相關信息 No export lmi* found 0:000> lm ntdll Unknown option 'd' start             end                 module name 00000000`76f30000 00000000`770d9000   ntdll    ntdll.dll    Sat Nov 20 21:11:21 2010 (4CE7C8F9) 0:000> lm v       擴展命令接收以模塊名或者基地址爲參數 以顯示模塊的相關信息 start             end                 module name 00000000`00400000 00000000`00417000   image00000000_00400000   (deferred)                  Image path: image00000000`00400000     Image name: image00000000`00400000     Timestamp:        Sun Apr 05 19:54:38 2015 (5521227E)     CheckSum:         00000000     ImageSize:        00017000     Translations:     0000.04b0 0000.04e4 0409.04b0 0409.04e4 00000000`74a60000 00000000`74a68000   wow64cpu   (deferred)                  Image path: C:\Windows\SYSTEM32\wow64cpu.dll     Image name: wow64cpu.dll     Timestamp:        Tue Aug 21 02:48:10 2012 (5032866A)     CheckSum:         000048A0     ImageSize:        00008000     File version:     6.1.7601.17932     Product version:  6.1.7601.17932     File flags:       0 (Mask 3F)     File OS:          40004 NT Win32     File type:        2.0 Dll 反彙編命令 u                 反彙編當前地址開始的8條指令 u address          反彙編指定地址開始的8條指令 u start end          反彙編從指定地址到另外一個指定地址的指令 例如:依次輸入如下命令行 0:000> u ntdll!CsrSetPriorityClass+0x40: 00000000`76fdcb60 cc              int     3 00000000`76fdcb61 eb00       jmp     ntdll!CsrSetPriorityClass+0x43 (00000000`76fdcb63) 00000000`76fdcb63 4883c438        add     rsp,38h 00000000`76fdcb67 c3              ret 00000000`76fdcb68 90              nop 00000000`76fdcb69 90              nop 00000000`76fdcb6a 90              nop 00000000`76fdcb6b 90              nop 0:000> u 74a70000  反彙編指定地址開始的8條指令,74a70000是wow64win的基址 *** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Windows\SYSTEM32\wow64win.dll - (出現這個,是由於我還沒配置文件符號表路徑)(配置方式:文件==》文件符號表路徑==》輸入:srv*c:\symbolslocal*http://msdl.microsoft.com/download/symbols;D:\Symbols   c:\symbolslocal文件符號暫存地方;http://msdl.microsoft.com/download/symbols  微軟文件符號表服務器;D:\Symbols 文件符號表自行解壓的地方(在不聯網的時候能夠自行匹配文件符號)) wow64win: 00000000`74a70000 4d5a            pop     r10 00000000`74a70002 90              nop 00000000`74a70003 0003            add     byte ptr [rbx],al 00000000`74a70005 0000            add     byte ptr [rax],al 00000000`74a70007 000400          add     byte ptr [rax+rax],al 00000000`74a7000a 0000            add     byte ptr [rax],al 00000000`74a7000c ff              ??? 00000000`74a7000d ff00            inc     dword ptr [rax] 0:000> u 74a70000 74a7000a         反彙編從指定地址到另外一個指定地址的指令 wow64win: 00000000`74a70000 4d5a            pop     r10 00000000`74a70002 90              nop 00000000`74a70003 0003            add     byte ptr [rbx],al 00000000`74a70005 0000            add     byte ptr [rax],al 00000000`74a70007 000400          add     byte ptr [rax+rax],al 00000000`74a7000a 0000            add     byte ptr [rax],al 數據顯示命令 db addressRange    顯示16進制數據及ASCII字節值(默認數據爲128個字節) dw addressRange   顯示16進制及ASCII字值 dd addressRange    顯示16進制及ASCII碼雙字 dps addressRange   顯示和解析指針表 dg start end        顯示給定地址範圍的段描述符 .formats   XXXX  將一個數列出他的相關進制的表示 r                 顯示當前全部通用寄存器的各寄存器的當前值 0:000> db 74a70000  顯示pe DOS頭文件 16進制數據及ASCII字節值(默認數據爲128個字節) 00000000`74a70000  4d 5a 90 00 03 00 00 00-04 00 00 00 ff ff 00 00  MZ.............. 00000000`74a70010  b8 00 00 00 00 00 00 00-40 00 00 00 00 00 00 00  ........@....... 00000000`74a70020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................ 00000000`74a70030  00 00 00 00 00 00 00 00-00 00 00 00 f0 00 00 00  ................ 00000000`74a70040  0e 1f ba 0e 00 b4 09 cd-21 b8 01 4c cd 21 54 68  ........!..L.!Th 00000000`74a70050  69 73 20 70 72 6f 67 72-61 6d 20 63 61 6e 6e 6f  is program canno 00000000`74a70060  74 20 62 65 20 72 75 6e-20 69 6e 20 44 4f 53 20  t be run in DOS  00000000`74a70070  6d 6f 64 65 2e 0d 0d 0a-24 00 00 00 00 00 00 00  mode....$....... 0:000> dw 74a70000  顯示16進制及word 類型ASCII字值 00000000`74a70000  5a4d 0090 0003 0000 0004 0000 ffff 0000 00000000`74a70010  00b8 0000 0000 0000 0040 0000 0000 0000 00000000`74a70020  0000 0000 0000 0000 0000 0000 0000 0000 00000000`74a70030  0000 0000 0000 0000 0000 0000 00f0 0000 00000000`74a70040  1f0e 0eba b400 cd09 b821 4c01 21cd 6854 00000000`74a70050  7369 7020 6f72 7267 6d61 6320 6e61 6f6e 00000000`74a70060  2074 6562 7220 6e75 6920 206e 4f44 2053 00000000`74a70070  6f6d 6564 0d2e 0a0d 0024 0000 0000 0000 0:000> dd 74a70000  顯示16進制及ASCII碼雙字 00000000`74a70000  00905a4d 00000003 00000004 0000ffff 00000000`74a70010  000000b8 00000000 00000040 00000000 00000000`74a70020  00000000 00000000 00000000 00000000 00000000`74a70030  00000000 00000000 00000000 000000f0 00000000`74a70040  0eba1f0e cd09b400 4c01b821 685421cd 00000000`74a70050  70207369 72676f72 63206d61 6f6e6e61 00000000`74a70060  65622074 6e757220 206e6920 20534f44 00000000`74a70070  65646f6d 0a0d0d2e 00000024 00000000 0:000> dps 76fdcb60 76fdcb6b 顯示和解析76fdcb60 到76fdcb6b範圍內的指針表 00000000`76fdcb60  c338c483`4800ebcc 00000000`76fdcb68  90909090`90909090 0:000> .formats 516adcf  實現數據進制轉換 Evaluate expression:   Hex:     00000000`0516adcf   Decimal: 85372367   Octal:   0000000000000505526717   Binary:  00000000 00000000 00000000 00000000 00000101 00010110 10101101 11001111   Chars:   ........   Time:    Fri Sep 15 10:32:47 1972   Float:   low 7.08489e-036 high 0   Double:  4.21796e-316 使用內核調試器的4中調試方法         雙機調試 (經過鏈接雙主機進行調試)     這種方式使用道具多,損耗大,恢復慢,但調試真實,執行命令完整。 本地內核調試     損耗小,但內核執行命令少 分析崩潰轉儲     只是分析系統崩潰時系統機制轉存當前內存的信息,系統分析經常使用的技能 虛擬機調試     在物理機上安裝虛擬機,以實現雙機調試功能,解決了雙機調試道具多,損耗大,恢復慢的問題。虛擬機調試如今已經成爲最長用的調試方式,因此一下將詳細介紹在虛擬機調試 調試命令 CTRL+C        取消調試器命令 如下三個命令結合起來 實現恢復目標系統正常,並退出調試 bc * g CTRL+B  ENTER lm n            LoadModule 列舉已加載模指令 n爲列舉數量 若是單純的lm 則列舉全                                         部已加載的模塊 !process 0 0      !process Process Flag    顯示指定進程的詳細 Flag爲5位大小的值,0顯示最少,31最多  Process 能夠是基址 .process address   切換到指定地址所屬的進程爲當前進程 !peb            擴展命令 例如:依次輸入如下命令行 0:000> lm n start             end                 module name 00000000`00400000 00000000`00417000   image00000000_00400000 image00000000`00400000 00000000`74a60000 00000000`74a68000   wow64cpu wow64cpu.dll 00000000`74a70000 00000000`74acc000   wow64win wow64win.dll 00000000`74ad0000 00000000`74b0f000   wow64    wow64.dll    00000000`76f30000 00000000`770d9000   ntdll    ntdll.dll    00000000`77110000 00000000`77290000   ntdll32  ntdll32.dll  由於配置符號表,上述幾個暫時沒法實例,請見諒!            敬請期待下一期精靈(^_^)/淘氣鬼 成長筆記講解,謝謝!!
相關文章
相關標籤/搜索