ptrace 调试器

《Linux二进制分析》第三章 Linux 进程追踪中讲述了 ptrace 调试器,管中窥豹地知道了点 gdb 调试器的工作原理,例如进程追踪、断点和符号查找的过程,依据就是 ELF 的格式规范和 ptrace 系统调用。

书中提供了名为 tracer 的示例程序,实现了跟踪程序运行,当运行到指定函数时打印出此时的寄存器信息;既可以 attach 到已经运行的进程中,也可以接受一个可执行 elf 文件的输入。该程序的大致思路如下所示:

首先,对于跟踪已经运行的程序,pid 是用户输入的,有了 pid 就可以从 /proc 文件系统中查到对应的包括路径在内的程序名;而接受可执行文件输入的方式,直接就获得了程序名。

然后,以只读方式 open() 该程序,并通过 mmap() 将文件映射到内存,获取到对应的 Elf64_Ehdr、Elf64_Phdr、Elf64_Shdr 指针,分别是 elf header、program header、section header,具体可查阅 elf(5) – Linux manual page 了解 elf 文件格式,或者使用 readelf 命令查看要跟踪的程序。从符号表中查到要中断的函数的偏移量(地址)。

其次,attach 到已经运行的程序上,或者 fork 出子进程运行可执行程序,并设置 PTRACE_TRACEME 标志让父进程可追踪该子进程。

再其次,设置函数中断,先从中断函数的地址上取一个字的指令,将这个字做位操作得到 trap 并写回中断地址。

最后,获取被跟踪进程的状态,若收到了调试中断信号 SIGTRAP 那就打印出当前寄存器信息,并将进程内存空间的中断地址写回原先的一个字的指令,rip 指令寄存器回退并重设寄存器信息让程序继续执行至退出。

参考链接
ptrace(2): process trace – Linux man page
Playing with ptrace, Part II | Linux Journal

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google photo

You are commenting using your Google account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理