【问题标题】:"strace -p pid" gives "attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted"“strace -p pid”给出“附加:ptrace(PTRACE_ATTACH,...):不允许操作”
【发布时间】:2016-06-23 12:43:24
【问题描述】:

我编写了一个 android 应用程序来监视正在运行的进程的系统调用,但我得到的只是“不允许操作”。我尝试使用“chmod 4777 strace”和 chown“root:root strace”禁用 SElinux 并在 strace 上启用 root 访问,但我仍然无法解决问题。该应用程序在模拟器 4.3 (API 18) 上运行。

【问题讨论】:

    标签: android strace


    【解决方案1】:

    进程可以禁用跟踪,并且无法附加,即使是 root。

    如果目标进程无法接收来自 strace 的信号(如果以 root 身份运行成功,则可以触发 EPERM,尽管我不确定 strace 是否能很好地处理内容),目标进程本身就是 setuid(它们禁用跟踪),以及如果跟踪已被进程本身简单地禁用。此外,一个进程最多可以由一个调试器跟踪。

    strace 不能附加不可转储的进程。进程可以将自己设置为不可转储,并且它也会在 UID 更改时自动发生(由于 setuid 位或 setuid 系统调用)

    【讨论】:

    • 感谢您的解释。我注意到当从 android 应用程序运行例如“Strace cat”file“-o /path”时,在“file”上跟踪“cat”的输出会根据指定的路径生成一个文件。但是,使用“ Strace -p(PID zygote process) -f -o /path 我得到一个空文件,知道我试图派生随机应用程序,希望从与这些应用程序关联的新生成的子进程中获取系统调用( Zygote 是所有 android 应用程序进程的父进程)。
    • 我也尝试在不跟踪 zygote 的情况下直接 strace 子进程,但徒劳无功,我遇到了同样的问题。你有什么建议?我在一个我记不起名字的论坛的某个地方读到,可以修改内核以进行跟踪。目前我正在开发 API 15。
    • 要修改内核,你需要一个根设备(我猜你有它)。 API 位于内核之上,因此它实际上是无关紧要的。更换内核不是应用能做的。
    • 内核可以修改为不执行安全检查。尽管如此,您仍然无法跟踪已跟踪的进程。
    • 其实我觉得这是可能的。我已经通过使用黑客技巧解决了这个问题;)
    【解决方案2】:

    在某些情况下,在 Android 上执行 strace 会失败并显示“ptrace(PTRACE_ATTACH, ...): Operation not allowed”,因为 strace 已经在 Android 中运行

    $ adb shell su -c ps | grep 跟踪 根 15861 1 1056 4 do_wait 00000452cc S

    一旦旧的正在运行的 strace 进程被杀死,新的调用可能会成功:

    $ adb shell su -c pkill strace

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 2016-03-28
      • 2013-10-13
      • 2017-06-21
      • 2014-04-02
      • 1970-01-01
      • 2012-01-03
      相关资源
      最近更新 更多