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

示例dump分析:未捕获异常

代码

分析步骤

  1. 使用!analyze -v

  1. 看到异常代码是e06d7363
    1. 对应着CPP_EH_EXCEPTION
    2. 触发场景一般为,C++ 托管扩展(/clr)中的异常
  2. 使用.exr -1查看异常记录

  1. 使用kn查看栈

  1. 可以看到是28Crash函数里面

验证观察

总结

内存观察相关

db

dw

dd

dq

  1. 以四字(8 字节)为单位显示
    1. 显示从当前堆栈指针(ESP 寄存器指向的地址)开始的内存内容
    2. x64 架构下,堆栈指针是 RSP64 位寄存器),其存储的地址是 8 字节
    3. 因此用 dq(以 8 字节为单位显示)来查看堆栈内存

dc

da

du

dds

  1. WinDbg中,dds命令用于以DWORD(4字节)为单位显示内存,并尝试将每个DWORD解释为可能的符号地址
    1. 这类似于dd,但增加了符号解析的功能
  2. 示例:
    1. 例如,第一行地址是00000000 0014f9b0,该地址的值是`0014fba8

  1. 32位程序,ddsdps输出相同,dps更通用。64位程序必须使用dps

dps

!address

!vprot

s

dt

  1. 查看结构体

其他总结

int 3

  1. 调试中断

nop dword ptr [rax+rax]

  1. 概述
    1. NOPNo Operation)指令表示“无操作”,通常用于填充代码、对齐指令边界或占位
    2. 单字节 NOP 的机器码是 0x90
  2. 汇编
    1. dword ptr 表示操作数是一个 4 字节(双字)的内存地址
    2. [rax+rax] 是内存寻址表达式,等效于 [rax*2]
  3. 效果
    1. 虽然语法上涉及内存访问,但 CPU 不会真正读写 rax*2 指向的内存
    2. 这条指令的实质是通过复杂的寻址形式生成一个多字节的 NOP,仅用于占用指令空间
  4. 为什么?
    1. 现代 CPU 对指令对齐敏感。
    2. 通过插入多字节 NOP(如 5 字节、7 字节),编译器可使后续指令(如循环入口)对齐到 16/32 字节边界,提高指令预取和解码效率

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

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2025-03-27
Everything will be better.

发表评论

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