一丶驱动的调试.
编写驱动免不了调试.所以这里介绍一下WinDbg的常用命令.
1.线程
命令 |
作用 |
~* |
显示所有线程 |
~. |
显示当前活动线程 |
~# |
显示当前异常线程 |
~ num |
显示第num个线程. |
~ num s |
切换到第num个线程 |
~*kb |
显示所有线程的栈 |
额外命令
命令 |
作用 |
.detach |
取消附加你调试的进程 |
.attach pid |
附加你想调试的进程.需要16进制的pid |
2.断点
命令 |
作用 |
bl |
列出系统中已经有的断点 |
bc |
清除断点例如: bc 1 -10 删除1 -10的断点. bc*清除全部 |
bd |
禁用断点,但不清除. |
be |
激活断点. |
bp [address][模块名字][偏移] |
下断点 bp xxModule!DisPatchRead + 0x30 |
bu module!fun |
bu模块名加函数下段点. |
bm module!fun* |
支持通配符.不支持加偏移下载. |
ba [w len] [r len] [e len] address |
支持下内存断点 w写断点 len代表长度. address 代表在address下w len长度的内存写断点 r读,e执行. |
bp /p eprocess [address][func] |
可以对下进程断点,只用xx进程调用这个代码的时候才会断下来 |
bp /t ethread [address][fun] |
对线程下端点.某个线程调用就能断下来. |
区别:
bp 下的断点是死断点.函数名字变了但断点还是在哪里.
bu 自动跟你你的函数进行下段点.不用担心会变.
在新的windbg中,bp失败.会自动换成bu.
3.内存查看命令
dt命令可以查看一些结构
命令 |
作用 |
dt nt!_EPROCESS |
查看nt模块中定义的EPROCESS结构 |
dt nt!_EPROCESS -r |
列出结构中的结构 |
dt nt P*xxx |
通配符方式,列出所有中带有P开头的接结构 |
dt Address 结构 |
知道这个结构所在的地址.输入则可以将这块内存解释为这个结构. |
x nt!Zw |
查找所有Zw开头的函数. |
内存数据类型显示命令
命令 |
作用 |
db [address] [L number] |
以一个字节显示值和Ascii字符 |
dw [address] [L number] |
内存按照2个字节显示 |
dd [address] [L number] |
内存按照4个字节显示 |
dp [address] [L number] |
32位下等同于dd. 64位下等同于dq |
dq [address] [L number] |
内存以8个字节显示 |
df [address] [L number] |
内存以4个字节浮点数显示 |
db 0x800000 L4 以一个字节显示内存.显示长度为4 * sizeof(db )个
字节.
读取内存中的指针
我们上面的d开头的命令你只能查看这个值.这个值有可能是存储指针.
我们除非在进行一次d命令才可以,下面的命令直接就可以
命令 |
作用 |
ddp |
|
dpp |
|
dqp |
|
ddu |
|
dpu |
|
dqu |
|
dda |
|
dpa |
|
dqa |
|
d表示4个字节. q表示8个字节. p 32位下4个字节.64位下8个字节.
所以p是可以灵活转化的.
所以上面的命令可以简化为
命令 |
作用 |
dpa |
|
dpu |
|
dpp [len] |
显示局部变量的值 |
dps |
|
dv |
显示局部变量的值,看变量的起始地址是ebp-xxx是 |
p: DWORD或者Qword
a: Ascii
u: UNICODE
所以上面的命令可以解析一下
如:
dpa
d: 命令前缀
p: 根据32位还是64位,分别以4个字节.或者8个字节显示
a: Ascii吗.
所以意思就是: 解析地址里面的值.如果是指针.则以32/64位显示为AscII码.
字符相关
命令 |
作用 |
da |
显示ascii值 |
du |
显示unicode值 |
ds |
显示ANSI_STRING的值 |
dS |
显示UNICODE_STRING的值.注意大小写. |
4.修改内存命令
命令 |
作用 |
eb [address] value |
修改一个字节,很重要.可以改代码的机器码. |
ed [address] value |
修改4个字节 |
eD [address] value |
|
ef [address] value |
修改float内存 |
ep [address] value |
修改指针内存 |
eq [address] value |
|
ew [address] value |
|
ea [address] value |
|
eu [address] value |
|
eza[address] value |
|
ezu [address]value |
|
关于修改内存.只需要熟悉 eb ed即可.
5.栈相关操作命令
命令 |
作用 |
kv |
显示当前栈的调用情况.显示函数的前3个参数 |
!irp address |
查看当前Irp的值. |
kp |
显示当前栈,显示当前函数的所有参数 |
ChiEbp |
RetAddre |
Args |
上一层的EBP |
当前函数返回地址 |
当前调用函数的参数 |
6.进程线程命令(内核命令)
命令 |
作用 |
!process 0 0 |
列出系统进程信息 |
!process 0 7 |
列出系统进程详细信息 |
!process EPROCESS 7 |
列出进程详细信息 |
.process /p EPROCESS |
进入该进程上下文,如果不切换查看他的信息查看不到. |
.thread ETHREAD |
进入该线程上下文 |
!thread ETHREAD |
查看线程结构 |
.logopen d:xx.txt |
开关语句. 显示的所有内容都重定向到xx.txt |
.logclose |
上面设置了开关,下面就要进行关闭. |