反调试技术

1.ptrace自身进程

一个 进程 最多呗一个 调试器进行调试。我们可以利用代码让进程调试自己本身。从而实现其他调试器不能进行调试。

#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"

2.检查父进程名称

当我们 利用 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 里面找到 对应的字符串。

3.检查进程运行状态

如果程序是 attach 到 gdb 的程序的 父线程就不是 对应的 gdb

这个时候 我们要检查的是 程序 对应的 运行状态 利用 /proc/self/status 文件内容

程序 自己 运行时的状态

利用 gdb 运行时的 状态