必备知识:
1)一个debugger进程,一个要调试的program进程
2)一个进程可以通过sys_call(ptrace)修改另一个进程的内存值和寄存器值
3)可以通过Signal(操作系统信号)来暂停、停止、退出一个正在运行的进程
简易版本:
1)当用户设置一个breakpoint后,debugger进程替换program进程对应代码位置的指令为0xCC。
2)当程序进程进行到对应位置时,执行0xCC对应的操作即INT 3。INT 3 会使得操作系统发送SIGTRAP给program进程,导致程序进程暂停运行
3)由于debugger进程是program的父进程,当program暂停时,父进程收到信息,然后debugger进程将程序之前的指令放回program内存,并继续program的运行(通过PTRACE_CONT)
4)除此之外,debugger进程可以通过PTRACE_POKETEXT和PTRACE_SETREGS获取program暂停时的内存数据,因此我们可以看到断点时的程序参数数据及变化
因此,是通过更改程序的内存数据,来触发系统信号来暂停program的运行,并通到sys_call来获取program的当前参数数据,再通过sys_call来继续执行program
代码级信息待续