在 linux 中分析反调试检查

Profiling anti-debugging checks in linux

我的主要需求是对提到的反调试检查程序进行两次分析(一次有调试器,另一次没有调试器)以收集一些信息以供在运行期间进行分析-time(假设只有二进制可用)

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

最好回答详细,谢谢。

希望我能得到你想要的。

Intel PIN 不是调试器。它更像是一个 VM,它即时检测二进制代码(x86/x64),然后执行这个新检测的代码。 因为 PIN 不是开源的,所以它的内部结构相当 "secret" ;)。 但它显然不是调试器。

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

刚刚开始:

./a.out for the normal run

例如(这个有点老套 ;-) )对于调试器-运行:

创建文件 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 使用 ptrace 将自身注入到应用程序中。这意味着在尝试使用 Pin 启动应用程序时将无法使用 gdb,并且 Pin 也无法成功附加到正在调试的应用程序。

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