在 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 您想要的。
我的主要需求是对提到的反调试检查程序进行两次分析(一次有调试器,另一次没有调试器)以收集一些信息以供在运行期间进行分析-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 您想要的。