• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2025-03-27 17:51 Aet 隐藏边栏 |   抢沙发  7 
文章评分 1 次,平均分 5.0

!analyze -v

概述

  1. 用于 自动分析当前异常或崩溃的根本原因,并输出详细的诊断信息
  2. 它是调试程序崩溃、蓝屏(BSOD)或未处理异常的首选工具

功能

  1. 分析当前异常类型(如访问违规、除零错误等),定位触发异常的代码位置
  2. 提供异常上下文、调用栈、寄存器状态、可能原因及建议操作

!exchain

概述

  1. 用于 显示当前线程的异常处理链,即结构化异常处理(SEH)的链表。它能帮助开发者快速定位异常处理流程中的关键节点,尤其在调试崩溃、访问违规等问题时非常有用

作用

  1. 展示当前线程的异常处理器(EXCEPTION_REGISTRATION_RECORD)链表
  2. 当异常未被捕获时,操作系统会沿异常链依次调用处理函数,!exchain 可追踪此过程

.exr -1

概述

  1. 用于 显示当前线程最近一次异常记录(Exception Record)的详细信息
  2. 是调试崩溃、访问违规等异常的核心工具之一

功能

  1. 展示异常类型、触发地址、参数等关键信息

参数

  1. -1:显示当前线程的 最新异常记录**(最近一次未处理的异常)
  2. 0:显示第一个异常记录(多异常场景)
  3. 1:显示第二个异常记录,依此类推

.ecxr

概述

  1. 用于 恢复并显示当前线程的异常上下文(Exception Context
    1. 当程序崩溃或触发异常时,调试器可能无法直接展示异常发生时的完整状态(如寄存器、堆栈等)
    2. .ecxr 能还原异常触发瞬间的上下文信息,帮助开发者准确分析问题根源

功能

  1. 加载异常发生时的寄存器状态(riprsp 等)和堆栈信息
  2. 自动输出异常地址、寄存器值及调用栈

.frame

概述

  1. 用于 切换当前栈帧(Stack Frame)的上下文,使开发者能够查看不同调用层级的局部变量、参数和寄存器状态
    1. 通过切换栈帧,可以逐层分析函数调用链中的问题

功能

  1. 指定当前调试的栈帧层级(如 0 为最内层,1 为上一层)
  2. 结合 dvdt 命令显示当前栈帧的局部变量
  3. 显示该栈帧对应的寄存器和堆栈信息

k系列-查看栈

概述

  1. 用于 分析和显示调用栈(Call Stack),是调试崩溃、死锁、逻辑错误的核心工具

k

  1. 显示当前线程的调用栈

kb

  1. 显示调用栈及 前三个参数(适用于快速查看函数参数值)

kp

  1. 显示调用栈及 完整参数列表和类型(需符号支持)

kn

  1. 显示调用栈并 添加帧编号(便于后续操作,如 .frame

kv

  1. 显示调用栈及 寄存器和帧指针信息(适用于低级调试)

切换到指定栈帧

显示完整调用栈

过滤调用栈

  1. 结合 .shell 过滤特定模块:

d系列-查看内存

概述

  1. 显示给定范围的内存内容

db

  1. 以 字节(Byte)形式显示内存,并尝试将每个字节解析为 ASCII 字符
  2. 非打印字符(如 0x000xFF)会显示为 . 或其他符号

dw

  1. 查看 数值数据(如整数、指针、结构体字段)
  2. 默认以 十六进制数值 形式展示
    1. 仅显示数值,不解析为字符
    2. 由于一个 WORD 包含 两个字节,直接解析为字符可能无意义(除非数据是 Unicode 字符串)
  3. 对于占用2个字节的字符(UTF-16),需要用dc命令解析
  4. 对于占用4个字节的字符,由于使用极少,windbg无直接支持
  5. 另外,结合上面db的打印内容,是小端模式,详细见下面大端小端问题

dd

  1. 查看 数值数据(如整数、指针、结构体字段)
    1. 分析指针或地址
    2. 检查结构体字段
    3. 调试数值型数据

  1. 示例:查看结构体
    1. dq对比发现,dd4个字节来显示,dq8个字节来显示

dq

  1. 查看 数值数据(如整数、指针、结构体字段)
    1. 分析指针或地址
    2. 检查结构体字段
    3. 调试数值型数据

  1. 示例:查看结构体
    1. 小端

dc

  1. 一个专为 查看内存中的 Unicode (多字节)字符串 设计的实用工具
    1. DWORD + ASCII 混合形式显示
  2. 将内存中的 每 2 字节 视为一个 UTF-16 字符,并将每 4 字节(即两个 UTF-16 字符)组合成一个 DWORD 显示

du

  1. 用于 直接显示内存中的 Unicode 字符串(UTF-16 编码) 的工具
    1. 它会自动解析内存中的宽字符(wchar_t)数据,并以可读的字符串形式输出,无需手动计算长度或处理字节序
  2. 示例:直接用显示的地址查看

  1. 示例:通过变量名来输出

da

  1. 用于 显示以空字符(\0)结尾的 ASCII 字符串 的工具
    1. 它会从指定地址开始,持续输出内存中的 ASCII 字符,直到遇到终止符 \00x00

dds

  1. 用于 显示内存中的 DWORD4字节)数据并自动解析符号名称
    1. 它特别适合分析指针、函数地址或全局变量,能显著提升调试效率
    2. 详细用法与下面的dqs类似

dqs

  1. 用于显示内存中的QWORD(四字,8字节)数据,并尝试将这些数值解析为符号地址
    1. 以十六进制形式显示指定地址开始的QWORD数据
    2. 将每个QWORD视为一个地址,并查找对应的符号名称(如函数名、全局变量名)
    3. 调试指针数组、虚函数表、全局变量地址等需要符号信息的场景
  2. 示例如下:
    1. 显示Crash函数相关符号

dps

  1. 用于 显示内存中的指针数据并自动解析符号名称
    1. 以指针大小(32 位系统为 4 字节,64 位系统为 8 字节)为单位显示内存数据
    2. 将每个指针值视为地址,并尝试解析为符号名称(如函数、全局变量)
    3. 根据调试目标自动选择 32 位(DWORD)或 64 位(QWORD)解析

dt

  1. 用于 显示符号的类型信息,例如结构体、联合体、类的成员布局,以及全局变量的类型
    1. 能够帮助开发者快速理解内存数据的结构,是调试复杂数据结构的关键工具
  2. 查看结构体、类、联合体的成员及其偏移量
  3. 根据内存地址显示某个类型实例的具体数据
  4. 显示嵌套结构或数组的详细信息
  5. 按名称模糊匹配类型或变量

s-搜索内存

概述

  1. 在内存中搜索指定的字节序列或字符串
  2. 它是调试内存损坏、数据查找或逆向分析的关键工具

标志

  1. -a
    1. 搜索 ASCII 字符串(默认以 \0 结尾)
  2. -u
    1. 搜索 Unicode 字符串(双字节,默认以 \0\0 结尾)
  3. -b
    1. 搜索二进制字节序列(以十六进制表示)
  4. -o
    1. 输出匹配项的偏移量(而非完整内存内容).
  5. -v
    1. 反向搜索(显示不匹配的内容,较少用)

搜索ASCII字符串

其他相关

打印局部变量地址

  1. 切换到对应的帧

  1. 列出局部变量

  1. 查看某个变量地址

大端小端问题

  1. 小端
    1. 低地址存低位字节
    2. x86/x64 架构默认
  2. 大端
    1. 高地址存低位字节
    2. 如网络协议、某些嵌入式系统
  3. 按照上述db dw的打印,示例分析如下:
    1. 内存中的字节顺序(来自 db):6974
    2. 低字节 0x69 → 高位字节 0x74
    3. 数值 = 0x74 << 8 | 0x69 = 0x7469
    4. 正是 dw 显示的 7469
  4. 简单总结判断:
    1. dbdw打印显示的字节顺序相反,则是小端模式
    2. dbdw打印显示的字节顺序相同,则是大端模式

怎么查看符号地址,如函数,局部变量,全局变量

  1. 使用x命令查看函数地址

  1. 使用x命令或dqs命令查看全局变量地址

  1. 查看局部变量

  1. 计算表达式地址

  1. 使用dv /v查看局部变量和地址

  1. 使用dv /i /v查看
    1. pre 表示该变量是当前函数作用域内的 私有变量(即局部变量)
    2. local直接表明这是一个 局部变量
    3. 其他的,如:
      prm函数参数
      gbl全局变量

已知地址,怎么查看对应符号

  1. 使用ln

  1. 使用u进行反汇编

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享