在编写Linux程序过程中,考虑到自己写的程序可能会被别人调试,因此对Linux的反调试技术进行了一些研究,这里一共总结了9种方法,我将分三篇文章对这些方法进行说明。当然了,如果在这个过程中你有更好的、更加新颖的思路与方法,欢迎交换。现在开始进入正题啦。
一、忽略int3指令
我们知道,X86从它的第一代产品8086开始就提供了int 3作为它的调试指令,int 3又叫做断点指令,专门用来给调试器使用。那么如果这样的话,很容易就能够联想到,要反调试,只要插入int 3来迷惑调试器即可。但是这会影响正常的程序吗?当然了,因为int 3会在用户空间产生SIGTRAP。其实这个很简单,我们只要忽略这个信号就可以啦。
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <dirent.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/stat.h>
void handler(int signo)
{
}
void PassByInt3()
{
signal(SIGTRAP, handler);
__asm__("nop\n\t"
"int3\n\t");
printf("Hello from main!\n");
}
int main(int argc, char *argv[])
{
PassByInt3();
}