- 对本书的赞誉
- 前言
- 基础篇
- 第 1 章 Android 中锁屏密码加密算法分析
- 第 2 章 Android 中 NDK 开发
- 第 3 章 Android 中开发与逆向常用命令总结
- 第 4 章 so 文件格式解析
- 第 5 章 AndroidManifest.xml 文件格式解析
- 第 6 章 resource.arsc 文件格式解析
- 第 7 章 dex 文件格式解析
- 防护篇
- 第 8 章 Android 应用安全防护的基本策略
- 第 9 章 Android 中常用权限分析
- 第 10 章 Android 中的 run-as 命令
- 第 11 章 Android 中的 allowBackup 属性
- 第 12 章 Android 中的签名机制
- 第 13 章 Android 应用加固原理
- 第 14 章 Android 中的 so 加固原理
- 工具篇
- 第 15 章 Android 逆向分析基础
- 第 16 章 反编译神器 apktool 和 Jadx
- 第 17 章 Hook 神器 Xposed
- 第 18 章 脱壳神器 ZjDroid
- 第 19 章 Native 层 Hook 神器 Cydia Substrate
- 操作篇
- 第 20 章 静态方式逆向应用
- 第 21 章 动态调试 smali 源码
- 第 22 章 IDA 工具调试 so 源码
- 第 23 章 逆向加固应用
- 第 24 章 逆向应用经典案例分析
- 第 25 章 Android 中常见漏洞分析
- 第 26 章 文件加密病毒 Wannacry 样本分析
10.4 run-as 命令的作用
现在知道了 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论