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


    缘起

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

    效果对比

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

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

    function-names-without-pdb-loaded
    function-names-without-pdb-loaded

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

    function-names-with-pdb-loaded
    function-names-with-pdb-loaded

    可见,有了调试符号的帮助,我们可以更直观的看到某个地址对应的函数名,可以更好的理解反汇编代码。但是我们在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 = "";

    {% note info %}

    说明:如果配置了_NT_SYMBOL_PATH,那么不用修改该文件。强烈建议设置环境变量_NT_SYMBOL_PATH。真正做到了一次设置,到处适用。:sunglasses:

    {% endnote %}

    • 配置好后,通过File - Load file - PDB file...来加载pdb

    load-pdb
    load-pdb

    我就是在这里遇到错误了,错误提示如下图:

    load-pdb-error
    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的事件。根据以上条件进行过滤,很快就得到了我们感兴趣的事件。看来我遇到的情况是找不到pluginpdb64.dll。从别处拷贝一个pdb64.dllplugin目录下,搞定。so fast! pretty good!:sunglasses:

    下面放一张我录制的GIF,大家感受下!

    load-pdb-fail-investigation
    load-pdb-fail-investigation

    总结

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

    参考资料

  • 相关阅读:
    关于贝宝支付的一些信息和思路
    自动执行的脚本不错的思路
    关于微信公众平台生成带参数的二维码的场景值和系统对接的问题
    centos7.3查看时区
    关于where和having的直观理解
    关于微信支付的退款那些事
    关于微信支付的那些事
    正则替换
    java 正则表达式语法
    正则表达式
  • 原文地址:https://www.cnblogs.com/bianchengnan/p/12242447.html
Copyright © 2020-2023  润新知