windbg设置条件断点

    一直以为windbg的bp断点只是简单的在某个地址上下断点,后来才发现bp断点功能很强大:除了可以设置条件断点还是windbg脚本的基础.

    使用方法很简单:bp address ".if(condition){};.else{}" 具体例子形如:

bp `4dbg.cpp:18` ".if(hFile>=0){};.else{gc;}"
这里是对源文件中某一行下条件断点,如果句柄值大于等于0则中断调试器,否则继续往下运行。岔开一下对源码下断点的方式为: bp `filename:linenumber` (首尾那模糊的两点是波浪键那一点).

    如果条件断点中使用了别名(什么是别名?点此链接) 需要注意一下两点:

1.必须使用.block{}把使用别名的包含在里面;

2.必须在使用别名前,先用ad命令把别名删除掉;

下面用一段代码示例条件断点的用法:

int _tmain(int argc, _TCHAR* argv[])
{
	DWORD dwReturn;
	char* Buffer[]={"123","456","789"};
	HANDLE hFile=CreateFile("C:\\a.txt",
      GENERIC_WRITE|GENERIC_READ,
      0,
      NULL,
      OPEN_ALWAYS,
      FILE_ATTRIBUTE_NORMAL,
      NULL);
    if (hFile == INVALID_HANDLE_VALUE) 
    {
      return 0;
    }
    
    
	for(int i=0;i<3;i++)
	{
		WriteFile(hFile,Buffer[i],strlen(Buffer[i]),&dwReturn,NULL);
	}

    CloseHandle(hFile);
	return 0;
}
我想在这段代码中设置这样两个断点:

1.CreateFile是否成功打开文件,即hFile是否大于0,若成功,则断下,否则继续运行(从return 0退出程序),这个断点可以这样设置:

bp `4dbg.cpp:12` ".if(hFile>=0){};.else{gc;}"
2.想获得调用WriteFile时,第二个参数的内容,并且如果传入的字符串和456匹配,则中断调试器运行,可以这么写(有点复杂):

bp kernel32!WriteFile "
	r @$t1=poi(esp+8);  
	ad *;
	as /ma $buf @$t1;
	.block
	{
		r @$t2=$spat(@\"$buf\",@\"456\")
		.if(@$t2==0)
		{
			gc;
		}
	}
"
大概解释一下:

poi(esp+8)是从栈变量中取值,将值作为地址返回给调用者,这里是一个临时变量。

当程序执行call kernel32!WriteFile进入kernel32!WriteFileImplementation时,esp+8指向传给函数的第二个参数:

4dbg!main+0xa3:
01251443 ff15ac812501    call    dword ptr [4dbg!_imp__WriteFile (012581ac)] ds:0023:012581ac={kernel32!WriteFileImplementation (769a55a6)}
0:000> t
kernel32!WriteFileImplementation:
769a55a6 8bff            mov     edi,edi
0:000> dd esp+8
002bfa24  0125574c 00000003 002bfb30 00000000
esp+8在此处就是栈变量,变量地址为0x002bfa24;他的值为0125574c,是字符串的首地址:
0:000> da 0125574c 
0125574c  "123"
随后,为字符串的首地址(保存在临时变量t1)取一个别名,并在block中进行字符串匹配,匹配的结果存放在临时变量t2中。最后比较t2的值

参考资料:

windbg 脚本简单入门

46.windbg-条件断点(windbg script)


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值