返回介绍

10.4 run-as 命令的作用

发布于 2024-10-10 22:32:17 字数 1236 浏览 0 评论 0 收藏 0

现在知道了 run-as 命令能够在非 root 设备上查看 debug 模式的应用沙盒数据,其实它还有一个重要作用,就是为 Android 中的调试做基础。上面在分析 zygote 源码的时候提到了 Java 中的调试系统 jdb,其实 Android 中的调试系统是 gdb,通过 gdb 和 gdbserver 来调试 App。具体来说,就是 gdbserver 通过 ptrace 附加到目标 App 进程去,然后 gdb 再通过 socket 或者 pipe 来链接 gdbserver,并且向它发出命令来对 App 进程进行调试。需要注意以下关键点:

·每一个需要调试的 apk 在打包的时候都会带上一个 gdbserver,因为手机上面不带有 gdbserver 工具。gdbserver 用来通过 ptrace 附加到要调度的 App 进程去。

·要注意 ptrace 的调用。一般来说,只有 root 权限的进程可以调用。例如,如果我们想通过 ptrace 向目标进程注入一个 so,那么就需要在 root 过的手机上向 su 申请 root 权限。但是,这不是绝对的。如果一个进程与目标进程的 uid 是相同的,那么该进程就具有调用 ptrace 的权限。gdbserver 在调试一个 App 之前,首先要通过 ptrace_attach 来附加到该 App 进程去。ptrace_attach 在执行实际操作之后,会调用__ptrace_may_access 来检查调用进程的权限,如果调用进程与目标进程具有相同的 uid 和 gid,那么权限检查通过。否则的话,就要求调用者进程具有执行 ptrace 的能力,这是通过另外一个函数 ptrace_has_cap 来检查的。如果调用进程的 uid 是 root,那么 ptrace_has_cap 一定会检查通过。当然,通过了上述两个权限检查之后,还要接受内核安全模块的检查,这就不是通过 uid 或者 capability 这一套机制来控制的了。

·如何让 gdbserver 进程的 uid 与要调试的 App 进程的 uid 一样?因为在没有 root 过的手机上要想获得 root 权限是不可能的,因此只能选择以目标进程相同的 uid 运行这个方法。这时可以使用 run-as 工具。

到这里知道了,在 Android 中要调试一个程序,首先这个程序必须是 debug 模式的,也就是在 AndroidManifest.xml 中设置的属性,所以以往在使用动态方式破解 apk 的时候,首先是反编译,然后修改 XML 中的 debug 属性,然后才能进行代码关联调试,而且动态调试 so 的强大工具 IDA 也是利用附加到目标进程中才进行调试的,原理和这里的 gdb 一样。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文