如何利用Ptrace拦截和模拟Linux系统调用

strace

在开始之前,我们先看一看strace的实现骨架。Ptrace一直都没有相应的使用标准,但在不同的操作系统中它的接口都是类似的,尤其是它的核心功能,但多多少少都会有一些细微的差别。Ptrace(2)的原型类似如下:
long ptrace(int request, pid_t pid, void *addr, void *data);
pidtracee的进程ID,一个tracee一次只能绑定一个tracer,但一个tracer可以绑定多个tracee

request域负责选择一个指定的Ptrace函数,例如ioctl(2)接口。对于strace来说,只有下面是必须的:
PTRACE_TRACEME:它的父进程必须跟踪这个进程。

PTRACE_SYSCALL:继续运行,但是会在下一个系统调用入口暂停运行。

PTRACE_GETREGS:获取tracee的寄存器备份。
另外两个数据域,即addrdata,它们负责给选定的Ptrace函数提供参数,一般这两个数据都可以忽略,这里我选择传入0。

strace接口本质上是其他命令的前缀:
$strace [strace options] program [arguments]
我的最小化配置不包含任何参数,所以要做的第一件事就是假设它至少包含一个参数(fork(2)),通过argv传递。
在加载目标程序之前,新的进程会告知内核它的父进程将会对它进行跟踪监视,tracee将会被这个Ptrace系统调用挂起:

pid_tpid = fork();
switch(pid) {
    case -1: /* error */
        FATAL("%s", strerror(err
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值