[原]排错实战——拯救加载调试符号失败的IDA
本文之前發表的時候有些問題,作為強迫癥患者的我又重新編輯后再次發表。如果您已經看過,請忽略。望見諒。
緣起
最近想借助IDA逆向一個函數。在windows下,調試器(比如vs, windbg)可以通過調試符號(PDB)把地址與符號名對應起來,為我們提供更可讀的信息。IDA應該也支持加載PDB,通過查看IDA安裝目錄下的idahelp.chm(打開后搜索PDB即可找到相關說明)發現還真支持。但是當我加載符號的時候,卻失敗了。本文記錄了整個調查過程。
效果對比
先放兩張對比圖,大家直觀感受下區別。
沒有調試符號的幫助的情況下,我們看到的效果:
有了調試符號的幫助的情況下,我們看到的效果:
可見,有了調試符號的幫助,我們可以更直觀的看到某個地址對應的函數名,可以更好的理解反匯編代碼。但是我們在IDA中該如何設置呢?
為 IDA 加載符號
首先,確認.\cfg\pdb.cfg存在,并且配置是正確的。一般,對IDA默認的配置文件 ,我們只需要放開PDBSYM_SYMPATH前面的注釋即可。為了保險,請確保對應的路徑(c:\symbols)是存在的。
// 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 startedPDB_REMOTE_SERVER = "localhost";PDB_REMOTE_PORT = 23946// password for the remote serverPDB_REMOTE_PASSWD = "";
說明:如果配置了_NT_SYMBOL_PATH,那么不用修改該文件。強烈建議設置環境變量_NT_SYMBOL_PATH。真正做到了一次設置,到處適用。
配置好后,通過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!
下面放一張我錄制的GIF,大家感受下!
總結
process monitor真的是排查問題的神兵利器,前提是要善用過濾,如果用不好過濾,對我們的幫助有限。
參考資料
Process Monitor
《Windows Sysinternals 實戰指南》
IDA 幫助文檔
猜你喜歡:
[原]排錯實戰——使用process explorer替換任務管理器
[原]排錯實戰——VS清空最近打開的工程記錄
[原]排錯實戰——通過對比分析sysinternals事件修復程序功能異常
歡迎留言交流
總結
以上是生活随笔為你收集整理的[原]排错实战——拯救加载调试符号失败的IDA的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 他,TypeScript GitHub
 - 下一篇: 如何运用DDD - 实体