当前位置:Gxlcms > 数据库问题 > windbg常见命令

windbg常见命令

时间:2021-07-01 10:21:17 帮助过:9人阅读

准备终止列表中的对象为不再为根的可终止对象。此选项可能耗费大量资源,因为它验证可终止队列中的所有对象是否仍然为根对象。

 

-short 选项将输出限制为每个对象的地址。如果与-allReady 一起使用,则将枚举具有不再为根的终结器的所有对象。如果单独使用,则将列出终结和准备终结队列中的所有对象。

 

19.  设置断点

 

!bpmdSystem.Windows.Forms.dllSystem.Windows.Forms.MessageBox.Show

 

第一个参数是dll文件名,第二个是完整的方法名。

 

20.  查看所有断点列表

 

bl

 

21.   释放当前断点, 让程序继续运行。让程序运行到断点后WinDBG会自动停下来。

 

g

 

22.   显示公共语言运行时版本。

 

!eeversion

 

23.   清除屏幕信息,该命令还你一个清洁的屏幕

 

.cls

 

24.   退出当前调试

 

q

 

 

 

 

//断点相关

 

bp + 地址设置断点

bl  显示已经设定的断点

bu + 地址设置断点,但是这种类型断点再下一次启动时被记录

bc 清除断点

对于断点范围,可以用*匹配,-表示一个范围,表达多个可用,号隔开

 

程序入口伪寄存器

WinDbg里有个伪寄存器叫$exentry,里面记录了程序的入口点。所以我们只要在命令输入栏里输入

bp $exentry

(bp就是用来下断点的命令,详细用法可以参考WinDbg的帮助文档)

 

//调试符号

 

ld kernerl32 //加载kernerl32模块的符号

lm   m k*        //显示已经加载的,以k开头的模块

ln         //显示最近操作过的模块名

dt dbg2     //检测模块

 

[[[[[[[[[[[[]]]]]]]]]]]]

x kernerl32!k* 显示模块kernerl32中所有以k开头的函数

dv 显示局部变量值

dv /i/t/v 显示局部变量的类型,值相关信息。

x <module>!* / ? 显示指定模块的符号

x argc 查看变量argc的值。

dt argc 查看变量值

dt _PEB 7ffdd00 将内存地址7ffdd00开始的内容以PEB结构的方式显示出来。

dd 12000 L4 查看地址12000 后面的四个字

dds 12000 L100 查看堆栈上地址12000开始,后面的100个dword的内容,如果有调试符号,会将符号显示。此方法来追踪堆栈。(先看ebp,再用此方法)

dd ebp + 4, 返回地址, ebp + 8 第一个参数

 

[[[[[[[[[]]]]]]]]]

.kill 杀死调试进程

.restart 重新调试

 

[[[[[]]]]]]]]]]]]]]

k 显示调用堆栈

,kn加序号而已。

kb 显示前三个参数。第一个参数ebp+8;第二个ebp+0x0C;第三个ebp+0x10;dd ebp+0x14是第四个参数

kp 显示函数参数类型,数值

kp f f开关显示相邻栈基之差,从而可以推断出栈的健康状况。

 

[[[[[[[[[[]]]]]]]]]]

| 显示进程

~显示线程

~0 s 切换到 0号线程

 

[[[[[[[[[]]]]]]]]]

dv 显示函数参数&局部变量,注意,dv是跟栈帧相关的,对不同的栈帧显示不同的局部变量。

@1, kn 显示所有栈帧

@2, .frame选择想要查看的栈帧

@3, dv /i/v/t显示该栈帧里局部变量信息

@3, dv /i /V /t 显示变量基于栈帧的地址

如果没有私有符号,dv是不能显示变量信息的。

vc 生成的调试符号*.pdb windbg不认识,需要设置为c++/General/DebugInfo= C7 compatible

=====

sympath + c:\nasm 添加符号搜索路径

.sympath 显示符号搜索路径

//显示一定范围内存

!db L 32 : results in 32 bytes being displayed (as hexadecimal bytes),

//查看pe信息

!dh [Options] Address : 查看模块pe信息

!dh -f : display file headers

!dh -s : section headers

!dh -a : all header informations

查看结构体成员

dt nt!_EPROCESS

查看当前的irql

!irql

查看Verifier 检测统计信息

!verifier

查看某个内存地址属于那一个模块

!pool 地址

!lmi Address  : 查看模块的主要信息

!pcr 可以查看当前执行的线程及irql, 等信息

//

Why doesn‘t the WinDBG command !irql always return the correct IRQL for my target?

[Answer by Jake Oshins, jakeo_at_windows_dot_microsoft_dot_com. Workaround provided by James Antognini, antognini_at_mindspring_dot_nospam_dot_com, 27 August 2003]

!irql currently only produces useful results on a crashdump, not a live system. To retrieve the current IRQL on a live system you should instead use the !pcr command.

!processfield:列出EPROCESS的成员

该命令前的!号,意味着它来自于调试器的扩展模块kdextx86.dll。该命令可显示内核用来代表一个进程的EPROCESS结构(该结构并没有正式的说明文档)的成员及其偏移量。

尽管该命令仅列出了成员的偏移量,但你也能很容易的猜出其正确的类型。例如,LockEvent位于0x70处,其下一个成员的偏移量为0x80。则该成员占用了16个字节,这与KEVENT结构非常类似。

 

!threadfields:列出ETHREAD成员

这是kdextx86.dll提供的另一个强大的选项。和!processfields类似,它列出未文档化的ETHREAD结构的成员及其偏移量。内核使用它表示一个线程.

 

//进程信息

!tep

!peb ,显示peb(进程信息)

 

//显示相关

dt ntdll!*teb* 列出匹配通配符的结构名

dt -v -r ntdll!_TEB

列出结构_TEB的成员信息

 

//显示变量地址

r $peb 显示模块peb的地址

 

//查看错误信息

!gle

 

//设置断点的技巧

可以直接把断点设在: kernel32!BaseProcessStart

1), 先用lm 显示所有已经加载的模块

2), dt our_exe_name!*main*  //在我们的程序模块中搜索包含main的地址(注意:如果未加载symbol是不能显示的!)

3), 如果存在,在our_exe_name!*main 处设置断点

=======

Command     SoftICE OllyDbg

Run         F5     F9

Step Into     F11 F7

Step Over     F10 F8

Set Break Point F8 F2

搜索内存

 

5、查找字符串

在步骤1我们运行程序时就记录了提示注册错误的字符串Wrong Serial, try again!”,现在我们就要在内存找到该字符串的位置。

输入命令

s –a 00400000 L53000 “Wrong”

该命令的意思是以ASCII码形式在内存地址00400000往后53000个字节搜索字符串Wrong”

s,就是要调用查找的命令

-a,指定使用ASCII码的形式查找

00400000,指定要开始寻找的内存地址。

L53000,说明要在00400000往后的53000字节搜索。这个数值和00400000都可以从Stud_PE获得。00400000是程序的装入地址,而53000是映像的大小,也就是程序载入内存后占用的内存大小。使用这两个数值,基本上可以搜索到程序使用的整个内存范围。

“Wrong”,就不用多解释了,就是我们要寻找的字符串。不过WinDbg不支持模糊搜索,所以这里输入的字符串必定要完全正确。

内存访问断点

 

6、下内存访问断点

WinDbg中,ba命令代表Break On Access,即访问时中断。

我们在命令行输入:

ba r 1 0044108c

命令的意思是在内存0044108c的位置下字节的读断点。命令中各元素的含义可以参考帮助文档,这里不啰嗦。

输入bl,查看断点使用情况:

 

地址运算

? 0x33 + 0x44

运行后将得到计算和

 

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字符串

 

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为断点编号

 

windbg常见命令

标签:

人气教程排行