windbg的使用
windbg的使用
这两天在看简单的汇编,想起来很早之前用windows的时候使用的bluescreen分析工具和windbg。 在win10的电脑上安装了下,大概700Mb的样子。配好了symbol,用notepad做下测试。
读取notepad内存
- 打开notepad,在里面写上一些话。
- 打开windbg x64,attach 到notepad这个进程
- 可以有多种方式找到notepad所使用的内存空间
- !address指令可以找到所有的,这里面有notepad的进程
- lm m notepad,这个指令可以找到notepad所使用的起始的内存地址
- !heap -a,这个指令显示notepad所使用的堆列表
- 以!heap -a为例
- 看到index1的起始地址为:1febb0a0000
- 增加一个偏移量1000,然后进行搜索,s -u 1febb0a0000 L0001000 “wo“
- 结果是这样的:000001fe`bb0a3e00 0077 006f 0020 006c 0065 0020 0067 0065 w.o. .l.e. .g.e.
- du du 000001fe`bb0a3e00
- 结果是这样的:000001fe`bb0a3e00 “wo le ge qu ..你好..o “
- 导出文件
- .writemem d:\demo2.txt 000001fe`bb0a3e00
查看系统崩溃的原因
- 确保windows中打开了当系统崩溃时候生成dump文件的选项,否则系统崩溃蓝屏后没有可分析的文件
- 用windbg打开由于蓝屏而产生的dump文件,一般以dmp结尾,在系统文件夹内
- 打开后会看到系统的运行时间
- 利用!process 0 0,可以查看系统启动了哪些进程
- 利用!analyze -v命令,让windbg自动帮忙分析蓝屏的原因,一般会给出停止码,unexpected_kernel_mode_trap。
- 根据停止码的信息可以做个简单的判读
- 比如停止码为7f,表示double fault,双重出错,操作系统一般可以纠错或者放弃错误的指令,但是如果出现多次错误,操作系统会将这个标记为“不可解决”的异常,然后启动自我保护措施。
- 一般连续的两次页错误会触发7f,连续两次通用保护错误也会触发。但是断点和调试这样的不会。
- 根据!analyze -v还能看到可能导致异常的指令,可以根据这个指令往下推理
- 执行heap的回溯:k,会看到原始的指令,根据这个指令需要去看程序的源码来定义程序的问题
- 要细心的检查windbg给出的警告信息
- 获取在蓝屏时候的进程:!process
- 利用kvn获取详细的stack信息
- 用!pte观察内存地址,用以判断内存地址的有效性
- 一般如果发现push信息为导致蓝屏的原因的时候,要查看esp所指向的栈内存,是否栈指针指向了无效的内存或者正在使用的内存。
- 因为线程信息中包含栈信息,所以用!thread来检查
- 例如 stack init f6560000 current f655de8c base f6560000 limit f655d000
- 这里栈的基地址是f6560000,边界是f655d000,栈是从高地址往低地址排列的,使用的越多,栈指针越接近低地址。直到降到边界。
- 使用ln 地址的方式可以找到该地址所对应的符号,也即当前函数的父函数名称。知道了函数名,就可以找到对应的源代码来进行修改。