文章目录
- 一、C 标准库 ptrace 函数简介
- 二、ptrace 函数真实作用
一、C 标准库 ptrace 函数简介
ptrace 函数 : 在 C 标准库 中有一个 ptrace 函数 , 该函数是一个系统调用方法 , 可以监视进程执行 , 查看 / 更改 被监视进程的 内存 和 寄存器 情况 , 常用于断点调试 ;
ptrace 函数对应的系统调用本质 : ptrace 标准库函数实际上调用的是 系统调用 __NR_ptrace ; 系统调用号 26 ;
ptrace 函数原型 : ptrace 函数实际上是由一系列的函数组成 , 具体调用哪个函数 , 要根据第一个参数确定 ;
#include <sys/ptrace.h>
long ptrace(enum __ptrace_request request, pid_t pid,
void *addr, void *data);
ptrace 函数参考文档 : https://man7.org/linux/man-pages/man2/ptrace.2.html
注入的原理就是围绕 ptrace 函数进行的一系列操作 ;
Linux 系统分为 用户层 和 内核层 , 在用户层调用的方法就是普通调用 , 内核层调用的方法是 系统调用 ;
系统调用 : 如果在用户层需要用到 内核层 相关函数 , 则产生中断 , 切换到内核层 , 由系统处理相应中断 , 中断处理完毕后 , 通过用户寄存器返回 , 用户层 可以通过读取 中断处理寄存器 , 获取中断处理结果 ;
Linux 中有 syscall 函数 , 专门用于系统调用 ;
二、ptrace 函数真实作用
注入并不是系统 bug , 是系统接口的特殊使用方式 ;
就像 Java 的反射一样 , 都是设计时就设计好的功能 ;
每个操作系统都需要 调试介入机制 , 用于 问题追踪 , 错误诊断 , 开发调试 等场景 ;
问题追踪 : 如果想要对程序的进程进行调试 , 获取程序运行中某个时间节点的 , 完整的内存信息 , 操作系统必须提供相应的支持 , 这里的 ptrace 函数就是为 支持 C 标准库的 Linux / Android 系统提供的这种支持 ;
错误诊断 : 当程序运行出错时 , 系统或开发环境要进行报错 , 错误诊断的依据 需要 ptrace 函数追踪进程运行情况获取 ;
开发调试 : Linux 下的 strace , gdb 等工具 , 都要用到 ptrace 函数 ;
Android 中使用 ptrace 函数 , 必须有 root 或 system 权限 ;