微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

windbg常用命令

1.基本调试控制
运行程序(Run): 快捷键:F5 命令:g
单步步入(Step In): 快捷键:F8 命令:p
单步步过(Step Over): 快捷键:F10
运行到光标所在行: 快捷键:F7
执行到返回:gu
执行到指定地址:g [Address]
重新运行调试程序: 快捷键:Ctrl+Shift+F5(这个对驱动一般用不到)

2.断点
断点之于调试当然是非常重要的
常用命令:
bp [Address]or[Symbol] 在指定地址下断
可以使用地址或符号,如
    bp 80561259(Windbg认使用16进制)
    bp MyDriver!GetKernelPath
    bp MyDriver!GetKernelPath+0x12
bp [Address] /p eprocess 仅当当前进程为eprocess时才中断
这个很常用,比如你bp nt!NtTerminateProcess,但是只想在某一进程触发此断点时才断下来,那就加上这个参数吧,因为内核中的代码是各个进程共用的,所以此命令很实用
bp [Address] /t ethread 仅当当前线程为ethread时才中断,用法跟/p参数类似
bu [Address]or[Symbol] 下一个未解析的断点(就是说这个断点需要延迟解析)
这个也很常用,比如我们的驱动名为MyDriver.sys,那么在驱动加载之前下断bu MyDriver!DriverEntry,
然后加载这个驱动时就可以断在驱动入口,并且这个是不需要调试符号支持
bl 列出所有断点,L=List
bc[id] 清除断点,c=Clear,id是bl查看时的断点编号
bd[id] 禁用断点,d=disable,id即断点编号
be[id] 启用断点,e=Enable,id为断点编号

3.查看和修改数据
调试中不可避免的要查看和修改数据
查看内存:
db/dw/dd/dq [Address]       字节/字/双字/四字方式查看数据
da/du [Address]           ASCII字符串/Unicode字符串方式查看指定地址
其它常用的如查看结构
dt nt!_EPROCESS
dt nt!_EPROCESS 89330da0 (把0x89330da0作为对象指针)
修改内存:
eb/ew/ed/eq/ef/ep Address [Values]
字节/字/双字/四字/浮点数/指针/
ea/eu/eza/ezu Address [Values]
ASCII字符串/Unicode字符串/以NULL结尾的ASCII字符串/以NULL结尾的Unicode字符串
搜索内存:
s -[b/w/d/q/a/u] Range Target
搜索字节/字/双字/四字/ASCII字符串/Unicode字符串

4.寄存器
在用Windbg调试时可以Alt+4直接调出寄存器窗口,然后拖放到合适的位置就可以。
修改呢就直接双击相应的项就可以了。
把命令的方式也说一下,比较简单:
r 显示所有寄存器的值
r eax 显示eax的值
r eax=1 修改eax的值为1

5.辅助命令
!process 显示当前进程信息
!process 0 0 显示当前所有进程(会有僵尸进程)
!process 1f4 显示pid为1f4的进程信息,后面也可以跟eprocess的值
!thread 显示当前线程信息
!thread
!process 1f4 显示tid为768的线程信息,后面也可以跟ethread的值
栈相关:
k 显示调用
kb 显示ebp和前3个参数
kp 以函数调用形式显示

以上就是常用的命令了~~~


========================================================

常用调试命令: 
1.  x : 以通配符的方式检查一个模块内的符号地址 
    例如: x nt!PsP* (显示内核里所有以Psp开头的内核符号) 
2.  lm : 显示所有已加载的模块列表 
3.  dd : 显示一个地址起始的32位整数值(显示32个整数,每行4个,共8行) 
    例如: dd 1014db0 L1 (L1表示只显示一个整数) 
4.  du : 显示UNICODE形式的字符串 
5.  .formats <数字> : 以各种进制显示这个数字 
6.  !process 0 0 : 打印系统中所有进程(只在内核调试下有效) 
    !process <EPROCESS> : 显示一个进程的关键信息 
7.  !dd : 显示物理地址(只在内核调试下有效) 
8.  使用Windbg在内核调试下调试用户进程. 
    !process 0 0 列出所有进程 
    .process /p <EPROCESS> 切换到应用进程的地址空间 
    .reload /f /user 重新加载此进程用户间的符号信息 
    .process /i /p <EPROCESS> 以入侵且禁止缓存映射地址的方式重新切换地址空间 
    bp <xxx> 下应用层断点 
9.  bl : 查看已设置的断点列表 
10. bc : 取消一个断点 
11. ba : 设定一个内存访问断点 
    例如: ba w1 0042201c 
          ba r2 0042201c 
12. r : 显示寄存器的值 
13. u : 反汇编,例如: u 401500 L9 反汇编当前地址以后的9条指令 
14. ub: 向前反汇编,例如: ub 4014f9 L2 反汇编当前地址之前的两条指令 
15. k : 显示栈回溯 
16. kp: 显示栈回溯并且显示每个函数调用时的参数信息 
17. g : 继续执行程序 
18. dt: 显示类型结构命令 
    例如,在内核调试下: 
    dt _EPROCESS <某进程的EPROCESS首地址> 
19. 在内核调试下显示一个进程的PEB信息 
    .process <EPROCESS> 先切换到某个进程的上下文 
    dt _PEB <PEB地址> 显示进程的环境块信息 
20. ln [address] : 显示指定地址的类型信息,或临近address的符号的类型信息.address为可选. 
21. ~* kp : 显示所有线程的栈回溯 
22. ~* : 显示所有线程(同时也显示出线程的启动函数的地址) 
23. dt ntdll!*create* : 显示一个模块内的所有结构体类型名 
24. !handle : 查看句柄(表) 
25. uf <function address> : 反汇编函数 
26. !peb [address] : 显示一个进程的进程块信息 
27. !object 查看内核对象,格式如下: 
    Usage: !object [-p] | [[<Path>] | [<Address>] | [0 <TypeName>]] 
28. t : 单步跟入. tc: 单步跟入直到一个call为止. 
    tct: 单步跟入直到一个call或ret为止. tt: 单步步入直到一个ret为止. 
29. p : 单步步过. pc: 单步步过直到一个call为止. pct: 单步步过直到一个call或ret为止.
     pt: 单步步过直到一个ret为止. 
29. bu kernel32!BaseProcessstart : 设置一个延迟的以后再落实的断点 


版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐