小编Cli*_*t O的帖子

使用ptrace跟踪跨子节点的所有execve()调用

我正在尝试在Linux CentOS上编写一个工具来跟踪所有生成的进程以及运行的内容.本质上,我有兴趣走所有的fork /克隆并从中发出所有的命令行execve().Strace已经(某些)这样做了,但它也截断了调用和参数.我也想更好地了解它是如何ptrace()工作的.

因此,第一个障碍是弄清楚如何使用ptrace()走一个分支/克隆而不需要跟踪程序需要分叉自己的副本.我挖了进来,发现了这个怎么样.由于fork是在Linux上使用clone实现的,所以我注意到strace将一些比特放入克隆系统调用中,以便在没有任何额外麻烦的情况下启用子跟踪.

所以,本质上代码只是一个大问题:

while (1) {
    int pid = wait3(-1,...);

    /* process what happened */

    ptrace(PTRACE_SYSCALL, pid,...);
}
Run Code Online (Sandbox Code Playgroud)

这适用于相对简单的进程/bin/sh,但是,某些进程导致wait()无限期挂起.我唯一能够确定的是,我正在追踪的过程就是sys_rt_sigsuspend()在它的孩子身上执行(因此,追踪者的孙子),然后是楔形物.

我很好奇是否有一种理智的方式可以调试可能发生的事情.有些事情显然阻止了流程树的进展

这是有问题的程序的源代码:

#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

/* For the clone flags
 */
#include <sched.h>

/* #include <errno.h> */

#include <sys/ptrace.h>
#include <sys/user.h>

/* Defines our syscalls like 
 */
#include <sys/syscall.h>

#include <sys/reg.h>
#include <stdio.h>

#include <signal.h>

#include <ctype.h>

#include …
Run Code Online (Sandbox Code Playgroud)

linux ptrace system-calls

9
推荐指数
1
解决办法
9565
查看次数

标签 统计

linux ×1

ptrace ×1

system-calls ×1