因为Windgb支持MASM语法,字符串的比较方法有$scmp和$sicmp。用法和c中的字符串比较方法一致。在需要比较字符串成员变量的时候,遇到了点问题。因为字符串成员变量无法直接获取字符串内容。poi指令是直接取地址。所以需要结合伪寄存器和别名进行封装。
伪寄存器语句如下:
1 r @$t0=@@(&this->_test._Bx._Buf)
_test变量的类型为string。@@为C++语法表达式。
别名的语句如下:
1 as /ma ${/v:testAlias} @$t0
此时使用al,即可看到testAlias的内容即为_test的内容。
此时配合$sicmp指令的语句如下:
1 .if($cicmp(\"${testAlias}\",\"Test\")==0)
用来判断别名testAlias的内容是否等于“Test”,不区分大小写。
此时再配上bp,就得到了以下语句:
1 bp Module!Class::MemberFunc+0x90 "r @$t0=@@(&this->_test._Bx._Buf) as /ma ${/v:testAlias} @$t0 .if($sicmp(\"${testAlias}\",\"Test\")==0{}.else{}"
但是此时会遇到两个问题:
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;}}"