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;}}"
相關文章
相關標籤/搜索