ptrace使用简介

ptrace使用简介ptrace 提供了一种机制使得父进程可以观察和控制子进程的执行过程 ptrace 还可以检查和修改子进程的可执行文件在内存中的 image 及子进程所使用的寄存器中的值 通常来说 主要用于实现对进程插入断点和跟踪子进程的系统调用 用法示例 include sys ptrace h include sys types h include sys wait h include unistd h include unistd h sys sys sys

#include 
  
    #include 
   
     #include 
    
      #include 
     
       #include 
      
        int main() { pid_t child; long orig_eax; child = fork(); if(child == 0) { ptrace(PTRACE_TRACEME, 0, NULL, NULL); execl("/bin/ls", "ls", NULL); } else { wait(NULL); orig_eax = ptrace(PTRACE_PEEKUSER,child, 4 * ORIG_EAX,NULL); printf("The child made a ""system call %ld\n", orig_eax); ptrace(PTRACE_CONT, child, NULL, NULL); } return 0; } 
       
      
     
    
  
PTRACE_TRACEME, 本进程被其父进程所跟踪。其父进程应该希望跟踪子进程 PTRACE_PEEKTEXT, 从内存地址中读取一个字节,内存地址由addr给出 PTRACE_PEEKDATA, 同上 PTRACE_PEEKUSER, 可以检查用户态内存区域(USER area),从USER区域中读取一个字节,偏移量为addr PTRACE_POKETEXT, 往内存地址中写入一个字节。内存地址由addr给出 PTRACE_POKEDATA, 往内存地址中写入一个字节。内存地址由addr给出 PTRACE_POKEUSER, 往USER区域中写入一个字节,偏移量为addr PTRACE_GETREGS, 读取寄存器 PTRACE_GETFPREGS, 读取浮点寄存器 PTRACE_SETREGS, 设置寄存器 PTRACE_SETFPREGS, 设置浮点寄存器 PTRACE_CONT, 重新运行 PTRACE_SYSCALL, 重新运行 PTRACE_SINGLESTEP, 设置单步执行标志 PTRACE_ATTACH,追踪指定pid的进程 PTRACE_DETACH, 结束追踪 

具体用法:

  1. PTRACE_TRACEME
    ptrace(PTRACE_TRACEME,0 ,0 ,0)
    本进程被其父进程所跟踪。其父进程应该希望跟踪子进程。




  2. PTRACE_PEEKTEXT, PTRACE_PEEKDATA
    ptrace(PTRACE_PEEKTEXT, pid, addr, data)
    ptrace(PTRACE_PEEKDATA, pid, addr, data)
    从内存地址中读取一个字节,pid表示被跟踪的子进程,内存地址由addr给出,data为用户变量地址用于返回读到的数据。在Linux(i386)中用户代码段与用户数据段重合所以读取代码段和数据段数据处理是一样的。






  3. PTRACE_POKETEXT, PTRACE_POKEDATA
    ptrace(PTRACE_POKETEXT, pid, addr, data)
    ptrace(PTRACE_POKEDATA, pid, addr, data)
    往内存地址中写入一个字节。pid表示被跟踪的子进程,内存地址由addr给出,data为所要写入的数据。






  4. PTRACE_PEEKUSR
    ptrace(PTRACE_PEEKUSR, pid, addr, data)
    从USER区域中读取一个字节,pid表示被跟踪的子进程,USER区域地址由addr给出,data为用户变量地址用于返回读到的数据。USER结构为core文件的前面一部分,它描述了进程中止时的一些状态,如:寄存器值,代码、数据段大小,代码、数据段开始地址等。在Linux(i386)中通过PTRACE_PEEKUSER和PTRACE_POKEUSR可以访问USER结构的数据有寄存器和调试寄存器。




  5. PTRACE_POKEUSR
    ptrace(PTRACE_POKEUSR, pid, addr, data)
    往USER区域中写入一个字节,pid表示被跟踪的子进程,USER区域地址由addr给出,data为需写入的数据。




  6. PTRACE_CONT
    ptrace(PTRACE_CONT, pid, 0, signal)
    继续执行。pid表示被跟踪的子进程,signal为0则忽略引起调试进程中止的信号,若不为0则继续处理信号signal。




  7. PTRACE_SYSCALL
    ptrace(PTRACE_SYS, pid, 0, signal)
    继续执行。pid表示被跟踪的子进程,signal为0则忽略引起调试进程中止的信号,若不为0则继续处理信号signal。与PTRACE_CONT不同的是进行系统调用跟踪。在被跟踪进程继续运行直到调用系统调用开始或结束时,被跟踪进程被中止,并通知父进程。




  8. PTRACE_KILL
    ptrace(PTRACE_KILL,pid)
    杀掉子进程,使它退出。pid表示被跟踪的子进程。




  9. PTRACE_SINGLESTEP
    ptrace(PTRACE_KILL, pid, 0, signle)
    设置单步执行标志,单步执行一条指令。pid表示被跟踪的子进程。signal为0则忽略引起调试进程中止的信号,若不为0则继续处理信号signal。当被跟踪进程单步执行完一个指令后,被跟踪进程被中止,并通知父进程。




  10. PTRACE_ATTACH
    ptrace(PTRACE_ATTACH,pid)
    跟踪指定pid 进程。pid表示被跟踪进程。被跟踪进程将成为当前进程的子进程,并进入中止状态。




  11. PTRACE_DETACH
    ptrace(PTRACE_DETACH,pid)
    结束跟踪。 pid表示被跟踪的子进程。结束跟踪后被跟踪进程将继续执行。




  12. PTRACE_GETREGS
    ptrace(PTRACE_GETREGS, pid, 0, data)
    读取寄存器值,pid表示被跟踪的子进程,data为用户变量地址用于返回读到的数据。此功能将读取所有17个基本寄存器的值。




  13. PTRACE_SETREGS
    ptrace(PTRACE_SETREGS, pid, 0, data)
    设置寄存器值,pid表示被跟踪的子进程,data为用户数据地址。此功能将设置所有17个基本寄存器的值。




  14. PTRACE_GETFPREGS
    ptrace(PTRACE_GETFPREGS, pid, 0, data)
    读取浮点寄存器值,pid表示被跟踪的子进程,data为用户变量地址用于返回读到的数据。此功能将读取所有浮点协处理器387的所有寄存器的值。




  15. PTRACE_SETFPREGS
    ptrace(PTRACE_SETREGS, pid, 0, data)
    设置浮点寄存器值,pid表示被跟踪的子进程,data为用户数据地址。此功能将设置所有浮点协处理器387的所有寄存器的值。




ptrace使用简介

 

sys_ptrace流程

参考:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226127.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午7:46
下一篇 2026年3月17日 上午7:46


相关推荐

  • Anaconda更换镜像源方法

    Anaconda更换镜像源方法Anaconda 更换镜像源 这是一个目前国内最常用好用的镜像源站点 清华大学开源软件镜像站 condaconfiga mirrors tuna tsinghua edu cn anaconda pkgs free condaconfigs channel urlsyes 此时 目录 C Users

    2026年3月19日
    2
  • 远程连接oracle01017,sqlplus远程sys用户登录ora 01017的解决方法[通俗易懂]

    远程连接oracle01017,sqlplus远程sys用户登录ora 01017的解决方法[通俗易懂]UsingORAPWDWhenyouinvokethispasswordfilecreationutilitywithoutsupplyinganyparameters,youreceiveamessageindicatingtheproperuseofthecommandasshowninthefollowingsampleoutput…

    2022年6月1日
    45
  • AI算法,又整新活!萌妹子来挑战~

    AI算法,又整新活!萌妹子来挑战~GANsNRoses动画脸控制变换算法

    2022年4月30日
    51
  • (二)Sql Server的基本配置以及使用Navicat连接Sql Server

    (二)Sql Server的基本配置以及使用Navicat连接Sql Server一:sqlserver连接的验证方式分为两种:Windows身份认证:使用windows的用户名密码验证SQLServer身份认证:使用sqlserver的用户名+密码的方式登录()二:sqlserver的环境配置实际生产环境服务器肯定是需要远程连接的,所以我们需要对本机的sqlserver进行一下的基本配置:配置支持tcp连接(否则无法使用连接工具进行远程连接)配置支持SQLServer身份认证(一般情况下都会使用这种验证方式而不是windows验证)配置

    2022年8月30日
    4
  • pycharm 风格_python主题更改

    pycharm 风格_python主题更改pycharm版本:2020.1.2Professional主题插件:MaterialThemeUI、AtomMaterialIcons效果插件下载方法IDE在Preference中找到Plugins一项,在插件商场中输入插件名并安装一开始用这种方法但是下载一半就fail了,所以转到官网下载官网下载MaterialThemeUIgithub地址MaterialThemeUI插件官网地址在插件官网中选择pycharmprofessional和相应的版本这里.

    2022年8月28日
    6
  • ETH硬分叉降低了显卡矿机的挖矿收益吗?

    ETH硬分叉降低了显卡矿机的挖矿收益吗?“北京时间2019年3月1日凌晨3:52分,ETH完成了君士坦丁堡硬分叉升级。这场从2018年8月份就开始计划的硬分叉,几经波折,但最终是平稳顺利的。虽然对比其他主流币种轰轰烈烈的硬分叉,ETH这次硬分叉显得过于平淡,但还是有很多矿工朋友想知道它是否降低了ETH的挖矿收益,未来挖矿收益如何变化,显卡矿机未来的出路在哪里?”笔者根据最近一年的ETH挖矿难度、挖矿收益、币价等变化情况,做了一些…

    2022年6月9日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号