文章目录

  • 一、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 权限 ;​