[原]排错实战——解救加载调试符号失败的IDA

原调试IDA排错troubleshootsymbolspdbsysinternalprocess monitor

缘起

最近想借助IDA逆向一个函数。在windows下,调试器(比如vs, windbg)可以通过调试符号(PDB)把地址与符号名对应起来,为我们提供更可读的信息。IDA应该也支持加载PDB,通过查看IDA安装目录下的idahelp.chm(打开后搜索PDB即可找到相关说明)发现还真支持。但是当我加载符号的时候,却失败了。本文记录了整个调查过程。

效果对比

先放两张对比图,大家直观感受下区别。

没有调试符号的帮助的情况下,我们看到的效果:

function-names-without-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-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

总结

process monitor真的是排查问题的神兵利器,前提是要善用过滤,如果用不好过滤,对我们的帮助有限。

参考资料

原文地址:https://www.cnblogs.com/bianchengnan/p/12242447.html

时间: 2024-08-03 08:24:12

[原]排错实战——解救加载调试符号失败的IDA的相关文章

[原]排错实战——通过对比分析sysinternals事件修复程序功能异常

原调试debug排错troubleshootprocess monitorsysinternals 缘起 最近,我们程序的某个功能在一台机器上不正常,但是在另外一台机器上却是正常的.代码是同一份,vs版本也一样(打的补丁也一样).编译出来的程序在两台电脑上运行的结果就是不一样.惊不惊喜,意不意外?如果是你遇到了这种情况,你会怎么调查呢?:upside_down_face: {% note info %} 说明: 为了跟大家分享这个问题,我事后在自己的机器上重新把整个过程梳理了一遍,并保存了pro

VS2017调试代码显示“当前无法命中断点,还没有为该文档加载任何符号”

VS2017升级之后,代码调试无法进入,显示"当前无法命中断点,还没有为该文档加载任何符号"的问题解决思路: 1.性" 2.选中启动项目-右键属性-生成,取消勾选"优化代码" 3.选中启动项目-右键属性-Web,勾选"ASP.NET"和"启用编辑并继续" 4.工具栏-调试-选项-常规,取消勾选"启用仅我的代码",取消勾选"要求源文件与原始版本完全匹配",勾选"启用编辑

VC:当前不会命中断点,还没有为该文档加载任何符号

VS2013中设置的断点无效:"当前不会命中断点,还没有为该文档加载任何符号".问题主要出在没有生成调试信息.解决方法如下: (1)项目-〉属性-〉配置属性-〉C/C++-〉常规-〉调试信息格式,这里不能为"禁用". (2)项目-〉属性-〉配置属性-〉链接器-〉调试-〉生成调试信息,这里设为"是 (/DEBUG)".

当前不会命中断点 还没有为该文档加载任何符号 (转载)

VS2010,我改了下文红色部分就可以了,以下为转载内容: 相信很多人在网页编程时都遇到过这个问题,就是设置断点时给出提示,之后不能选中.我今天也碰到这个问题了,足足折磨了我一天.设置是debug没错,我也没有找到“C/C++->常规->调试信息格式”这个东东,估计是C++里的设置,我用的是C#.”将”要求源文件与原始版本完全匹配”的勾取消“我也试了还是不行,webconfig里的debug设置也是true.折腾了一天才发现,我要调试的文本所处的文件夹里还有一个webconfig,这里的deb

当前不会命中断点 还没有为该文档加载任何符号 的处理方法

一.删除引用项目的debug 二.配置管理器中把所有项目的“生成”打勾.“配置”全部选成“debug“,切忌release 三.配置管理器中“活动解决方案配置”.新建一个方案 四.将引用目录统一设到某个目录,防止没有引用到最新的(源码与dll版本不匹配) 五.工具.选项.调试.常规中的“要求源文件和原始版本完全匹配”的勾去掉 Web项目要注意: 把webconfig里的debug设置为true(要检查子目录是否已经存在WebConfig文件了,会覆盖根目录的属性) <system.web> &

当前不会命中断点,还没有加载该文档加载任何符号

断点调试是我编程时经常用到的,但有的程序并一定有Windows界面,而是附加到其他程序中的,如ArcGIS的Addin开发.当我在代码中插入断点调试无效(断点不起作用),并警告"当前不会命中断点,还没有加载该文档加载任何符号". 网上查了说可能是Framework版本的问题,我才恍然大悟:ArcGIS 10.1的Framework版本配置是3.5,而默认VS2010新建的程序Framework版本是4.0,原来如此. 修改目标框架后,要重新清理.重新生成一下. 虽然,调试时还是如此显示

C++ VS2010“当前不会命中断点,还没有为该文档加载任何符号”

[问题] VS2010中设置的断点无效:"当前不会命中断点,还没有为该文档加载任何符号 [可能的原因] 没有生成调试信息 [解决] 更改项目属性: 项目-〉属性-〉配置属性-〉C/C++-〉常规-〉调试信息格式,这里不能为"禁用" 项目-〉属性-〉配置属性-〉链接器-〉调试-〉生成调试信息,这里设为"是"

当前不会命中断点还未为文档加载任何符号——问题探究

from:http://blog.csdn.net/tr1912/article/details/51111824 今天在调试牛腩网页的时候遇到了一个问题需要用到断点调试来解决,可是加了断点之后出现了下面的情况: 然后就郁闷了,查了百度之后得到了如下的结果: 断点调试是VS中的一大利器,有了它我们可以快速定位到代码的问题所在.在某些情况下会导致设置了断点后程序无法在断点处停下,下面分4种情况来解决断点不会命中的问题: 1.检查VS的调试模式.VS的调试分为两种,Debug和Release.Deb

Uni-app基础实战上加载新下拉刷新 WordPress rest api实例(一)

Uni-app实战上加载新下拉刷新 WordPress rest api实例 通过WordPress自带的 rest api接口我们去实现uni-app的上拉刷新和下拉加载,首先我们需要一点基础.如果有基础可以直接看正文,如果大家和枫瑞一样也是新手那大家可以阅读以下文章 uni-app 实战接入热门小说API接口 适用于新手 Uni-App 微信项目练习首页列表含界面传参 新手教程(一) Uni-App 微信项目练习列表传参聊天窗口 新手教程(二) 如果有基础的我们就看这这边哈哈! [tip]1