[原]排錯實戰——解救加載調試符號失敗的IDA


緣起

最近想借助IDA逆向一個函數。在windows下,調試器(比如vs, windbg)可以通過調試符號(PDB)把地址與符號名對應起來,為我們提供更可讀的信息。IDA應該也支持加載PDB,通過查看IDA安裝目錄下的idahelp.chm(打開后搜索PDB即可找到相關說明)發現還真支持。但是當我加載符號的時候,卻失敗了。本文記錄了整個調查過程。

效果對比

先放兩張對比圖,大家直觀感受下區別。

沒有調試符號的幫助的情況下,我們看到的效果:

function-names-without-pdb-loaded
function-names-without-pdb-loaded

有了調試符號的幫助的情況下,我們看到的效果:

function-names-with-pdb-loaded
function-names-with-pdb-loaded

可見,有了調試符號的幫助,我們可以更直觀的看到某個地址對應的函數名,可以更好的理解反匯編代碼。但是我們在IDA中該如何設置呢?

為IDA加載符號

  • 首先,確認.\cfg\pdb.cfg存在,並且配置是正確的。一般,對IDA默認的配置文件 ,我們只需要放開PDBSYM_SYMPATH前面的注釋即可。為了保險,請確保對應的路徑(c:\symbols)是存在的。
// PDB plugin

// PDB information provider
#define PDB_PROVIDER_MSDIA 1 // use MSDIA local/remote provider
#define PDB_PROVIDER_PDBIDA 2 // use PDBIDA provider
//PDB_PROVIDER = PDB_PROVIDER_PDBIDA

// The downloaded symbols are stored in the specified directory.
// Microsoft's public symbol store is used for downloading the symbols.
//
// If this option is omitted or empty - use _NT_SYMBOL_PATH if set, otherwise use %TEMP%\ida directory
// If the value is not empty - use it

//PDBSYM_DOWNLOAD_PATH = "c:\\symbols";

// Full symbol path (in _NT_SYMBOL_PATH format)
// If set, PDBSYM_DOWNLOAD_PATH and _NT_SYMBOL_PATH are ignored
// BCN: uncomment line below to configure symbol path
//PDBSYM_SYMPATH = "SRV*c:\\symbols*http://symbols.mozilla.org/firefox;SRV*c:\\symbols*http://msdl.microsoft.com/download/symbols";

// remote server where win32_remote.exe is running
// used when loading PDB symbols on non-Windows platforms
// NB: it will be used only if there is not already an existing debugging session started
PDB_REMOTE_SERVER = "localhost";
PDB_REMOTE_PORT   = 23946
// password for the remote server
PDB_REMOTE_PASSWD = "";

{% note info %}

說明:如果配置了_NT_SYMBOL_PATH,那么不用修改該文件。強烈建議設置環境變量_NT_SYMBOL_PATH。真正做到了一次設置,到處適用。:sunglasses:

{% endnote %}

  • 配置好后,通過File - Load file - PDB file...來加載pdb

load-pdb
load-pdb

我就是在這里遇到錯誤了,錯誤提示如下圖:

load-pdb-error
load-pdb-error

IDA提示我們錯誤有三種可能。

  1. 當前加載的程序不是一個合法的Windows PE文件。直接排除。
  2. PDB Plugin不在plugin目錄下。有可能,但是PDB Plugin的名稱是什么?不清楚,待調查。
  3. 系統中的dbghelp.dll文件太舊了。哪個版本的dbghelp.dll算新?不清楚,待調查。

上面第二種和第三種情況都有可能,但是根本原因是哪個需要進一步調查。這時候該本文的主角process monitor閃亮登場啦!

調查

打開process monitor,開始捕獲事件。然后在IDA中執行File - Load file - PDB file...加載pdb,等到上面的錯誤框彈出來后,停止捕獲事件。

我們主要關注IDA的文件讀寫事件,而且應該是找不到某個dll文件,所以我們關心Result不是SUCCESS的事件。根據以上條件進行過濾,很快就得到了我們感興趣的事件。看來我遇到的情況是找不到plugin\pdb64.dll。從別處拷貝一個pdb64.dllplugin目錄下,搞定。so fast! pretty good!:sunglasses:

下面放一張我錄制的GIF,大家感受下!

load-pdb-fail-investigation
load-pdb-fail-investigation

總結

process monitor真的是排查問題的神兵利器,前提是要善用過濾,如果用不好過濾,對我們的幫助有限。

參考資料


免責聲明!

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



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