Windbg:如何给字符串下条件断点

    由于Windgb支持MASM语法,字符串的比较方法有$scmp和$sicmp。用法和c中的字符串比较方法一致。在须要比较字符串成员变量的时候,遇到了点问题。由于字符串成员变量没法直接获取字符串内容。poi指令是直接取地址。因此须要结合伪寄存器和别名进行封装。this

 

伪寄存器语句以下:spa

  1 r @$t0=@@(&this->_test._Bx._Buf)

 

_test变量的类型为string。@@为C++语法表达式。code

别名的语句以下:blog

  1 as /ma ${/v:testAlias} @$t0

此时使用al,便可看到testAlias的内容即为_test的内容。ci

 

此时配合$sicmp指令的语句以下:字符串

  1 .if($cicmp(\"${testAlias}\",\"Test\")==0)

用来判断别名testAlias的内容是否等于“Test”,不区分大小写。string

 

此时再配上bp,就获得了如下语句:class

  1 bp Module!Class::MemberFunc+0x90 "r @$t0=@@(&this->_test._Bx._Buf) as /ma ${/v:testAlias} @$t0 .if($sicmp(\"${testAlias}\",\"Test\")==0{}.else{}"

可是此时会遇到两个问题:test

Q1:$sicmp的第一个参数值不从新计算变量

Q2:testAlias的值没有更新

 

第一个问题能够使用.block来解决:

  1 .block {.if($sicmp(\"${testAlias}\",\"Test\")==0{}.else{}}

第二个问题能够使用ad /q testAlias来删除老的别名解决。因此最终的语句以下:

  1 bp Module!Class::MemberFunc+0x90 "r @$t0=@@(&this->_test._Bx._Buf) as /ma ${/v:testAlias} @$t0 .block{.if($sicmp(\"${testAlias}\",\"Test\")==0){.echo Found; ad /q testAlias;}.else{.echo Not Found; ad /q testAlias; gc;}}"
相关文章
相关标签/搜索