天天看點

IDA複合條件斷點

---------------------------------------------

author:hjjdebug

date: 2017年 11月 26日 星期日 07:55:50 CST

---------------------------------------------

IDA複合條件斷點

所謂條件斷點就是滿足一定條件才會中斷的斷點.

ida的條件斷點或者說調試器的條件斷點添加之後會顯著影響代碼執行效率,尤其是當

條件斷點加在循環之内時, 因為每次運作到斷點時,都要切換到調試器狀态判斷條件是否成立

才能确定是否該中斷, 這個切換動作要執行成千上萬條指令,意味着在這個局部,慢了成千上萬倍.

本人親曆,運作幾秒的程式,加了條件斷點後,竟運作了30分鐘才到達.

那如何解決這個問題,就是要用複合條件斷點進行剪枝,才能達到秒殺的效果.就是說在大部分的循環中

都不設條件斷點,隻有在接近目标時,才設條件斷點,達到節省時間的目的.

說得這麼玄乎,那怎麼剪枝?,怎麼知道要接近目标? 還是看看執行個體吧.

背景:

在掃描病毒時,要掃描成千上萬個檔案,可能那個可疑的檔案在後部,我們不關心前面的那些檔案

隻關心這個後部的檔案.

假定在一個循環中,滿足r2=0x19c(循環最大值,病毒庫項個數), r3=0x8c(循環次數)掃到了可疑檔案

你隻需設定 break if (r2==0x19c && r3==0x8c) 即可.

你可能要說了,這麼個小循環,哪在計算機話下!,

是的,這個小循環确實不大,但是前面還有r2=0x2a9c, r2=0x3e3, r2=...好多個循環沒有列呢.這些值對應

着不同的病毒庫. 現在需要你隻關心r2=0x19c 時的庫就好了!

問題是還不隻是這個條件,這樣斷下來,也不是可疑檔案,而是隻有當調用過myScanElf函數後,再這樣下斷點才

管用,否則不是關鍵點. 因為執行的流程雖然是調用realScan, 但隻有realScan調用到myScanElf, myScanElf

又遞歸調用到realScan後,才掃到了這個可疑檔案,是以,要把前面的循環統統剪枝.

需求說清了,下面看看實作.

當然了,我們需要用到ida的腳本.

1. 設定myScanElf 斷點, 中斷後,再設定fScanDexSym 函數斷點. (中斷1次)

2. fScanDexSym 中斷後, 查是否是PayWare庫,是則設定loop斷點.此時r2必然是0x19c了(中斷幾次)

3. loop中斷後檢查,隻需檢查0x8c次(中斷0x8c此)

如此分而治之,通過大量剪枝,就可以秒殺到斷點了!

不過實際上事情并不像描述的這麼簡單,由于IDA的bug, 你還會遇到其它問題, 例如loop中斷雖斷下來了,

但系統仍然向前跑, 破壞了你的調試環境, 這或許可以結合暫停按鈕,再單步追蹤等輔助解決. 現實和理想還是有點距離!

通過此例說明,縱使還有更複雜的觸發條件,借助ida腳本,來完成條件設定.

說了這麼多,其實核心是因為被調用的函數呈蘑菇雲狀,是以不能直接在底層函數直接下斷點,而應該在上層先下斷點, 然後再

再下層下斷點, 實作二次斷點或接力斷點來有效中斷!

繼續閱讀