-
條件斷點
條件斷點:斷點指令 + “j(Excecute If-Else) 和 gc (Go from Conditional Breakpoint)”
形如:bp Address "j (Condition) 'OptionalCommands'; 'gc' "
a.普通變量(非結構體)
"j (poi(MyVar)>5) '';'gc'"
在代碼中,MyVar是整數變量。預設的debug配置采用MASM文法,是以MyVar被當作指針看待,在做條件判斷時,需要使用poi解引用。如果debug配置采用C++文法,MyVar會被解析為整數變量,可直接用于條件判斷。條件為真時對應的語句為空,則當條件滿足時,會斷在此處。gc表示從斷點處繼續運作。
b.結構體變量
"j (@@c++(MyStruct->field)>5) '';'gc'"
判斷結構體變量中的某個成員變量時,采用C++文法解析表達式:@@c++(...)。因預設配置是masm文法,故對于結構體成員都用此種方法解析。
c.寄存器
<1> "j @eax = 0xa3 ''; 'gc'"
<2> "j @eax = 0xc0004321 '';'gc'"
<3> "j (@eax & 0x0`ffffffff) = 0x0`c0004321 '';'gc'"
<1>當eax的值為0xa3時,觸發該斷點。
在masm表達式中,寄存器是做符号擴充的,即0xc0004321實際被當作是0xffffffff`c0004321,即便實際顯示時是0xc00004321。這種符号擴充僅存在于kernel mode中。是以式<2>在kernel mode會失敗。最好的改法則是按照式<3>的方式做條件比較,該方式可以同時用于kernel mode和user mode。