我们可以通过Hook ptrace系统调用,来绕过ptrace反调试技巧。示例代码如下:
int ptrace(int request, pid_t pid, caddr_t addr, int data) { //如果request参数等于PTRACE_ATTACH,我们可以直接返回0,来绕过ptrace反调试技巧 if(request == PTRACE_ATTACH) return 0;
//否则,我们调用原来的ptrace系统调用
return old_ptrace(request, pid, addr, data);
}
void hook_ptrace() { //获取ptrace系统调用的地址 void* addr = dlsym(RTLD_NEXT, "ptrace");
//保存原来的ptrace系统调用
old_ptrace = (int(*)(int,pid_t,caddr_t,int)) addr;
//Hook ptrace系统调用
mprotect(addr, sizeof(int), PROT_READ | PROT_WRITE);
*(unsigned char*)addr = 0xE9;
*(unsigned int*)(addr+1) = (unsigned int)(&ptrace) - (unsigned int)(addr) - 5;
mprotect(addr, sizeof(int), PROT_READ | PROT_EXEC);
}