监视窗口:
@@(poi(0ffb6bae0))
显示0ffb6bae0指向的值. 具体可以参照windbg的命令语法写一个很复杂的命令.
@@(eax)
监视器窗口添加eax的值
@$peb @$teb @$ip
监视窗口添加peb teb eip的值
@$proc
监视窗口添加 eprocess的结构信息
条件断点:
bp kernel32!CreateFileW+0×5 “dU /c 50 poi(@ebp+8) ;gc”
断在CreateFileW, 然后打印第一个参数. 也就是文件名称了还可以这样
bp kernel32!OpenFileMappingW+5 “kv 10;dU /c 30 poi(@ebp+10)”
更可以这样
bp kernel32!CreateFileW+0×5 “dU /c 50 poi(@ebp+8) ;gu; r eax; gc”
更牛逼的是这样, 加个判断
bp kernel32!CreateFileW+0×5 “dU /c 50 poi(@ebp+8) ;gu; r eax; .if (@eax < 0 ) {.echo hit }.else{gc}”
字符串条件断点(OllyDbg):
使用快捷键:Shift+F2设置条件断点,在条件中输入。
ASCII字符集字符串设置方法:
代码:
STRING [eax] == "DDLX_CHAR" STRING [eax] == "DDLX_char" //不区分大小写 STRING [eax] == "DDLX" //不区分文本长度
UNICODE字符集字符串设置方法:
代码:
UNICODE [eax] == "DDLX_WCHAR" UNICODE [eax] == "DDLX_wchar" //不区分大小写 UNICODE [eax] == "DDLX" //不区分文本长度
字符串条件断点(Windbg):
//全字符串匹配,区分大小写 bp 0041141d "r @$t1 = eax; as /ma ${/v:pzString} $t1;.if ($scmp(\"${pzString}\",\"DDLX_CHAR\")==0) {} .else {gc}"
//全字符串匹配,不区分大小写 bp 0041141d "r @$t1 = eax; as /ma ${/v:pzString} $t1;.if ($sicmp(\"${pzString}\",\"DDLX_char\")==0) {} .else {gc}"
//字符串还可以模糊匹配,*表示0-?个模糊字符 bp 0041141d "r @$t1 = eax; as /ma ${/v:pzString} $t1;.if ($spat(\"${pzString}\",\"DDLX*\")==0) {} .else {gc}"
UNICODE字符集字符串设置方法:
bp 0041141d "r @$t1 = eax; as /mu ${/v:pzString} $t1;.if ($scmp(\"${pzString}\",\"DDLX_WCHAR\")==0) {} .else {gc}"
可以看到, 就是一个/mu /ma的区别. 看看windbg的帮助, 发现还有很多其他样式可供选择.
打印线程堆栈, 线程LastError值
~*e ? @$tid;!gle
~*e ? @$tid;kv
~* k( ~* kv ) 打印所有线程堆栈
显示进程中每个线程的的iD和LastError值.
过滤命令窗口输出信息
.prompt_allow -reg +dis -ea -src -sym
异常处理相关
有 sx, sxd, sxe, sxi, sxn, sxr 几条命令可用来设置异常和事件的处理方式。比如:
0:000> sxe ld
可以在加载 dll 时中断下来。
调试运行相关:
gn 强制返回已经处理了异常
gh 跳过异常处理使用程序自带的异常处理.
ba 硬件断点
dl 遍历链表 如 dl nt!PsActiveProcessHead 1000
dt -r3 nt!_KPCR 显示结构遍历3层.
.call 调用目标程序的函数.
进程线程相关
!dml_proc 也用来显示进程信息,不带参数时直接显示进程列表,比!process 0 0 命 令显示的格式要紧凑好看点, 是一条霸气侧漏的语句
!thread 列出当前线程信息
!cs 显示互斥量信息
.thread 地址 切换到某个线程
内存命令
!address 命令显示内存信息,如内存范围、内存权限等。
!vm 标号 命令显示虚拟内存信息
!memusage 命令显示物理内存信息
!pte 命令显示指定地址对应的页表项(PTE)和页目录项(PDE)。
!pfn 命令显示物理内存页的详细信息,指定页面帧编号为参数
!db/!eb 命令用来显示、修改物理内存,类似的还有!dd/!dc/!dq/!ed 等
!vprot address 显示某个地址所在的模块属性.
写代码的时候记得列出标号是多么重要
!pool 命令显示内核内存池信息
!poolused 命令按照内存池 Tag 显示内存池信息。
!poolfind 命令显示所有指定 Tag 的内存信息
对象相关命令
!handle 命令显示句柄信息,包括句柄类型、句柄引用计数、句柄名等
!object 命令显示对象信息。
!object xxxxxxx 命令显示指定对象的信息,xxxxxxxx 表示对象地址
!drvobj 命令显示驱动信息,主要是显示 DRIVER_OBJECT 结构的信息
!devobj 命令显示驱动设备信息,主要是显示 DEVICE_OBJECT 结构信息。
蓝屏Dump相关命令
!analyze -v 命令是分析蓝屏 dump 时首先应该执行的命令,该命令会显示蓝屏原因、蓝屏上下文等,并会根据
蓝屏原因自动进行相关的分析,给出进一步分析的建议。
.ecxr 命令会回到异常产生的地方.
查看目标机(底层相关命令)
vertarget 命令可以显示目标系统的基本信息,如系统版本、计算机名、内核基址等
dg 命令主要显示选择子的详细信息
!cpuinfo 命令显示CPU 信息
!pcr 命令显示处理器控制域(Processor Control Region)信息,也就是KPCR 结构信息,每个CPU 对应一个KPCR 结构,可以在命令中指定需要显示的CPU 序号,不指定则显示当前CPU 的PCR 信息。
!prcb 命令显示处理器控制块(Processor Control Block)信息,也就是KPRCB 结构信息,同样,每个CPU对应一个KPRCB 结构,该结构紧接在KPCR 结 构后面,由KPCB 结构中的PrcbData 表示。命令中可以指定CPU 序号。
!idt 命令显示中断服务表,可以指定中断号显示,也可以显示全部的中断服务表
!irql 命令显示目标系统中断到WinDbg 时的中断请求级(IRQL),在 Windows2003 及以后的系统上可用,调试和IRQL 相关的程序时可能会用
!running 命令显示所有CPU 上正在运行的线程信息,便于了解系统当前的情况,如果 是分析蓝屏文件,则可以 看到蓝屏时系统正在执行什么线程。
!gflag 命令显示、设置系统全局标志,用于控制系统行为,和WinDbg 自带的gflags.exe 工具类似,不过设置 后只对当前调试会话有效。