您的位置:首页 > 其它

windbg使用日记(三)

2014-11-29 20:24 218 查看
开个单章,主要谈谈windbg中的条件断点。

条件断点

在《windbg使用日记(一)》中,介绍了断点的几种使用方式。这儿主要谈谈条件断点。

条件断点,就是当满足用户设定的某个条件时,用户设置的断点才会生效,使程序断下。

bp/ba等断点命令都可用于设置条件断点,设置条件断点的通用形式如下:

断点表达式 + "条件"

如:bp ws2_32!send ".if (poi(esp+0xc) > 100) {} .else {gc}"

表示,在send()函数头下断点,当(esp+0xc)地址处的数据大于100字节时,程序断下,否则,程序不会断下。

".if (poi(esp+0xc) > 100) {} .else {gc}" 就是断点 bp ws2_32!send 的条件。

其实,只要设置了断点,程序运行到send()函数时都会断下,当设置了断点条件后,windbg会根据条件来判断,如果符合.if()中的条件,会执行.if后的{}中的命令,如何不符合.if()中的条件,则会执行.else后的{}中的命令。

在上述例子中,只要运行到send()中,都会判断[esp+0xc]是否大于100,在不大于100的情形下,都会执行.else后的gc命令,也就是继续运行的命令,程序便不会断下。可以对比C语言中的if...else...表达式来理解。

上述例子中,esp+0xc中存放的是send()函数的第3个参数,也就是发送数据的长度,poi操作符表示从指定地址取指针长度的数据(Point-sized data),类似的还有by、wo、dwo、qwo操作符,分别表示从指定地址取一个字节(Byte)、一个字(Word)、一个双字(Double-word)、一个四字(Quad-word)的数据,采用的语法规则是MASM表达式,详细规则参考帮助文件。

上面的例子完全等价于如下写法:

bp ws2_32!send "j (poi(esp+0xc) > 100) ' '; 'gc' "

再来看个例子:

在抓包分析时,我们只要某个特定包的处理,其他包都可过滤掉,而且,我们知道这个特定包的包长固定为512字节,这种情况下,可以在recv()函数下断点,在recv()抓到该特定包断下后,继续跟踪下去,便可分析出该特定包的处理过程。但recv()函数可接受任一个数据包,会频繁命中,这时便可采用条件断点,当接受到的包长等于512时,程序断下。设置条件断点如下:

bp ws2_32!recv ".if (poi(esp+0xc) > 100) {} .else {gc}"

条件断点可是逆向分析中的一个利器,用得好可以大大节省分析花的时间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: