【问题标题】:Profiling anti-debugging checks in linux在 linux 中分析反调试检查
【发布时间】:2016-05-23 09:25:37
【问题描述】:

我的主要要求是对提到的反调试检查程序进行两次分析(一次在有调试器的情况下,另一次在没有调试器的情况下)以收集一些信息以在运行时进行分析(假设只有二进制文件是可用)

#include <stdio.h>
#include <sys/ptrace.h>

int i_am_debugged()
{
    if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0) 
     {  
            printf("Avoid debugging please");
        return 1;
     }

    return 0;
}

int main()
{
    if(i_am_debugged())
    {
        return 1;
    }

  printf("It's going well ! No debugging !\n");

return 0;

}

目前,我为此编写了一个英特尔 PIN 工具,但由于 PIN 的工作方式并始终执行“一切顺利!没有调试!'。

所以,我的问题:

我能做些什么(附加调试器并运行 pin 工具或其他东西)来使用我的 PIN 工具分析两种类型的运行,或者任何其他类型的分析(例如二进制翻译等)可以帮助我吗?案例?

我想收集有关指令的特定信息,而不仅仅是调用图等,因此想要一些类似于 PIN 的 C++ 程序员接口的功能。

一个详细的答案会很好,谢谢。

【问题讨论】:

  • 我真的不明白你在这里遇到了什么问题。您遇到的问题是无法附加调试器吗?
  • 我想要的是附加一个调试器并同时使用 pin 工具进行配置。请参阅 Felix 的答案和相应的 cmets 以了解我面临的确切问题。我已经尝试过 [software.intel.com/sites/landingpage/pintool/docs/67254/Pin/… 中的说明。但是,当我在 PIN 和 gdb 的控制下运行上述代码时,仍然没有检测到 gdb。
  • 我明白了。 Pin 使用 Linux 调试接口 (ptrace) 将自身注入到应用程序中。这使得 Pin 和调试器之间的交互变得困难。具体来说,您无法使用 gdb 启动 Pin 并获得预期的行为。此外,由于 Pin 的工作方式,在调试器中放置断点之类的操作不会按预期工作。我认为您最好的选择是使用 Pin 启动,然后在 Pin 使用 -pause_tool 旋钮等待您时附加调试器。但是,如前所述,不要期望能够在应用程序上透明地使用 gdb。
  • 谢谢,会试一试。我尝试使用 [software.intel.com/sites/landingpage/pintool/docs/67254/Pin/… 中给出的 -appdebug,但输出仍然是“进展顺利!没有调试! .您认为像 ATOM 或其他工具这样的工具更适合我的用例吗?因为,我是仪表和分析的新手,所以我不太了解。
  • 对不起,上面的链接应该指向 Pin Advanced Debugging Extensions ,由于某种原因它一直在变化。而且,当您说暂停 pin 工具然后附加 gdb 时,您的意思是将 gdb 附加到 Pin 工具或应用程序?附加到 Pin 工具没有帮助,对吧?此外,它会与 -appdebug 非常相似,对吧?

标签: linux debugging profiling ptrace intel-pin


【解决方案1】:

Pin 使用ptrace 将自己注入到应用程序中。这意味着在尝试使用 Pin 启动应用程序时无法使用gdb,并且 Pin 也无法成功附加到正在调试的应用程序。

我的建议是使用 -pause_tool 旋钮启动 Pin,然后将 gdb 附加到进程。这将使应用程序的 ptrace 调用返回您想要的。

【讨论】:

  • 谢谢,那行得通。一个问题,Pin 有一个关于“高级调试扩展”的部分,它指定了使用 gdb 和 pin 来调试应用程序的 -appdebug 选项。但是,-pause_tool 通常用于将调试器附加到 Pin 工具。但是,应用程序如何能够在后一种情况下检测到 gdb 而不是在前一种情况下呢?
  • 在前一种情况下,应用程序调试开关使 pin 的行为类似于 gdb 后端(又名 gdbserver)。虽然它提供了功能,但它不使用相同的方法。具体来说,该过程没有被跟踪。在后一种情况下,正在跟踪进程。
  • 暂停工具旋钮只允许您在执行代码之前附加 gdb。它通常用于调试工具,但不一定非要这样使用。
  • 有关 pinadx 工作原理的更多详细信息,请查找题为“PinADX:使用动态仪器进行可定制调试的界面”的论文
  • 太好了,如果你有时间,我也有另一个问题。 [stackoverflow.com/questions/35454343/…。谢谢。
【解决方案2】:

我希望我能得到你想要的。

英特尔 PIN 不是调试器。它更像是一个虚拟机,它即时检测二进制代码(对于 x86/x64),然后执行这个新检测的代码。 因为 PIN 不是开源的,所以它的内部结构相当“秘密”;)。 但它显然不是调试器。

如果我对您的理解正确,您需要某种测试套件 运行您的应用程序两次,一次连接调试器,一次不连接? 那么你可能应该使用 gdb。

开始吧:

./a.out for the normal run

例如(这个有点hacky ;-))用于调试器运行:

创建文件 mygdbscript(需要 gdb 的参数,例如:gdb -x ./mygdbscript

这个文件的内容就是:

# you probably dont want gdb to stop under ANY circumstances
# as this is an automatic check. So pass all signals to the application.
handle all nostop print pass
run
quit

然后使用 gdb -x ./mygdbscript --args ./a.out 运行

希望这会有所帮助:)

【讨论】:

  • 谢谢,但请稍作澄清。我想运行程序两次,使用和不使用调试器以及在这种情况下由 PIN 工具完成的运行时分析。正如我所说,我想收集一些关于函数、分支等的运行时信息,问题是 gdb 没有像 PIN 那样提供任何用于分析的自定义功能。有什么想法吗?
  • 我只是设法使用上面调用 gdb -x ./mygdbscript --args "bash /home/&lt;user&gt;/software/pin/pin.sh -t /home/&lt;user&gt;/software/.../tool.so -- ./a.out" 的脚本来做到这一点,但是,直接调试“pinized”应用程序就像打风车一样......如果你只想让你的 ptrace 检查工作,我认为这很好。如果你真的想调试这个,你应该阅读 PIN 用户指南“PIN 高级调试扩展”中的段落(见这里software.intel.com/sites/landingpage/pintool/docs/67254/Pin/…
  • 好的,我都试过了。 gdb -x ./mygdbscript --args /home/.../pin-2.14-71313-gcc.4.4.7-linux/pin -t obj-intel64/mine.so -- /home/.../ptra2 。这给出了一个错误程序收到信号 SIGUSR1,用户定义信号 1。0xf7fd9d80 in ?? () 调试会话处于活动状态。 Inferior 1 [process 28168] 将被杀死。 其次,我运行 gdb 以及链接中给出的 PIN,但随后收到输出 一切顺利!没有调试!。为什么没有检测到 gdb?
  • 看看另一个答案。我不知道 PIN 使用 ptrace 进行自我注入。但很高兴知道!在这种情况下,您需要更复杂一些,以便在启动时附加调试器(见上文)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
相关资源
最近更新 更多