zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

【Android 逆向】ptrace 函数 ( C 标准库 ptrace 函数简介 | ptrace 函数真实作用 )

Android标准 函数 作用 简介 逆向 真实
2023-09-14 09:07:30 时间





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