缘起
最近想借助IDA
逆向一个函数。在windows
下,调试器(比如vs
, windbg
)可以通过调试符号(PDB
)把地址与符号名对应起来,为我们提供更可读的信息。IDA
应该也支持加载PDB
,通过查看IDA
安装目录下的idahelp.chm
(打开后搜索PDB
即可找到相关说明)发现还真支持。但是当我加载符号的时候,却失败了。本文记录了整个调查过程。
效果对比
先放两张对比图,大家直观感受下区别。
没有调试符号的帮助的情况下,我们看到的效果:
有了调试符号的帮助的情况下,我们看到的效果:
可见,有了调试符号的帮助,我们可以更直观的看到某个地址对应的函数名,可以更好的理解反汇编代码。但是我们在IDA
中该如何设置呢?
为IDA加载符号
- 首先,确认
.cfgpdb.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 = "";
说明:如果配置了_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
的事件。根据以上条件进行过滤,很快就得到了我们感兴趣的事件。看来我遇到的情况是找不到pluginpdb64.dll
。从别处拷贝一个pdb64.dll
到plugin
目录下,搞定。so fast! pretty good!
下面放一张我录制的GIF
,大家感受下!(知乎居然不支持从浏览器端上传gif,转成视频格式了)
总结
process monitor
真的是排查问题的神兵利器,前提是要善用过滤,如果用不好过滤,对我们的帮助有限。
参考资料
- Process Monitor
- 《Windows Sysinternals实战指南》
- IDA帮助文档