WinDbg. From A to Z! 筆記(下)

原文鏈接: WinDbg. From A to Z!

文章目錄

  • 使用WinDbg
    • 臨界區相關命令
      • 示例 -- 查看臨界區
      • 其他有用的命令
    • WinDbg中的偽寄存器
      • 自動偽寄存器
    • WinDbg中的表達式
      • 其他操作
      • 默認的表達式計算方式
    • WinDbg中的重命名
    • 調試器命令語言編程
      • 控制流
      • 命令程序執行
    • WinDbg 遠程調試
    • 事件監控
      • WinDbg 事件過濾器
      • 事件過濾器對話框
      • 事件參數
  • 全局標志 (Global Flags)
    • Flags? GFlags? Global Flags!
    • Global Flags
  • 應用程序驗證器
    • 啟用應用程序驗證器
    • 應用驗證器的實體
    • 應用驗證器的調試符號
    • `!avrf`的常用參數
    • 示例 -- 使用 `!avrf`
  • 進程轉儲 (Process Dumps)
    • Dumps的類型
    • 確定Dump文件的類型
    • 示例 -- 使用`.dump`命令

使用WinDbg

臨界區相關命令

在這里插入圖片描述
** !avrf 是Application Verifier 的內容

示例 – 查看臨界區

這里有一個簡單的死鎖例子

暫時跳過

其他有用的命令

命令描述
dt顯示某些數據的信息如,局部變量,函數參數,全局變量,數據類型
dt 模塊名!類或命名空間或函數列舉模塊里的類型的定義
dt 模塊名!類::函數或變量 地址顯示具體實例的值
dt ntdll!_PEB 7efde000顯示7efde000處_PEB實例的信息
dv顯示局部變量
dv /i /t /V/i 指區分是參數還是變量, /t 顯示類型信息 , /V 顯示詳細信息

WinDbg中的偽寄存器

  • 用在調試器里面的虛擬寄存器,像變量一樣
  • $符號開頭
  1. 自動偽寄存器(內置的偽寄存器)

    • 調試器本身設置的
    • 如: $ra , $peb , $teb
  2. 自定義偽寄存器

    • 有20個預設的自定義寄存器: $0 ~~ $19
    • 可用于存儲中間數據的整數變量
    • 可以額外保存類型信息
    • r 命令用來賦值
    • ?? 命令用來輸出

自動偽寄存器

命令描述
$ra當前的堆棧地址
$ip指令指針
$exentry進程入口
$retreg返回值寄存器
$csp調用棧地址
$pebPEB
$tebTEB
$tpid進程ID
$tid線程ID
$ptrsize指針大小
$pagesize分頁大小

WinDbg中的表達式

  • 宏匯編(MASM) 表達式

    • 使用 ? 來計算
    • 每個符號都被視為一個地址
    • 可以使用源碼行表達式, 如myfile.c:43
    • 寄存器的@符號不是必須要寫的
    • 數值默認是16進制的,0n是10進制,0t8進制,0y2進制
  • C++ 表達式

    • 使用 ?? 來計算
    • 符號被理解為某個類的對象
    • 不能使用源碼行表達式
    • 寄存器前必須有@符號
    • 數值默認是10進制的, 16進制以0x開頭

其他操作

在這里插入圖片描述
在這里插入圖片描述

默認的表達式計算方式

在這里插入圖片描述

WinDbg中的重命名

在這里插入圖片描述
例子:
在這里插入圖片描述

調試器命令語言編程

  • 兩大部分
    • 調試器命令
    • 控制流,如(.if, .for, .while )
  • 變量
    • 重命名當作局部變量
    • 偽寄存器作變量
  • $$ 作為行注釋開頭
  • 一對大括號是一個作用空間

控制流

  • 用來循環和條件分支
    在這里插入圖片描述

命令程序執行

  • 方法一: 將所有語句當作單個字符串輸入到命令窗口
  • 方法二: 編譯到文件中,使用命令$$><來執行文件

WinDbg 遠程調試

事件監控

  • 調試器引擎提供了用于監視與響應目標應用程序事件的工具
  • 事件分為兩類:
    1. 異常事件
      • 斷點、訪問違規、堆棧溢出、除零等。
    2. 非異常事件
      • Create Process, Create Thread, Load Module, Unload Module.
  • 調試器會話可訪問時,會有一個lastevent
    • 命令: .lastevent

WinDbg 事件過濾器

  • 提供了簡單的事件過濾

  • 目標應用的事件發生后的響應

  • 使用sx命令來列舉所有事件

  • 中斷或執行狀態:

    • 可能會中斷目標
      1. sxe : first-chance break (原文里這個不太明白) , 啟用 enable
      2. sxd: second-chance break , 不啟用 disenable
      3. sxn:事件發生后輸出日志 , note
      4. sxi:忽略事件, ignore
  • 處理或繼續狀態:

    • 確定在目標中是否應將異常事件視為已處理(gH)或未處理(gN)

事件過濾器對話框

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

事件參數

  • 一些過濾器采用參數來限制它們要處理的事件
  • 無參數就是無限制

在這里插入圖片描述

全局標志 (Global Flags)

Flags? GFlags? Global Flags!

  • GFlags通過編輯Windows注冊表來啟用和禁用功能
  • GFlags設置系統或映象
  • 映象的設置在HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ImageFileName\GlobalFlag
  • 操作系統讀取這些設置并相應地采用其功能
  • GFlags可以從命令行或使用對話框運行
  • 可以在WinDbg 中使用!gflags命令來操作Global Flags
  • 用GFlags可以實現:
    • 堆檢查
    • 堆標記
    • Loader snaps
    • 調試映象
    • 應用驗證
    • 等等等等

Global Flags

安裝了Windows SDK的話會在這里找到Global Flags
在這里插入圖片描述

應用程序驗證器

啟用應用程序驗證器

  • 應用驗證
    • 是Windows應用程序的運行時驗證工具
    • 正在監視應用程序與操作系統的交互
    • 概覽與軌跡跟蹤:
      • 內核對象
      • 寄存器
      • 文件
      • 異常
      • Win32 API
    • 使用!avrf來得到跟蹤信息

應用驗證器的實體

  • GFlags Application Verifier

    • 只有verifier.dll被注入到目標進程中
    • verifier.dll隨被Windows預裝
    • 提供了少量選項子集
  • Application Verifier

    • 從微軟官網免費下載
    • 另外安裝vrfcore.dll、vfbasics.dll、vfcompat.dll等進入Windows\System32
    • 功能強大

應用驗證器的調試符號

  • 應用程序驗證器與PDB一起安裝,具有完整的符號信息
    • 在disassembly窗口里標記源碼信息
    • 這些是我見過的唯一一個帶有完整符號的微軟模塊信息
    • 事實上,WinDbg必須使用這些符號,而不是服務器上的公共符號。否則!avrf擴展無法工作
      .reload /f @"C:\Windows\System32\verifier.pdb

!avrf的常用參數

在這里插入圖片描述

示例 – 使用 !avrf

如果已經安裝了Windows SDK,那么可以在系統中找到Application Verifier,打開Application Verifier,添加應用,在右邊的Tests框中選擇需要測試的項目。
在這里插入圖片描述
點擊Save后,重啟應用,完事之后用WinDbg來調試目標應用。
在這里插入圖片描述
在Modules 里面Reload Application Verifier
在這里插入圖片描述
這樣就會執行.reload /f @"C:\WINDOWS\SysWOW64\verifier.dll"

先看一下Heap相關的操作日志

查看線程

進程轉儲 (Process Dumps)

  • 進程轉儲文件
    • 與非侵入性附著非常相似
    • 表示給定時間進程的快照
    • 大小不同,取決于它包含的內容和信息
  • 利用轉儲文件
    • 我們可以檢查內存以及進程的其他內部結構
    • 我們無法設置斷點或逐步執行程序
  • Dump 一個轉儲文件
    • 我們總是可以將包含更多信息的轉儲“縮小”為包含更少信息的轉儲
    • 像處理實時進程一樣使用.dump命令

Dumps的類型

  • Kernel-mode Dumps
    變體:完整內存轉儲、內核內存轉儲、小內存轉儲

  • Full User-mode Dumps

    • WinDbg中用.dump /f生成
    • 包括進程的整個內存空間、程序的可執行映像本身、句柄表
    • 過去被廣泛使用的微軟正在慢慢放棄對它的支持
  • Minidumps

    • .dump /m??
    • 現代化dumps格式
    • 對轉儲中包含的內容進行細粒度控制(請參閱MSDN:MINIDUMP_TYPE)
    • 盡管有它們的名字有迷你的字眼,但最大的迷你轉儲文件實際上包含的信息比完整的用戶模式轉儲更多。如.dump /mf.dump /ma得到的文件比.dump /f得到的更大更完整。

確定Dump文件的類型

用WinDbg 加載Dump文件,加載成功后會輸出dump文件的類型
在這里插入圖片描述

示例 – 使用.dump命令

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76596.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76596.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76596.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RainbowDash 的旅行

D RainbowDash 的旅行 - 第七屆校賽正式賽 —— 補題 題目大意&#xff1a; 湖中心有一座島&#xff0c;湖的外圍有 m m m 間木屋&#xff08;圍繞小島&#xff09; &#xff0c;第 i i i 間木屋和小島之間有 a i a_i ai? 座 A A A 類橋&#xff0c; b i b_i bi? 座 B …

MySQL-SQL-DDL語句、表結構創建語句

一.SQL SQL&#xff1a;一門操作關系型數據庫的編程語言&#xff0c;定義操作所有關系型數據庫的統一標準 二. DDL-數據庫 1. 查詢所有數據庫 命令&#xff1a;show databases; 2. 查詢當前數據庫 命令&#xff1a;select database(); 3. 創建數據庫 命令&#xff1a;create da…

Sora結構猜測

方案&#xff1a;VAE Encoder&#xff08;視頻壓縮&#xff09; -> Transform Diffusion &#xff08;從視頻數據中學習分布&#xff0c;并根據條件生成新視頻&#xff09; -> VAE Decoder &#xff08;視頻解壓縮&#xff09; 從博客出發&#xff0c;經過學術Survey&am…

TortoiseSVN設置忽略清單

1.TortoiseSVN > Properties&#xff08;如果安裝了 TortoiseSVN&#xff09;。 2. 在彈出的屬性窗口中&#xff0c;點擊 New > Other。 4. 在 Property name 中輸入 svn:ignore 。 5. 在 Property value 中輸入要忽略的文件夾或文件名稱&#xff0c;例如&#xff1a; #…

深入解析Java哈希表:從理論到實踐

哈希表&#xff08;Hash Table&#xff09;是計算機科學中最重要的數據結構之一&#xff0c;也是Java集合框架的核心組件。本文將以HashMap為切入點&#xff0c;深入剖析Java哈希表的實現原理、使用技巧和底層機制。 一、哈希表基礎原理 1. 核心概念 鍵值對存儲&#xff1a;通…

leetcode:1582. 二進制矩陣中的特殊位置(python3解法)

難度&#xff1a;簡單 給定一個 m x n 的二進制矩陣 mat&#xff0c;返回矩陣 mat 中特殊位置的數量。 如果位置 (i, j) 滿足 mat[i][j] 1 并且行 i 與列 j 中的所有其他元素都是 0&#xff08;行和列的下標從 0 開始計數&#xff09;&#xff0c;那么它被稱為 特殊 位置。 示…

《數字圖像處理》教材尋找合作者

Rafael Gonzalez和Richard Woods所著的《數字圖像處理》關于濾波器的部分幾乎全錯&#xff0c;完全從零開始寫&#xff0c;困難重重。關于他的問題已經描述在《數字圖像處理&#xff08;面向新工科的電工電子信息基礎課程系列教材&#xff09;》。 現尋找能夠共同討論、切磋、…

為 Jenkins Agent 添加污點(Taint)容忍度(Toleration)

在 Kubernetes&#xff08;k8s&#xff09;環境中使用 Jenkins 時&#xff0c;為 Jenkins Agent 添加污點&#xff08;Taint&#xff09;容忍度&#xff08;Toleration&#xff09;是一種常見的配置操作&#xff0c;它允許 Jenkins Agent Pod 被調度到帶有特定污點的節點上。下…

LeetCode算法題(Go語言實現)_28

題目 Dota2 的世界里有兩個陣營&#xff1a;Radiant&#xff08;天輝&#xff09;和 Dire&#xff08;夜魘&#xff09; Dota2 參議院由來自兩派的參議員組成。現在參議院希望對一個 Dota2 游戲里的改變作出決定。他們以一個基于輪為過程的投票進行。在每一輪中&#xff0c;每一…

使用python實現視頻播放器(支持拖動播放位置跳轉)

使用python實現視頻播放器&#xff08;支持拖動播放位置跳轉&#xff09; Python實現視頻播放器&#xff0c;在我早期的博文中介紹或作為資料記錄過 Python實現視頻播放器 https://blog.csdn.net/cnds123/article/details/145926189 Python實現本地視頻/音頻播放器https://bl…

用Python和Pygame創造粉色粒子愛心:3D渲染的藝術

引言 在計算機圖形學中&#xff0c;3D效果的2D渲染是一個迷人的領域。今天&#xff0c;我將分享一個使用Python和Pygame庫創建的粉色粒子愛心效果。這個項目不僅視覺效果驚艷&#xff0c;而且代碼簡潔易懂&#xff0c;非常適合圖形編程初學者學習3D渲染的基礎概念。 項目概述…

在匯編層面理解MESI

理解MESI協議在匯編層面的表現需要結合緩存一致性機制和處理器指令執行的行為。以下是分步驟的解釋&#xff1a; 1. MESI協議基礎 MESI是緩存行&#xff08;Cache Line&#xff09;狀態的協議&#xff0c;定義四種狀態&#xff1a; Modified&#xff08;修改&#xff09;&…

愛瑞編程2025暑期CSP集訓營開始招生啦!

一、什么是暑期CSP集訓營&#xff1f; 為全力備戰2025年9月CSP-J/S認證&#xff0c;舉辦的線下編程集訓活動。 旨在通過高強度編程訓練&#xff0c;幫助學員提升競賽能力&#xff0c;沖刺一等獎。 二、為什么參加集訓營&#xff1f; 高效編程特訓&#xff1a;封閉式學習&…

問題大集10-git使用commit提交中文顯示亂碼

&#xff08;1&#xff09;問題 &#xff08;2&#xff09;解決步驟 1&#xff09; 設置全局編碼為 UTF-8 git config --global core.quotepath false git config --global i18n.commitEncoding utf-8 git config --global i18n.logOutputEncoding utf-8 2&#xff09; 顯示或設…

當AI開始“思考“:大語言模型的文字認知三部曲

引言&#xff1a;從《黑客帝國》說起 1999年上映的科幻經典《黑客帝國》描繪了一個令人震撼的未來圖景——人類生活在一個由人工智能構造的數字矩陣中。當我們觀察現代大型語言模型的工作原理時&#xff0c;竟發現與這個虛構世界有著驚人的相似&#xff1a;人們正在用矩陣以及矩…

Golang改進后的任務調度系統分析

以下是整合了所有改進點的完整代碼實現: package mainimport ("bytes""context""fmt""io""log""net/http""sync""time""github.com/go-redis/redis/v8""github.com/robfig/…

前沿技術有哪些改變生活新趨勢

太陽能技術正在改變的生活 它讓移動設備有了新的能源選擇 太陽能板能直接把陽光轉成電能 這對戶外活動或者電力不便的地方特別有用 比如現在市面上有不少太陽能充電寶 小巧便攜 可以隨時給手機平板充電 需要注意的是 這些設備得放在太陽下才能工作 但它們確實能讓人在野外多用…

基于飛槳框架3.0本地DeepSeek-R1蒸餾版部署實戰

深度學習框架與大模型技術的融合正推動人工智能應用的新一輪變革。百度飛槳&#xff08;PaddlePaddle&#xff09;作為國內首個自主研發、開源開放的深度學習平臺&#xff0c;近期推出的3.0版本針對大模型時代的開發痛點進行了系統性革新。其核心創新包括“動靜統一自動并行”&…

C++設計模式-模板方法模式:從基本介紹,內部原理、應用場景、使用方法,常見問題和解決方案進行深度解析

一、基本介紹 模板方法模式&#xff08;Template Method Pattern&#xff09;是行為型設計模式&#xff0c;其核心思想是定義算法骨架&#xff0c;將具體步驟延遲到子類實現。如同烹飪菜譜的標準化流程&#xff1a;所有廚師遵循相同的操作流程&#xff08;備料→烹飪→裝盤&am…

Spring Boot 自定義日志打印(日志級別、logback-spring.xml 文件、自定義日志打印解讀)

一、Logback 在 Spring Boot 中&#xff0c;日志框架默認使用的是 Logback&#xff0c;Spring Boot 提供了對日志配置的簡化 Spring Boot 默認會將日志輸出到控制臺&#xff0c;并且日志級別為 INFO 可以在 application.yaml 或 application.properties 文件中進行日志配置 …