windbg文档网页:
https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/
windbg官网:
http://windbg.org/
windbg preview官方文档:
CSDNl下载: https://download.csdn.net/download/qq_33522888/12263017
百度网盘链接:https://pan.baidu.com/s/1wJ1RYnjMnTEqO5yZJeL7XQ
提取码:oens
参考网站:
https://www.stl-tec.de/tutorials/WinReverseEng/setup/
三类命令:
1.基本命令
2.元命令: 总是以"."开头
3.扩展命令: 外部扩展模块加入的命令,总是以"!"开头
.cls
清屏(最重要的指令)
?
列举所有基本命令
.help [/D]
列举所有原命令
!模块名.help
列举指定扩展模块的所有扩展命令
.chain [/D]
给出扩展命令集的链表。前两行显示扩展模块的搜索路径,后面列出自带的扩展模块。
!模块名.help
列出该模块的扩展命令列表(绝大多数模块可以)
.load/.unload
动态加载/卸载第三方扩展调试模块
.prefer_dml 1
开始DML
.prefer_dml 0
关闭DML
反汇编:
u [地址] 进行反汇编
ub [地址] 倒着反汇编
uf [函数地址]:对nt模块的函数进行反汇编
uf [模块名!函数地址]:反汇编函数
uf /i [函数地址/模块名!函数地址]:反汇编并显示共有多少条指令
例如:
u IofCallDriver L5:显示五行的IofCallDriver的反汇编代码
uf /i nt!PspProcessOpen
ln 地址
搜索距离指定地址最近的符号
.dml_flow 地址A 地址B
从地址A到地址B进行反汇编,能画出流程图
!dml_proc [进程号|进程地址]
内核模式下用于查看指定进程信息,用户模式下只能查看被调试进程信息
version
查看软件版本、启动参数、软件设置命令
vertarget
列出当前调试系统的版本系统
.time
查看系统时间,以及系统正常运行持续时间,用户模式下还会显示当前进程的持续时间
n [8|10|16]
查看当前数字进制/修改数字显示为8/10/16进制
.effmach [x86/amd64/ia64/ebc]
查看当前处理器模式/修改处理器模式为x86/amd64/ia64/ebc
在Processes and Threads工作窗口下可以查看系统序号、进程序号、线程序号
切换当前调试系统:
||<system_index> s
切换当前调试进程:
|<process_index> s
切换当前调试线程:
~<thread_index> s
x64切换到x86模式下:
.load wow64exts
!sw
再切换回x64模式下:
!ws
.formats 整数
将一个整数以各种格式显示,包括:16进制、10进制、8进制、二进制、字符串、日期、
浮点数等
将windbg调试器附加到进程上:
.attach PID
windbg -p PID
windbg -pn 进程名
用windbg调试器启动进程调试:
.create 程序启动命令行
windbg 程序启动命令行
.dump 文件名
保存到dump文件
.dump /ma "d:\mydmpfile.dmp"
将当前调试进程输出到dump文件
.opendump 文件名
打开dump文件
.detach
结束当前调试会话,解挂后,被调试进程能够独立运行
qd
结束当前调试会话,解挂后,被调试进程能够独立运行
q|qq
结束调试,windbg和被调试进程一起关闭
.crash
内核调试时引发一个系统蓝屏,并生成dump文件
.reboot
内核调试时使系统重启,不产生dump文件
查看当前堆栈:
1.kv
提示FPO信息,ChildEBP、retaddr、前三个参数
2.kb
ChildEBP、retaddr、前三个参数
3.kp
全参数(需要所有符号)
e命令修改内存:
eb/ed/eq [地址] 数值
ea [地址] 数值 ASCII字符串
eu [地址] 数值 UNICODE字符串
lm/lmD:
lm [选项] [a Address] [m Pattern | M Pattern]
lmD [选项] [a Address] [m Pattern | M Pattern]
(1)/v选项能列出模块的详细信息
(2)参数[a Address]只有指定地址所在的模块能够被列出
(3)参数[m Pattern | M Pattern]通过模块名称通配符列出模块
例子:
lm m *o* 将显示所有名称中包含字母o的模块
lmva 00400000 显示地址00400000所在模块的详细信息
lmvm *nt* 显示名字中包含nt的模块的详细信息(注意exe、dll等都不要带后缀名)
lmf 显示所有模块的信息(包含模块的文件路径)
!lmi uxtheme 想要了解uxtheme.dll的详细调试文件(PDB)信息
lmv 列出所有模块(加载和未加载)对应的符号信息
!dlls [选项] [LoaderEntryAddress]
选项:
-i/-l/-m: 排序方式,分别按照初始化顺序、加载顺序、内存起始地址顺序排列
-a: 列出镜像文件PE结构的文件头、Section头等详细信息
-c LoaderEntryAddress: 指定函数所在的模块
.reload /l
列出模块
!imgreloc
列出模块列表并显示模块是否处于preferred地址范围内
!lmi 地址
获取地址所在的模块对调试器有用的信息
!dh 模块地址
显示模块的PE头信息
!dh -a 模块地址
显示模块的PE结构详细信息,包括导入导出表内的函数
.sympath
显示当前符号路径
.sympath [路径]
设置符号路径
.sympath+ [路径]
添加新的符号路径
注: 使用.sympath改变符号路径之后,需要用.reload更新已加载的符号文件
例子:
.sympath+ SRV*D:\symbols\currentsymbols*http://msdl.microsoft.com/download/symbols
.symopt
查看当前符号选项
.symopt +/- Flags
开启/关闭符号选项
ld 模块名 [/f 符号文件名]
调试器默认采用延迟模式加载符号,ld使得延迟模式被打破,让指定模块的符号文件立刻加载到调试器中。/f表示即使符号不匹配也要强制加载。
此指令可为模块的符号文件设置自定义的匹配名称。
例子:
ld 123 /f abc
强制将abc.pdb作为123.exe的符号文件
ld *
强制加载所有模块的符号文件
ld kernel32
强制加载kernel32模块的符号文件
.reload 为所有已加载模块载入符号信息
.reload命令的作用是删除指定或所有已加载的符号文件,默认情况下,调试器不会立刻根据符号路径重新搜索并加载新的符号文件,而是推迟到调试器下一次使用到此文件时
.reload [参数] [模块名]
参数:
/u: 卸载符号
/f: 迫使调试器立刻搜索并重新加载新的符号文件
/v: 将搜索过程中的详细信息都显示出来
/i: 不检查pdb文件的版本信息
/l: 只显示模块信息
/n: 仅重载内核符号,不重载用户符号
/o: 强制覆盖符号库中的符号文件,即使版本相同
/d: 用户层模式下使用Windbg时的默认选项,重载调试器模块列表中的所有模块;
/s: 内核模式下使用Windbg时的默认选项,重载系统模块列表中的所有模块,另外,如果调试器在用户模式下运行,要加载内核模块,也必须使用/s选项,否则调试器将只会在调试器模块列表中搜索而导致找不到内核模块
/u: 卸载指定模块。如发现当前符号版本不对,使用/u开关先卸载之再重新加载
例子:
.reload /f 用户/内核模式下强制重新加载符号文件
.reload /f /user 内核模式下强制重新加载用户层程序的符号文件
.reload /u 卸载所有符号
.reload /i 重新加载不匹配符号的模块(dmp文件没有对应的pdb时使用)
.reload /i TGame.exe 重新加载不匹配符号的TGame.exe
.reload /f @"c:\windows\System32\verifier.dll" 为指定模块加载符号信息
.reload /f TGame.exe 为TGame.exe加载符号信息
!chksym <模块名> [符号名]
验证一个模块的符号文件
符号全局搜索:
x [选项] 模块名!符号名
选项:
/D: 以DML格式显示
/f: 将只显示函数符号,并且会显示函数的详细定义
/d: 显示更多的变量类型相关信息
/t: 显示符号的数据类型
/v: 显示符号的类型和大小
控制显示结果的排列顺序: /a和/A分别按地址的升序和降序,/n和/N分别按名称的升序和降序,/z和/Z分别按符号大小的升序和降序
模块名和符号名都可以包含通配符,*代表0或任意多个字符,?代表任一单一字符,#代表前面的一个字符可以出现任意次,如果中间允许多个字符重复,用方括号
例子:
x kernel32!a*
x /D *!*NtCreateFile*
x MyModule!GlobalVariableName 查看模块MyModule中名为GlobalVariableName的全局变量
x *! 列出所有模块对应的符号信息
x ConsoleTest!* 列出ConsoleTest模块中的所有符号
x ConsoleTest!add* 列出ConsoleTest模块中的所有add开头的符号
x /t /v ConsoleTest!* 带数据类型、符号类型和大小信息,列出ConsoleTest模块中的所有符号
x kernel32!*LoadLib* 列出kernel32模块中所有含LoadLib字样的符号
.srcpath
显示当前源码路径
.srcpath <路径信息>
设置源码路径
.srcpath+/- <路径信息>
添加/删除源码路径
.srcnoisy [1|0]
显示/开启/关闭“嘈杂的源码”(在调试时会显示很多信息)
代码行选项:
l+[选项] 打开
l-[选项] 关闭
例子:
l+t 源码模式
l-t 汇编模式
l+* 打开所有行选项(效果会很不错)
查看进程简略信息:
.tlist [选项] [进程名]
显示当前系统中的进程列表/显示指定进程名的进程信息,内核模式和用户模式都可使用
.tlist -v
显示进程详细信息
.tlist -c
只显示当前进程信息
内核模式下查看进程详细信息:
!process 显示进程信息
!process PID 获取进程号为PID的进程信息
!process -1 0 获取当前进程的简略信息
!process 0 0 SoftMgr.exe 获取进程名为SoftMgr.exe的信息
!process 0 0 查看所有进程信息,包括EPROCESS地址和DirBase
!process 0 7 查看所有进程的详细信息
!process EPROCESS地址 查看进程信息
!process EPROCESS地址 0 获取进程简略信息
!process EPROCESS地址 7 查看进程详细信息
查看进程环境块:
!peb
用户模式下显示当前进程的PEB信息
!peb [PEB地址] / dt nt!_peb [PEB地址]
内核模式下显示环境块详细信息(内核模式下可通过!process命令获取PEB地址)
内核模式下进程切换:
.process
显示当前进程EPROCESS地址
.process [EPROCESS地址]
切换进程
.context
显示当前页目录地址
.context [页目录地址]
切换页目录地址,页目录地址就是!process命令中显示的DirBase值
内核模式下线程切换
.thread [ETHREAD地址]
~
列出当前被调试进程的所有线程
~2
查看2号线程信息
~2s
切换到2号线程
~~[11a0]s
切换到线程ID为11a0的线程
~2f
将2号线程冻住(freeze)
~2u
将2号线程解冻(unfress)
~2n
增加2号线程的挂起计数(suspend)
~2m
减少2号线程的挂起计数(resume)
!teb [TEB地址]
查看线程环境块信息
~k
显示当前线程的线程栈信息
~2k
显示2号线程的线程栈信息
~*k
显示所有线程栈信息
~r
显示当前线程的寄存器信息
~2r
显示2号线程的寄存器信息
~*r
显示所有线程的寄存器信息
~*e 命令
对每个线程执行指定命令
例子:
~*e k;r
对每个线程中,分别执行k指令(栈指令)和r指令(寄存器指令)
显示线程运行时间:
.ttime
显示当前线程的创建日期、用户模式时间、内核模式时间
!runaway 7
显示所有线程的用户模式时间、内核模式时间、总运行时间
调试事件设置:
sx
列出针对当前调试目标的异常或非异常事件的处理
sxr
恢复到对调试事件的默认设置
.lastevent
显示最近发生的一次调试事件
sx{e|d|n|i} [-c "Cmd1"] [-c2 "Cm2"] [-h] {Exception|Event|*}
(1)
如果没有-h开关,就是设置中断状态,
其中e|d|n|i分别对应着Enabled|Disabled|Output|Ignore
Enabled:第一轮和第二轮都中断给用户
Disabled:第一轮不中断,第二轮中断
Output:输出信息通知用户,不中断
Ignore:忽略事件,不中断
如果有-h开关,就是设置处理状态,sxe命令设置的处理状态是Handled,其他sxd|sxn|sxi都是设置为Not Handled
(2)
-c和-c2分别用来定义第一轮处理和第二轮处理的关联命令
(3)
Exception|Event|*用来指定命令所针对的是异常或者事件
例子:
加载内核模块时下断
sxe ld:MyDriver 驱动MyDriver加载前下断
sxn ld:MyDriver 驱动MyDriver加载时不会中断,但会显示一条相关信息
sxi ld:MyDriver 取消对MyDriver加载时的设置
卸载驱动时下断
sxe ud:MyDriver 驱动MyDriver卸载前下断
sxn ud:MyDriver 驱动MyDriver卸载时不会中断,但会显示一条相关信息
sxi ud:MyDriver 取消对MyDriver卸载时的设置
当调试器因异常而中断时,可以返回与设置不同的状态:
gh
异常已经处理(Handled)
gn
异常没有处理(Not Handled)
.bugcheck
内核模式下显示当前bug check的详细信息
!analyze -v
显示最近异常事件的详细信息
!analyze -hang
分析死锁。另一个分析死锁的命令是!locks
内核模式下,分析内核锁和DPC栈
用户模式下,分析线程的调用栈
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2020-6-29 11:02
被TechForBad编辑
,原因: 添加内容