在linux中分析反调试检查

时间:2016-02-12 09:30:30

标签: linux debugging profiling ptrace intel-pin

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我希望我得到你想要的东西。

英特尔PIN不是调试器。它更像是一个即时工具二进制代码(用于x86 / x64)的VM,然后执行这个新装备的代码。 因为PIN不是开源的,所以内部是相当“秘密”的;)。 但它的CLEARLY不是调试器。

如果我理解正确你想要某种测试套件 运行你的应用程序两次,一次连接调试器,一次没有? 那么你可能应该使用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

运行

希望这会有所帮助:)