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}"
条件断点可是逆向分析中的一个利器,用得好可以大大节省分析花的时间。
条件断点
在《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}"
条件断点可是逆向分析中的一个利器,用得好可以大大节省分析花的时间。
相关文章推荐
- windbg使用日记(一)
- windbg使用日记(二)
- 在 csdn 上创建个人的日记系统(在blog中使用 javascript)(4.2 日修订)
- 借助VMware实现单机使用WinDbg
- 借助VMware实现单机使用WinDbg
- 日记 [2007年01月21日]linux下使用IE
- WinDbg配置和使用基础
- (译)使用WinDBG进行内核调试(Fundamentals)
- Struts心得—DispatchAction使用日记
- 使用Windbg和SoS扩展调试分析.NET程序
- 为什么要写工作日记及一个在线编辑器的使用
- [今天的编程日记, 在vb中使用vc编译的dll实例]
- 企业库(配置管理应用程序块)使用日记
- Qt使用日记(1): 安装
- 第一次使用网络上的Blog,感觉就是写日记
- proftpd使用日记(1)
- 借助VMware实现单机使用WinDbg
- Struts心得—DispatchAction使用日记
- 使用WinDbg调试程序
- 如何使用WinDBG跟踪调试ASL/ACPI?