首页 > 系统相关 >linux下的ptrace函数

linux下的ptrace函数

时间:2023-03-12 16:23:17浏览次数:61  
标签:函数 tracee unsigned long PTRACE linux 进程 ptrace

Linux下的ptrace函数

ptrace系统调用的用途

ptrace系统调从名字上看是用于进程跟踪的,它提供了父进程可以观察和控制其子进程执行的能力,并允许父进程检查和替换子进程的内核镜像的值。如获取和写入寄存器的值,修改内存(Peek and poke)等。典型的使用 ptrace 的应用:gdb,strace(用来查看某进程运行过程中的系统调用),其基本原理是: 当使用了ptrace跟踪后,所有发送给被跟踪的子进程的信号(除了SIGKILL),都会被转发给父进程,而子进程则会被阻塞,这时子进程的状态就会被系统标注为TASK_TRACED。而父进程收到信号后,就可以对停止下来的子进程进行检查和修改,然后让子进程继续运行。

ptrace的使用

0x01 函数的原型

#include <sys/ptrace.h>       
long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);

各个参数的意思

request 表示要操作的类型
pid 目标进程的pid
addr 要监控的目标内存地址
data 存放读出或者写入的数据

request操作的类型及其意义

PTRACE_TRACEME:中文意思是跟踪我,这个是子进程唯一能够使用的request参数,其他的都是由跟踪者来使用。跟踪者向被跟踪者使用ptrace函数时,request除了PTRACE_SEIZE, PTRACE_INTERRUPT, PTRACE_KILL之外他的参数会导致被跟踪的进程停止。

PTRACE_ATTACH:调用者成为tracer,pid指定的进程成为tracee。然后tracee会被发送一个SIGSTOP信号,但是tracee并不一定会在这个调用完成时停止,使用waitpid来等待tracee停下来。

PTRACE_SEIZE:像PTRACE_ATTACH附着进程,但它不会让tracee暂停,addr参数须为0,data参数指定一位ptrace选项。

PTRACE_PEEKTEXT, PTRACE_PEEKDATA:从addr指定的地址中读取一个字,读取的结果作为这个函数的返回值。

PTRACE_POKETEXT, PTRACE_POKEDATA:往addr指定的地址中写入一个字。trcaee的内存值被修改。

PTRACE_GETREGS, PTRACE_GETFPREGS:将tracee的通用寄存器或浮点寄存器分别复制到tracer的内存地址中。

PTRACE_SETREGS, PTRACE_SETFPREGS:将tracer中指定的数据复制到tracee里的寄存器

PTRACE_CONT:重新启动已停止的 tracee 进程。 如果数据不为零,则它被解释为要传递给被跟踪者的信号数; 否则,不传递任何信号。

寄存器结构体定义

struct user_regs_struct
{
  unsigned long r15;
  unsigned long r14;
  unsigned long r13;
  unsigned long r12;
  unsigned long rbp;
  unsigned long rbx;
  unsigned long r11;
  unsigned long r10;
  unsigned long r9;
  unsigned long r8;
  unsigned long rax;
  unsigned long rcx;
  unsigned long rdx;
  unsigned long rsi;
  unsigned long rdi;
  unsigned long orig_rax;
  unsigned long rip;
  unsigned long cs;
  unsigned long eflags;
  unsigned long rsp;
  unsigned long ss;
  unsigned long fs_base;
  unsigned long gs_base;
  unsigned long ds;
  unsigned long es;
  unsigned long fs;
  unsigned long gs;
};

其他的更多的参数j及其说明查看ptrace文档

标签:函数,tracee,unsigned,long,PTRACE,linux,进程,ptrace
From: https://www.cnblogs.com/biyifei/p/17208380.html

相关文章

  • Linux 嵌入式预备知识
    硬件启动 从EMMC启动10100110  1.bootmode01参考手册/芯片手册2.bootdevices  只有内部启动[1:0]的时候才会需要选择启动设备  支持NORflash,NANDfl......
  • MySQL中的函数
    1.函数函数与存储过程一样,也是一组预先编译好的SQL语句的集合,理解为批处理语句。将实现某个功能的一段代码封装起来,只暴露名字,隐藏具体实现过程。函数与存储过程的......
  • API和Lambda函数式编程思想
    Arrays工具类1.Arrays.toString()该方法可以将对应数组内容以字符串形式输出2.Arrays.sort(int[])该方法对int数组内容进行选择排序原理:for(intx=0;x<arr.......
  • 质数、约数、欧拉函数、欧几里得
    质数试除法判定质数boolisprime(intx){ if(x==1) returnfalse; if(x==2) returntrue; for(inti=2;i<=x/i;i++) if(x%i==0) returnfals......
  • SQL-数值函数
       ......
  • 实现函数init() 初始化数组为全0、实现print() 打印数组的每个元素 、实现reverse()
    #define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<stdlib.h>//【题目名称】//数组操作//【题目内容】//创建一个整形数组,完成对数组的操作//实现函数init()初......
  • Linux pkill 命令
    原文地址:https://www.runoob.com/linux/linux-comm-pkill.htmlLinuxpkill用于杀死一个进程,与 kill 不同的是它会杀死指定名字的所有进程,类似于 killall 命令。kill......
  • Linux操作系统CentOS 7忘记root密码解决办法
    root用户忘记密码解决办法重启系统输入命令:reboot,并在重启的前三秒内按向下的按键,目的是为为了不让它进入系统,而是停留在开机页面,如下图所示编辑文档在开机页面按方向......
  • linux中cp-a和cp-r的区别是什么
    原文地址:http://net.sanhaostreet.com/it/202203/1513250.htmllinux中cp-a和cp-r的区别是什么Linuxcp(英文全拼:copyfile)命令主要用于复制文件或目录。语法cp[options......
  • Unity中使用Timer实现延迟调用函数
    需求背景在Unity中实现延迟调用函数的方法,据我所知有三种使用协程中的yieldreturn使用Invoke使用DoTween中的Sequence但是如果我想一次性添加多个函数,并且在每个函......