0

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

#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++ 程序员接口的功能。

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

4

2 回答 2

1

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

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

于 2016-02-15T11:19:36.740 回答
0

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

英特尔 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 运行

希望这可以帮助 :)

于 2016-02-12T10:10:15.623 回答