#include<stdio.h>
#include <sys/ptrace.h>
int main()
{
if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0) {
printf("DEBUGGING... Bye\n");
return 1;
}
printf("Hello\n");
return 0;
}
zakk@lex:[~/test]$ ./a.out
Hello
zakk@lex:[~/test]$ gdb ./a.out
(gdb) r
Starting program: /home/zakk/test/a.out
DEBUGGING... Bye
[Inferior 1 (process 338) exited with code 01]
http://blog.linux.org.tw/~jserv/archives/002027.html
http://www.oenhan.com/gdb-principle
gdb主要功能的实现依赖于一个系统函数ptrace,通过man手册可以了解到,ptrace可以让父进程观察和控制其子进程的检查、执行,改变其寄存器和内存的内容,主要应用于打断点(也是gdb的主要功能)和打印系统调用轨迹。
gdb使用ptrace的基本流程
Linux Anti-Debugging
http://www.julioauto.com/rants/anti_ptrace.htm
- gdb调试一个新进程:通过fork函数创建一个新进程,在子进程中执行ptrace(PTRACE_TRACEME, 0, 0, 0)函数,然后通过execv()调用准备调试的程序。
- attach到已运行进程:将pid传递给gdb,然后执行ptrace(PTRACE_ATTACH, pid, 0, 0)。
Linux Anti-Debugging
http://www.julioauto.com/rants/anti_ptrace.htm
TRYING TO MAKE YOUR BINARY SHUT UP
http://www.exploit-db.com/papers/13188/
沒有留言:
張貼留言