windbg的使用

windbg的使用

这两天在看简单的汇编,想起来很早之前用windows的时候使用的bluescreen分析工具和windbg。 在win10的电脑上安装了下,大概700Mb的样子。配好了symbol,用notepad做下测试。

读取notepad内存

  1. 打开notepad,在里面写上一些话。
  2. 打开windbg x64,attach 到notepad这个进程
  3. 可以有多种方式找到notepad所使用的内存空间
    1. !address指令可以找到所有的,这里面有notepad的进程
    2. lm m notepad,这个指令可以找到notepad所使用的起始的内存地址
    3. !heap -a,这个指令显示notepad所使用的堆列表
  4. 以!heap -a为例 img
  5. 看到index1的起始地址为:1febb0a0000
  6. 增加一个偏移量1000,然后进行搜索,s -u 1febb0a0000 L0001000 “wo“
    1. 结果是这样的:000001fe`bb0a3e00 0077 006f 0020 006c 0065 0020 0067 0065 w.o. .l.e. .g.e.
  7. du du 000001fe`bb0a3e00
    1. 结果是这样的:000001fe`bb0a3e00 “wo le ge qu ..你好..o “
  8. 导出文件
    1. .writemem d:\demo2.txt 000001fe`bb0a3e00

查看系统崩溃的原因

  1. 确保windows中打开了当系统崩溃时候生成dump文件的选项,否则系统崩溃蓝屏后没有可分析的文件
  2. 用windbg打开由于蓝屏而产生的dump文件,一般以dmp结尾,在系统文件夹内
  3. 打开后会看到系统的运行时间
  4. 利用!process 0 0,可以查看系统启动了哪些进程
  5. 利用!analyze -v命令,让windbg自动帮忙分析蓝屏的原因,一般会给出停止码,unexpected_kernel_mode_trap。
  6. 根据停止码的信息可以做个简单的判读
    1. 比如停止码为7f,表示double fault,双重出错,操作系统一般可以纠错或者放弃错误的指令,但是如果出现多次错误,操作系统会将这个标记为“不可解决”的异常,然后启动自我保护措施。
    2. 一般连续的两次页错误会触发7f,连续两次通用保护错误也会触发。但是断点和调试这样的不会。
  7. 根据!analyze -v还能看到可能导致异常的指令,可以根据这个指令往下推理
  8. 执行heap的回溯:k,会看到原始的指令,根据这个指令需要去看程序的源码来定义程序的问题
  9. 要细心的检查windbg给出的警告信息
  10. 获取在蓝屏时候的进程:!process
  11. 利用kvn获取详细的stack信息
  12. 用!pte观察内存地址,用以判断内存地址的有效性
  13. 一般如果发现push信息为导致蓝屏的原因的时候,要查看esp所指向的栈内存,是否栈指针指向了无效的内存或者正在使用的内存。
  14. 因为线程信息中包含栈信息,所以用!thread来检查
    1. 例如 stack init f6560000 current f655de8c base f6560000 limit f655d000
    2. 这里栈的基地址是f6560000,边界是f655d000,栈是从高地址往低地址排列的,使用的越多,栈指针越接近低地址。直到降到边界。
  15. 使用ln 地址的方式可以找到该地址所对应的符号,也即当前函数的父函数名称。知道了函数名,就可以找到对应的源代码来进行修改。
| 访问量:
Table of Contents