idapython讓生活變得更美好:第三部分(條件斷點)


idapython讓生活變得更美好:第三部分(條件斷點)

在過去兩個部分中,我們已經討論了使用IDAPython 讓逆向工程更容易一些。這一部分我們來看一下條件斷點。

 

當在IDA中調試時,分析者經常遇到希望在一個特殊的地址中斷下來的情況,但只有一些特定的情況能夠觸發。一個典型的例子就是,只有在特殊的參數傳遞進去的時候,才能斷到一個特殊的函數的調用處。另外一個實例是我希望我的分析虛擬機加載一個特定的鏈接庫時能夠產生中斷。今天,我們來看看如何用IDAPython 來解決這個特殊的問題。

 

背景

分析時經常會逆向DLL。 在這類實例中,這些文件通常都是被其他可執行文件加載的。解決這個問題的一個方案是確保調試器在每個鏈接庫加載時都能中斷下來,然后DLL或者驅動最后加載完的時候才能停下來。

然而,這種方法其實是很低效的,通常需要分析者人工停止和開始:繼續執行,判斷哪些最近使用的鏈接庫和驅動是想要斷下來的。 簡單的運行一條命令,然后坐着等待感興趣的文件被加載進來,會讓分析工作變得更簡單。

條件斷點

在這個特殊的例子中,我們將會使用'dd.dll'文件。 這個特殊的文件在運行時被提取之后會執行一個利用過程注入到其他進程中。 為了在IDA中運行這個動態鏈接庫,我將會加載可執行文件rundll32.exe將其關聯到system32目錄,這樣能夠將dd.dll文件作為參數傳進來,就像下面這張圖能夠看到的。然后rundll32.exe可以讓用戶通過給定的導出名,加載一個特定的DLL。在這個特定的樣本中, 我對DLL的導出函數'Setting'比較感興趣。我在IDA中填入了下面這些參數:

下一個步驟是,在DLL被可執行文件加載進來之后找到正確的地方設置斷點。 為了達到這個目的,我先在調試器中勾選了'Suspend on library load/unload'選項。當暫停在第一個DLL實例被加載進來之后,我們可以看到斷點設在了NtMapViewOfSection函數調用的后一句。

接下來我在0x7C91ADFB 地址處下了一個斷點。 在我的代碼中,我調用add_bpt() 和

enable_bpt() 函數來創建和生效斷點。

在這個步驟,我已經在0x7C91ADFB 處設置了斷點,每次DLL加載進來的時候調試器都會中斷下來。為了確保只有在'dd.dll'加載進來的時候才會中斷,我們必須使用條件斷點。分析者可以使用代碼來判斷條件斷點是否真的被觸發(不管用IDC或者Python都行)。如果代碼返回值為True,斷點會被觸發,否則,斷點將會被忽略。 我們首選Python作為編程語言。 然后我們將Python代碼存儲到變量中,然后將這個變量傳遞給SetBptCnd()函數,這個函數會將這個代碼作為條件設置到斷點上。 這個條件設置之后,我們讓調試器繼續運行,然后等待調試器暫停事件觸發。偽代碼如下所示:

現實中使用的條件代碼如下所示:

這個代碼會反復的查找'dd.dll'是否被加載進來。 如果是,會打印調試信息,最開始的斷點被刪除掉了,返回的布爾值為True時,斷點就會被觸發。我們運行程序,IDA窗口中輸出如下信息:

下面這個步驟,我們會對導出函數'Setting'設置斷點然后運行程序直到斷點觸發。為了自動完成這個步驟,我們可以使用下面的代碼:

這段代碼反復的在加載的模塊中查找'dd.dll'。找到之后,分析包含DLL的代碼。 然后在這段代碼中尋找'Setting'函數。一旦找到,就在這個地址設置斷點,讓調試器繼續執行,等待斷點觸發。執行程序,我們可以看到正如我們預期的那樣斷點在我們想要的地址上中斷下來。

結論

設置條件斷點看起來是一個非常小的技術點, 但是能夠節省分析者大量的時間。一個很小的代碼片段能夠代替我們完成一次次手動的尋找我們想要的斷點這么繁瑣的工作。我們又一次借助 IDAPython的力量來簡化我們的逆向工作,幫助我們節省了大量的時間和精力。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM