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.mzph.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 文件中进行日志配置 …