【问题标题】:Is there a way to make gdb share ptrace with another process?有没有办法让 gdb 与另一个进程共享 ptrace?
【发布时间】:2016-02-17 14:14:50
【问题描述】:

我需要运行另一个需要 ptrace() 的进程,它是劣等的。但是 gdb 也需要 ptrace() 一样低级,所以这会导致混乱。我想到的第一个也是显而易见的解决方案是在其他进程需要访问下级然后再次附加时分离 gdb,但是当停止下级进行调试时这也是有问题的。然后我尝试使用 gdb 的 shell 命令从 gdb 启动另一个进程,认为如果 gdb 作为子进程执行另一个进程,它可能会起作用,但即使 gdb 作为子进程执行它,它们也会有不同的 pid,所以问题仍然存在。

是否有可能使 gdb 和其他进程看起来共享相同的 pid,以便它们可以附加到相同的下级?抱歉,如果这是一个无聊的问题,我还是 Linux 新手。

【问题讨论】:

  • Linux prohibits 两个进程在同一目标上调用 ptrace。你到底想完成什么?
  • 我想运行 scanmem 和 gdb 来做一些基本的内存搜索。我也试过用gdb的find命令来做,但是太慢了。

标签: gdb ptrace


【解决方案1】:

不,没有办法做到这一点。

最好的办法是向 gdb 添加新代码来做你想做的事。

【讨论】:

  • 我明白了,这是我害怕得到的评论。 Welp,除了侵入 gdb 之外,我似乎别无选择。是时候学习一些全新的(和可怕的)东西了。
【解决方案2】:

这并非完全不可能。只是非常非常非常困难。可能比它的价值更难(即 - 比破解 gdb)。然而,fakeroot-ng 的作用是让strace 工作。

这个想法是,如果您同时运行目标进程由同一调试器跟踪的 gdb,您可以模拟 gdb 完成的 ptrace 调用,并自己执行它们。结果是 gdb 认为它正在跟踪您的子进程,但实际上您是在实践中跟踪它的人。

就像我上面所说的,这种方法绝不比破解 gdb 来做你想做的事情更简单。

【讨论】:

    【解决方案3】:

    解决方案 1:不要使用 ptrace

    在最新版本的 Linux(自 3.2 起)中,一个进程可以读取/写入另一个进程内存而无需先对其进行 ptracing:

    • open/read/write-ing /proc/$pid/mem (在 Linux 3.2 之前,只有在目标进程停止时才能从该文件中读取,但从 Linux 3.2 开始,您不需要停止目标进程) ;

    • 或者使用新的系统调用process_vm_readv() and process_vm_write()

    scanmem 可以调整为避免跟踪目标进程并改用这些方法。由于scanmem只使用PTRACE_ATTACHPTRACE_DETACHPTRACE_PEEKDATAPTRACE_POKEDATA,所以应该可以简单地写一个ptraceless版本。

    解决方案 2:GDB 服务器

    总结:

    [GDB] ----------> [ tracer ] ---> [ traced ]
          GDB protocol          ptrace
    

    你有三个进程:

    • GDB 进程;

    • (其他)跟踪器进程;

    • 被跟踪的进程。

    这个想法是 GDB 不会 ptrace 被跟踪的进程本身。

    相反,您想修改跟踪器,以便使用GDB protocol 向 GDB 公开类似 gdbserver 的接口。 GDB 不跟踪被跟踪的进程,而是连接到跟踪器,该跟踪器可以代表 GDB 对跟踪器执行操作。

    这意味着跟踪器必须管理其 ptrace 操作,以便同时执行 GDB 和它自己的任务,这可能不是一件容易的事。

    第二种解决方案对于您无法实现的目标来说过于复杂/过度。

    【讨论】:

    • 看来scanmem使用了ptrace。你能指出如何在没有 ptrace 的情况下访问另一个进程的内存吗?
    • 一个简单的例子,是我写的这个程序 (github.com/randomstuff/unjit),它从另一个进程读取 JIT 编译的代码,而不用 ptrace 和反汇编它 (github.com/randomstuff/unjit/blob/…)。
    • 您是否有理由不简单地指向 syscall/proc 文件/Linux 3.2 版中添加的允许这样做的任何内容?通过阅读您的代码,我只能看到您使用 libelf 加载给定进程使用的 ELF 文件,这当然可以让您反汇编它,但这不是读取另一个进程的地址空间。
    • 第二个链接指向process_vm_readv的调用,这是我们正在讨论的系统调用:)
    • 更新了答案。
    猜你喜欢
    • 2019-05-19
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多