2009-12-22 82 views
0

我想創建一個斷點,以便它將創建另一個一次性斷點,以便在寫入內存時「dd」某個內存地址至。檢查地址(ba)斷點處中斷時windbg中的數據

所以當斷點命中,我想運行像這樣的命令:

ba w4 @ESP+4 /1 ''dd [memory address of this breakpoint]'' 

由於正被另一個斷點創建斷點(並且可能被多次調用),我可以」 t指定斷點編號。否則,我可以使用像'$ bp3'這樣的僞寄存器來獲取斷點#3的內存地址。

任何人都不知道如何創建可以'dd'斷點的內存地址的斷點命令嗎?

謝謝!

回答

1

你能否詳細說明,以利用其他通用僞寄存器:t0..t19

bp your-address "r$t1=your-other-address; ba w4 @$t1 /1 \"dd @$t1;gc\"" 
+0

如果'your-address'斷點被命中了兩次(在'your-other-address'命中之前),這是否會改變$ t1的值並導致兩個一次斷點都爲dd @ $ t1在同一個地址? 謝謝! – IFacer 2009-12-22 15:45:04

+0

在這種情況下,請將斷點保持在最小值。知道你有'你的地址',它也可以重置所有其他bps。在條件中使用類似'bc1-10'的東西(假設'your-address'位於bp0!)來擺脫最後10個尚未命中的斷點。 – deemok 2009-12-23 09:28:50

+0

或者,您可以將$ t1設置爲0(以確保; o)並將其重置爲0,即單次bp。然後簡單地測試0(或其他值),並且只有在滿足某個條件(比如0)時才創建一個新的單發bp。 – deemok 2009-12-23 09:30:45

0

如果你知道永遠不會有一個以上的「孩子」 ba斷點定義,你可以實際使用由「控制」斷點的命令設置爲@$bpN僞寄存器:

ba1 w4 /1 @esp+4 "dd @$bp1" 

也就是說,指定斷點數量,這一新的斷點應該被分配,併爲斷點僞寄存器的定義仍然w^ithin斷點的命令。但是,如果您認爲控制斷點將被多次命中,並且想要定義多個ba斷點,那顯然將不起作用,因爲每次只會重新定義「斷點1」。但你仍然可以做到!

訣竅是使控制斷點的命令實際上包含文字地址文本,而不是嘗試通過僞寄存器。你可以用文本別名來做到這一點。

試試這個您控制斷點:

bu @WHATEVER "aS /x ${/v:baaddy} @esp+4; .block{ ba w4 /1 baaddy \"dd baaddy\"; ad ${/v:baaddy} }" 

如果控制斷點時,會發生以下情況:

  • 別名是設置爲文本「baaddy」與評估表達@esp+4
  • .block確保別名擴展發生在接下來的內容上。
  • 除了ad命令(由於/ v開關)之外,別名解釋程序將擴展該塊內的所有「baaddy」。
  • 所以如果@esp+4值是0x1234訪問斷點命令從字面上就變成了:ba w4 /1 0x1234 \"dd 0x1234\"內嵌有實際地址。
  • 然後刪除文本別名。

它刪除在年底這個控制斷點時,下一次的文字別名或非常重要,別名擴展aS命令和「baaddy」之前會發生將使用以前擴大值。這也意味着在第一次設置控制斷點的命令時,該文本 別名不存在很重要。