一个 进程 最多呗一个 调试器进行调试。我们可以利用代码让进程调试自己本身。从而实现其他调试器不能进行调试。
#include <stdio.h>
#include <sys/ptrace.h>
int main(int argc, char *argv[]) {
if(ptrace(PTRACE_TRACEME, 0, 0, 0) == -1) {
printf("Debugger detected");
return 1;
}
printf("All good");
return 0;
}
利用的的 ptrace 函数。PTRACE_TRACEME 指明进程将被调试,如果我们用调试器 启动程序,那么这个 ptrace 函数就会返回 -1 从而程序就会 打印 "Debugger detected"
当我们 利用 gdb 调试程序的时候,程序的启动时 先运行gdb 然后再gdb 里面 启动一个子线程 从而 进行调试。所有 当一个 程序运行的 时候 我们可以检查这个程序的父线程 如果程序的父线程是对应的 调试 我们就能让程序返回。
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
char buf0[32], buf1[128];
FILE* fin;
snprintf(buf0, 24, "/proc/%d/cmdline", getppid());
fin = fopen(buf0, "r");
fgets(buf1, 128, fin);
fclose(fin);
if(!strcmp(buf1, "gdb")) {
printf("Debugger detected");
return 1;
}
printf("All good");
return 0;
}
利用 getppid() 从而得到父进程的 pid 从而 在 /proc/%d/cmdline 里面找到 对应的字符串。
如果程序是 attach 到 gdb 的程序的 父线程就不是 对应的 gdb
这个时候 我们要检查的是 程序 对应的 运行状态 利用 /proc/self/status
文件内容
程序 自己 运行时的状态
利用 gdb 运行时的 状态