PTRACE函数代码分析

上传人:鲁** 文档编号:494842365 上传时间:2023-10-28 格式:DOC 页数:48 大小:498.18KB
返回 下载 相关 举报
PTRACE函数代码分析_第1页
第1页 / 共48页
PTRACE函数代码分析_第2页
第2页 / 共48页
PTRACE函数代码分析_第3页
第3页 / 共48页
PTRACE函数代码分析_第4页
第4页 / 共48页
PTRACE函数代码分析_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《PTRACE函数代码分析》由会员分享,可在线阅读,更多相关《PTRACE函数代码分析(48页珍藏版)》请在金锄头文库上搜索。

1、一 函数说明1. 函数使用说明名字ptrace 进程跟踪形式#include int ptrace(int request, int pid, int addr, int data); 描述Ptrace 提供了一种父进程可以控制子进程运行,并可以检查和改变它的核心image。它主要用于实现断点调试。一个被跟踪的进程运行中,直到发生一个信号。则进程被中止,并且通知其父进程。在进程中止的状态下,进程的内存空间可以被读写。父进程还可以使子进程继续执行,并选择是否是否忽略引起中止的信号。Request参数决定了系统调用的功能:PTRACE_TRACEME 本进程被其父进程所跟踪。其父进程应该希望跟踪子

2、进程。 PTRACE_PEEKTEXT, PTRACE_PEEKDATA 从内存地址中读取一个字节,内存地址由addr给出。PTRACE_PEEKUSR 从USER区域中读取一个字节,偏移量为addr。 PTRACE_POKETEXT, PTRACE_POKEDATA 往内存地址中写入一个字节。内存地址由addr给出。PTRACE_POKEUSR 往USER区域中写入一个字节。偏移量为addr。PTRACE_SYSCALL, PTRACE_CONT 重新运行。 PTRACE_KILL 杀掉子进程,使它退出。 PTRACE_SINGLESTEP 设置单步执行标志 PTRACE_ATTACH 跟踪

3、指定pid 进程。 PTRACE_DETACH 结束跟踪Intel386特有:PTRACE_GETREGS读取寄存器PTRACE_SETREGS设置寄存器PTRACE_GETFPREGS读取浮点寄存器PTRACE_SETFPREGS设置浮点寄存器init进程不可以使用此函数返回值成功返回0。错误返回-1。errno被设置。错误EPERM 特殊进程不可以被跟踪或进程已经被跟踪。ESRCH 指定的进程不存在EIO 请求非法2. 功能详细描述1) PTRACE_TRACEME 形式:ptrace(PTRACE_TRACEME,0 ,0 ,0)描述:本进程被其父进程所跟踪。其父进程应该希望跟踪子进程。

4、 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, add

5、r, 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

6、(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)

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,

8、 signle)描述:设置单步执行标志,单步执行一条指令。pid表示被跟踪的子进程。signal为0则忽略引起调试进程中止的信号,若不为0则继续处理信号signal。当被跟踪进程单步执行完一个指令后,被跟踪进程被中止,并通知父进程。10) PTRACE_ATTACH 形式:ptrace(PTRACE_ATTACH,pid)描述:跟踪指定pid 进程。pid表示被跟踪进程。被跟踪进程将成为当前进程的子进程,并进入中止状态。11) PTRACE_DETACH 形式:ptrace(PTRACE_DETACH,pid)描述:结束跟踪。 pid表示被跟踪的子进程。结束跟踪后被跟踪进程将继续执行。12)

9、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)描述:读取浮点寄存器值,

10、pid表示被跟踪的子进程,data为用户变量地址用于返回读到的数据。此功能将读取所有浮点协处理器387的所有寄存器的值。15) PTRACE_SETFPREGS形式:ptrace(PTRACE_SETREGS, pid, 0, data)描述:设置浮点寄存器值,pid表示被跟踪的子进程,data为用户数据地址。此功能将设置所有浮点协处理器387的所有寄存器的值。二 80386的调试设施80386提供的调试设施包括:l 一字节的陷阱指令l 单步指令l 断点检测l 任务切换时的自陷1. 调试断点断点设施是80386为调试程序提供的最重要的功能。一个断点,允许编程人员对特定的线性地址设置特定的条件;

11、当程序访问到该线性地址并满足特定的条件时,即跳转到异常处理程序。80386可支持同时设置四个断点条件,编程人员可在程序中的四个位置设置条件,使其转向异常处理程序。这四个断点的每一个断点,都可以是如下三种不同类型的任何一种:只在指令地址与断点地址一致时,断点有效。数据写入地址与断点地址一致时,断点有效。数据读出地址或数据写入地址与断点地址一致时,断点有效。1) 调试寄存器为支持提供四个调试断点,在80386中增加了八个寄存器,编号为DR0至DR7。这八个寄存器中由四个用于断点,两个用于控制,另两个保留未用。对这八个寄存器的访问,只能在0级特权级进行。在其它任何特权级对这八个寄存器中的任意一个寄存

12、器进行读或写访问,都将产生无效操作码异常。此外,这八个寄存器还可用DR6及DR7中的BD位和GD位进行进一步的保护,使其即使是在0级也不能进行读出或写入。对这些寄存器的访问使用通常的MOV指令:MOV reg Dri该指令将调试寄存器i中的内容读至通用寄存器reg中;MOV Dri reg该指令将通用寄存器reg中的内容写至调试寄存器i中。此处i的取值可以为0至7中的任意值。图表示了这八个调试寄存器。这些寄存器的功能如下:DR0DR3寄存器DR0DR3包含有与四个断点条件的每一个相联系的线性地址(断点条件则在DR7中)。因为这里使用的是线性地址,所以,断点设施的操作,无论分页机制是否启用,都是

13、相同的。DR4DR5保留。DR6DR6是调试状态寄存器。当一个调试异常产生时,处理器设置DR6的相应位,用于指示调试异常发生的原因,帮助调试异常处理程序分析、判断,以及作出相应处理。DR7DR7是调试控制寄存器。分别对应四个断点寄存器的控制位,对断点的启用及断点类型的选择进行控制。所有断点寄存器的保护也在此寄存器中规定。DR6各位的功能B0B3当断点线性地址寄存器规定的条件被检测到时,将对应的B0B3位置1。置位B0B3与断点条件是否被启用无关。即B0B3的某位被置1,并不表示要进行对应的断点异常处理。BD如下一条指令要对八个调试寄存器之一进行读或写时,则在指令的边界BD位置1。在一条指令内,

14、每当即将读写调试寄存器时,也BD位置1。BD位置1与DR7中GD位启用与否无关。BS如果单步异常发生时,BS位被置1。单步条件由EFLAGS寄存器中的TF位启用。如果程序由于单步条件进入调试处理程序,则BS位被置1。与DR6中的其它位不同的是,BS位只在单步陷阱实际发生时才置位,而不是检测到单步条件就置位。BTBT位对任务切换导致TSS中的调试陷阱位被启用而造成的调试异常,指示其原因。对这一条件,在DR7中没有启用位。DR6中的各个标志位,在处理机的各种清除操作中不受影响,因此,调试异常处理程序在运行以前,应清除DR6,以避免下一次检测到异常条件时,受到原来的DR6中状态位的影响。DR7各位的

15、功能LENLEN为一个两位的字段,用以指示断点的长度。每一断点寄存器对应一个这样的字段,所以共有四个这样的字段分别对应四个断点寄存器。LEN的四种译码状态对应的断点长度如下LEN说明0 0断点为一字节0 1断点为两字节1 0保留1 1断点为四字节这里,如果断点是多字节长度,则必须按对应多字节边界进行对齐。如果对应断点是一个指令地址,则LEN必须为00RWERWE也是两位的字段,用以指示引起断点异常的访问类型。共有四个RWE字段分别对应四个断点寄存器,RWE的四种译码状态对应的访问类型如下RWE说明0 0指令0 1数据写1 0保留1 1数据读和写GE/LEGE/LE为分别指示准确的全局/局部数据断点。如果GE或LE被置位,则处理器将放慢执行速度,使得数据断点准确地把产生断点的指令报告出来。如果这些位没有置位,则处理器在执行数据写的指令接近执行结束稍前一点报告断点条件。建议读者每当启用数

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号