PTrace无法识别子进程

我正在编写一个程序来监视系统调用(除其他外)。 但是我在使用ptrace识别我传递给它的进程ID方面遇到了一些麻烦。 执行该程序后,我收到以下错误消息:

:No such process

但是,我已在调用之前通过将其打印到控制台并使用ps -all验证来验证进程ID。

以下是一些可能相关的代码(如果需要,我可以发布更多):

引导孩子进程:

/* Call to be traced */

if (ptrace (PTRACE_TRACEME, 0, 0, 0) < 0){
   perror ("Process couldn't be traced");
   exit (-1);
}

/* Execute process image */

if (execv (ProcessArgs[0], &ProcessArgs[1]) < 0){
    perror ("Couldn't execute process");
    exit (-1);
}

在父进程的一个线程中:

DbgdProcess * _Process = ( DbgdProcess * ) _ProcessPass;

int SystemCall = 0,
        Status = 0;

/* I have tried sleep(1) here to wait for PTRACE_ME to no avail */

while (!_Process->CloseSignal){
    if ( wait  (&Status) < 0) // error handler
    if ( WIFEXITED  (Status)) // error handler
    if (!WIFSTOPPED (Status)) continue;

    SystemCall = ptrace (PTRACE_PEEKUSER, _Process->ID, 4 * ORIG_RAX, 0);

    if (SystemCall < 0) // error handler

    printf ("Process made system call %dn", SystemCall);

    if (ptrace (PTRACE_CONT, _Process->ID, 0, 0) < 0) // error handler
}

任何人都可以向我解释这种行为?

一些额外的笔记:

  • 正在调试的进程是父进程的直接子进程
  • 我很确定这是一个64位编译,因为sys / reg.h只定义了RAX
  • 所有错误处理程序都包含perror()消息
  • 更新:

    我从手册页读到这个:

    大多数ptrace命令(除了PTRACE_ATTACH,PTRACE_SEIZE,PTRACE_TRACEME,PTRACE_INTERRUPT和PTRACE_KILL之外的所有命令)都要求tracee处于ptrace-stop中,否则它们会因ESRCH而失败。

    我相信ESRCH给出的信息是“没有这样的过程”。 所以,当我进行ptrace调用时,这个过程可能不会被ptrace停止?

    更新:

    我正在测试这个例子中的代码。 我做了以下工作之后才开始工作: - 将头部更新为 - 将(eax_orig * 4)更改为(rax_orig * 8)

    但是,这些更改也是在我的程序中,它仍然不起作用。

    更新:

    我有我的代码工作。 我不完全确定为什么,但是在使用ptrace(2)进行轮询调用的同一线程中调用PTRACE_ATTACH后,它开始工作。 我想这意味着ptrace必须在父进程的同一线程中使用,但我不完全确定。 我现在的问题是,有人知道这是真的吗? 或者,如果没有,为什么ptrace以这种方式表现?

    更新:

    我发现这个链接,这似乎表明我的问题并非闻所未闻。


    睡眠(1)有时不够; 尝试睡眠(5)。


    在检查过程是否停止之前,为什么要做PTRACE_SYSCALL?

    理想情况下,在父线程中,您应该等待孩子通过使用等待来停止。

    一旦孩子以WIFSTOPPED停止,那么只能使用任何其他的ptrace呼叫。

    看起来ESTRCH由PTRACE_SYSCALL返回。 你能确认吗?

    链接地址: http://www.djcxy.com/p/66373.html

    上一篇: PTrace Not Recognizing Child Process

    下一篇: how to intercept calls to the file systems