[原]排错实战——解救加载调试符号失败的IDA
缘起
最近想借助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帮助文档
[原]排错实战——解救加载调试符号失败的IDA的更多相关文章
- [原]排错实战——通过对比分析sysinternals事件修复程序功能异常
原调试debug排错troubleshootprocess monitorsysinternals 缘起 最近,我们程序的某个功能在一台机器上不正常,但是在另外一台机器上却是正常的.代码是同一份,vs ...
- VS2017调试代码显示“当前无法命中断点,还没有为该文档加载任何符号”
VS2017升级之后,代码调试无法进入,显示“当前无法命中断点,还没有为该文档加载任何符号”的问题解决思路: 1.工具-选项-项目和解决方案-生成并运行,取消勾选“在运行时仅生成启动项目和依赖性” 2 ...
- EasyDarwin开源流媒体云平台VS调试断点提示“还没有为该文档加载任何符号”的解决办法
本文转自EasyDarwin开源团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/52063666 近日,我们EasyDarwin ...
- 遇到Visual Studio "当前不会命中断点.还没有为该文档加载任何符号"的情况
一.问题及原因 有这样一种调用逻辑:A.exe调用B.dll.现在想要在B的源代码中打断点,从A发起进行调试,却给出了"当前不会命中断点.还没有为该文档加载任何符号"的提示.感觉十 ...
- release环境下,当前不会命中断点,还没有为该文档加载任何符号
今天在release编译环境下出现了如标题所说的问题“ 当前不会命中断点,还没有为该文档加载任何符号”,在网上找了几个方法都没有解决我的问题,咨询了一下师傅,解决了,很简单,方法如下:右键--属性-- ...
- LoadLibrary加载动态库失败
[1]LoadLibrary加载动态库失败的可能原因以及解决方案: (1)dll动态库文件路径不对.此场景细分为以下几种情况: 1.1 文件路径的确错误.比如:本来欲加载的是A文件夹下的动态库a.dl ...
- Nginx 做代理服务器时浏览器加载大文件失败 ERR_CONTENT_LENGTH_MISMATCH 的解决方案
此文章仅作为本人的笔记,文章转载自 http://blog.csdn.net/defonds/article/details/46042809 Nginx 做反向代理,后端是 tomcat,chro ...
- springmvc 加载静态文件失败
header.jsp,部分代码 <head> <title>QA|VIS_PLATFORM</title> <meta content="width ...
- [原]排错实战——解决Tekla通过.tsep安装插件失败的问题
原总结调试排错troubleshootteklaprocess monitorsysinternals 缘起 最近同事使用.tsep安装Tekla插件的时候,Tekla提示该插件已经存在了,需要卸载后 ...
随机推荐
- python+selenium 发送邮件
import time from selenium import webdriver from selenium.webdriver import ChromeOptions from seleniu ...
- oracle将字符串根据特定字符串拆分为多个子字符串
将 字符串 '20180321-4768-4735261' 按‘-’ 拆分: 语法: INSTR()函数 1.用处: 在一个字符串中查找指定的字符,返回被查找到的指定的字符的位置. 2.语法格式: ...
- UVA - 1614 Hell on the Markets(奇怪的股市)(贪心)
题意:输入一个长度为n(n<=100000)的序列a,满足1<=ai<=i,要求确定每个数的正负号,使得所有数的总和为0. 分析: 1.若总和为0,则未加符号之前,所有数之和必为偶数 ...
- 每天一点点之vue框架开发 - 引入bootstrap
只使用css样式 如果在你的项目中只是使用css样式,那就不需要安装,直接全局引入样式就好 <link rel="stylesheet" href="https ...
- 2. Jetson TX2--python3下编译安装opencv3.4
https://cloud.tencent.com/developer/article/1327273 jetpack3.2自带了opencv3.3,但是只提供了python2.7的编译版本,所以也只 ...
- C++基础--转string
在C++中,任意数值型转可以使用字符串流的方式来实现,如果编译器支持C++11标准的话,也可以用to_string()函数来实现. 1.to_string() to_string()包含在头文件< ...
- C# 直接使用sql语句对数据库操作 (cmd.ExecuteNonQuery)
只介绍读和删 不管使用什么方法来对数据库进行操作都绕不开和数据库的连接问题,所以咱们先在App.config中添加连接字段 <connectionStrings> <add name ...
- css笔记01
CSS样式(Cascading Style Sheets) 表格布局缺陷: 嵌套太多,一旦顺序错乱页面达不到预期效果 表格布局页面不灵活,动一块整个布局全都要变 语法: 在style标签中 ...
- 修改完Apache的配置文件,重启Apache后,仍无法打开网页
在修改Apache的配置文件时,由于某些非正常操作,导致httpd.conf文件非正常打开,需要继续enter进入, 这是会在httpd.conf同级目录中产生一个隐藏文件,.httpd.conf.s ...
- 3DES 原理
3DES的原理: 加密阶段:用密钥1加密->用密钥2解密->用密钥3加密 解密阶段:用密钥3解密->用密钥2加密->用密钥1解密 版权声明:本文为博主原创文章,未经博主允许不得 ...