我的主要要求是对所提到的反调试检查程序进行两次配置(一旦存在调试器而另一个没有它),以便在运行时收集一些信息进行分析(假设只有二进制文件是可用的)
#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 ++程序员界面的功能。
详细的答案会很棒,谢谢。
答案 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
运行希望这会有所帮助:)