原调试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真的是排查问题的神兵利器,前提是要善用过滤,如果用不好过滤,对我们的帮助有限。

参考资料

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

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

    原调试debug排错troubleshootprocess monitorsysinternals 缘起 最近,我们程序的某个功能在一台机器上不正常,但是在另外一台机器上却是正常的.代码是同一份,vs ...

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

    VS2017升级之后,代码调试无法进入,显示“当前无法命中断点,还没有为该文档加载任何符号”的问题解决思路: 1.工具-选项-项目和解决方案-生成并运行,取消勾选“在运行时仅生成启动项目和依赖性” 2 ...

  3. EasyDarwin开源流媒体云平台VS调试断点提示“还没有为该文档加载任何符号”的解决办法

    本文转自EasyDarwin开源团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/52063666 近日,我们EasyDarwin ...

  4. 遇到Visual Studio "当前不会命中断点.还没有为该文档加载任何符号"的情况

    一.问题及原因 有这样一种调用逻辑:A.exe调用B.dll.现在想要在B的源代码中打断点,从A发起进行调试,却给出了"当前不会命中断点.还没有为该文档加载任何符号"的提示.感觉十 ...

  5. release环境下,当前不会命中断点,还没有为该文档加载任何符号

    今天在release编译环境下出现了如标题所说的问题“ 当前不会命中断点,还没有为该文档加载任何符号”,在网上找了几个方法都没有解决我的问题,咨询了一下师傅,解决了,很简单,方法如下:右键--属性-- ...

  6. LoadLibrary加载动态库失败

    [1]LoadLibrary加载动态库失败的可能原因以及解决方案: (1)dll动态库文件路径不对.此场景细分为以下几种情况: 1.1 文件路径的确错误.比如:本来欲加载的是A文件夹下的动态库a.dl ...

  7. Nginx 做代理服务器时浏览器加载大文件失败 ERR_CONTENT_LENGTH_MISMATCH 的解决方案

    此文章仅作为本人的笔记,文章转载自  http://blog.csdn.net/defonds/article/details/46042809 Nginx 做反向代理,后端是 tomcat,chro ...

  8. springmvc 加载静态文件失败

    header.jsp,部分代码 <head> <title>QA|VIS_PLATFORM</title> <meta content="width ...

  9. [原]排错实战——解决Tekla通过.tsep安装插件失败的问题

    原总结调试排错troubleshootteklaprocess monitorsysinternals 缘起 最近同事使用.tsep安装Tekla插件的时候,Tekla提示该插件已经存在了,需要卸载后 ...

随机推荐

  1. codeforces 594

    D 给你一个长度为n的括号序列,然后你可以选择交换两个位置,你需要使得能够变成 合法括号序列的起点最多. 题解 人尽皆知的东西:合法的括号序列是,令'('为1,')'为-1,那么前缀和需要>=0 ...

  2. 使用docker快速体验kali linux

    环境 运行在 64位 机器 企业版的 win10 系统 下载镜像 首先搜索docker download 去官网下载docker:https://www.docker.com/products/doc ...

  3. Egret Engine 2D - 缩放模式和旋转模式说明

    缩放模式和旋转模式说明 缩放模式showAll 常用 noScale noBorder exactFit 次常用 fixedWidth fixedHeight fixedNarrow fixedWid ...

  4. Vue Element-ui自定义dialog样式

    第一步:定义 自定义dialog class名 第二步:全局修改自定义样式 自定义dialogStyle有三个儿子,这样只用找到他们就可以自定更改啦 .custonStyle { xxxxx } .c ...

  5. # vim ~/.vimrc vim配色

    Ubuntu # vim ~/.vimrc        # /hom/zzx 下 set nomodeline                "(这个一定要写,目前有这个安全漏洞) set ...

  6. Information:java: Errors occurred while compiling module 错误

    在用 IDEA 启动 tomcat 时 发现项目编译报错,如图所示 于是安装网上的方法把 JDK 版本都改了一下 改完之后按照道理来说,应该编译通过的,但是我就想,编译不通过肯定跟 IDEA 的配置有 ...

  7. 全面掌握Nginx配置+快速搭建高可用架构 一 random_index_module 随机主页

    修改default.conf 保存重载Nginx,完成配置 自动随机选择主页 string要替换的内容,replacement表示替换后的内容 示例 效果,只替换了第一个 如果要替换所有的,需要用到s ...

  8. 对input type=file 修改样式

    效果图先给: 在html中涉及到文件选择的问题,文件选择使用 input(class="filter_input form-control" type="file) 但是 ...

  9. Beyond Compare 文件对比工具的使用

    Beyond Compare 文件对比工具的使用 Beyond Compare 工具下载地址: http://www.onlinedown.net/soft/633850.htm 本文下载地址:E:\ ...

  10. MySQL-复制技术演进过程

    复制技术的演进可以分为:基于数据安全的复制,基于效率的复制 基于数据安全的复制 异步复制 参考: https://baijiahao.baidu.com/s?id=163939455634386120 ...