windbg 断点 未完

来源:互联网 发布:水印制作软件 编辑:程序博客网 时间:2024/05/01 12:05

1.  config symbol 

    .symfix, .sympath,  _NT_SYMBOL_PATH

srv*d:\mysymbols*http://msdl.microsoft.com/download/symbols;cache*d:\mysymbols

2.load ext command 

   like sdbgext

   .load sdbgext   //load sdbgext

    !sdbgext.help  //check sdbgext has loaded

3.

//print text

//.printf  formatstring, value1,..... //the usage of .printf like c printf, only formate string has some diffeneces with c printf

//.echo text, like dos or unix echo command

//pseudo-register

//$peb ,$teb ect has defined 

//we can use like $t1 to define ourself register to save some value


bp 00895cc3 "r $t1=(ebp-50);.printf \"%N\",$t1;.echo;!usermsg $t1;"


bp 77d191f1 "r $t1=poi(poi(ebp+8)+4);.printf \"%N\", $t1;.echo asdfsdf;gu"

bp 77d191f1 "r $t1=poi(poi(ebp+8)+4);.printf \"%N\", $t1;.echo;.if(@$t1!=0x10){gc}.else{};"


条件表达式

j<条件表达式>[Command1];[Command2]

例如bp consoletest!add "j(dwo(esp+4)==0n10) 'kv;.echo \"break\"';'g'" 表示条件断点,如果consoletest!add的第一个参数是10 则打印堆栈,输出”break”, 并暂停,否则继续执行

 

也可用元命令代替

bp consoletest!add  ".if(dwo(esp+4)==0n10) {kv;.echo \"break\"} .else {g}"

上下文

上下文(Context)包括会话(Session)上下文, 进程上下文,寄存器上下文,局部变量上下文。

会话上下文和登陆用户帐号有关。进程上下文和当前调试的默认进程有关, 寄存器上下文和当前默认线程有关。

局部变量上下文和当前的堆栈桢有关, 比如可以通过.frame [index] 切换当前堆栈桢,然后通过dv 显示当前堆栈桢函数的局部变量(堆栈桢的index0开始,可以通过kn命令显示堆栈桢索引)


保存dump文件

.dump /ma c:\test.dmp 保存full-dump

.dump /m c:\test.dmp 保存mini-dump

 

   分析Dump

一般先 !analyze –v Windbg会根据上面命令自动分析,

           然后 ~* kv 打印所有线程的堆栈


分析调试符号

X [选项模块名!符号名

       比如x ntdll!dbg*显示所有ntdll模块中以dbg开头的符号

            比如x test!cmyclass::init 显示test模块中cmyclass类中的init函数符号


搜索符号

ln [address] 搜索离address最近的符号名(list nearest symbols

事件处理

可以通过菜单Debug->Event Filter…设置

sx 显示各个事件的代码和目前的处理选项

sx {e|d|i|n} [command]  , e|d|i|n分别对应Enabled, Disabled,OutputIgnore

比如 sxe ld user32.dll 表示在加载user32.dll时设置的中断

sxr 恢复成默认设置


设置断点(break point)

bp [address] [“command”] 设置软件断点。

比如 bp kernel32!CreateProcessW表示在调用这个CreateProcess时设置断点。

比如bp kernel32!CreateFileW "du poi(esp+4); g" 表示在调用CreateFile时打印出文件路径(第一个参数),然后继续执行

 

针对某线程设置断点,只要在命令前加~线程号:

比如 ~0 bp 0x441242, 表示0号线程执行到地址0x441242时中断

 

ba [access size] [command]设置硬断点。

其中,access指定访问方式(e执行指令, r读取数据,w写入数据)

size 表示监视数据的大小(1, 2, 4)

比如ba r4 0x414422, 表示在地址0x414422写入4字节数据是触发断点


Windbg下载地址http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx

安装完后执行windbg –iWindbg设置成默认调试器

可以通过问号命令(?)显示表达式值,双问号(??)显示C++表达式值通过.cls命令清屏

如果x表示的一个地址, 则可以通过以下方法获取x所指向的值

hi(x) 16 bits

low(x) 16 bits

by(x) 返回第一个byte

wo(x) 返回第一个word

dwo(x) 返回第一个dword

qwo(x) 返回第一个4 word(Quad-word)

poi(x) 返回第一个指针值


察看堆栈

kn [frame count]察看当前堆栈及其索引, frame count指定要显示多少桢

kb显示堆栈桢地址,返回地址,参数,函数名等

kvkb的基础上增加了函数调用约定等信息, 所以推荐用kv命令察看堆栈.

 

.frame [frame index] 将当前堆栈切换到某个堆栈桢比如.frame 1 切换到第1

dv 命令察看当前堆栈桢的局部变量


显示内存区域(dump memory)

d{a|b|d|D|f|q|u|w} [range]

其中a表示ASCII码,b表示byte, d表示DWORD, D表示double, f表示float, q表示8字节, u表示Unicode String w表示word

Range 表示地址范围,可以用2种表示:一是起始地址加终止地址二是起始地址加L长度(不是字节长度,是单位长度)

比如 dw 77e0d827 L10 表示显示77e0d827开始的10word

比如 dd 77e0d820 77e0d844, 表示显示 77e0d820 77e0d844之间的所有dword

比如 du 77e0d820, 表示77e0d820开始的以0结尾的字符串

 

dps [range] 显示某一地址范围内的符号(display word and symobols)


搜索内存(search memory)

s –[type] range pattern

其中type, b表示byte w表示word, d 表示dword, a表示ASCII stringu表示unicde string

Range 表示地址范围,可以用2种表示:一是起始地址加终止地址二是起始地址加L长度(不是字节长度,是单位长度)。如果搜索空间长度超过256M,L?length

Pattern指定要搜索的内容.

比如 s -u 522e0000 527d1000 "web"表示在522e0000 527d1000之间搜索Unicode 字符串”web”

比如s -w 522e0000 L0x100  0x1212 0x2212 0x1234 表示在起始地址522e0000之后的0x100个单位内搜索0x1212 0x2212 0x1234系列的起始地址


自动调试子进程

.childdbg 0

Disable child process debugging

 

.childdbg 1

Attach child process automatically


脚本支持

$$>< filename 加载脚本文件,并将脚本里的换行符自动换成;(分号)

$t0~$t19为伪寄存器,可用来存储临时值使用伪寄存器时前面尽量加@符号以加快搜索

.printf 可以输出格式化信息

as Name EquivalentLine 别名,类似define , 比如 r $t0=poi(esp+4); as $filename $t0

ad Name 删除别名, ad*删除所有别名

al 列出所有别名

.block {…}重新开始替换里面的所有别名

${alias}强制要求替换里面的别名, ${\v:alias}不要替换里面的别名


如何用Windbg写高级脚本

参考http://blogs.msdn.com/b/debuggingtoolbox/archive/tags/windbg+scripts/default.aspx



原创粉丝点击