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

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

可見,有了調試符號的幫助,我們可以更直觀的看到某個地址對應的函數名,可以更好的理解反匯編代碼。但是我們在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
。

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

IDA
提示我們錯誤有三種可能。
- 當前加載的程序不是一個合法的
Windows PE
文件。直接排除。 PDB Plugin
不在plugin
目錄下。有可能,但是PDB Plugin
的名稱是什么?不清楚,待調查。- 系統中的
dbghelp.dll
文件太舊了。哪個版本的dbghelp.dll
算新?不清楚,待調查。
上面第二種和第三種情況都有可能,但是根本原因是哪個需要進一步調查。這時候該本文的主角process monitor
閃亮登場啦!
調查
打開process monitor
,開始捕獲事件。然后在IDA
中執行File
- Load file
- PDB file...
加載pdb
,等到上面的錯誤框彈出來后,停止捕獲事件。
我們主要關注IDA
的文件讀寫事件,而且應該是找不到某個dll
文件,所以我們關心Result
不是SUCCESS
的事件。根據以上條件進行過濾,很快就得到了我們感興趣的事件。看來我遇到的情況是找不到plugin\pdb64.dll
。從別處拷貝一個pdb64.dll
到plugin
目錄下,搞定。so fast! pretty good!
:sunglasses:
下面放一張我錄制的GIF
,大家感受下!

總結
process monitor
真的是排查問題的神兵利器,前提是要善用過濾,如果用不好過濾,對我們的幫助有限。
參考資料
- Process Monitor
- 《Windows Sysinternals實戰指南》
- IDA幫助文檔