7逆向 - 动态调试
Sat, May 12, 2018
概念
→ 把程序运行起来,通过打断点、打印等方式,查看参数、返回值、函数的调用流程
→ 可以进入函数,一步一步的看看函数的调用是什么样的
→ 逆向的过程中也经常要这么干..
→ 比如,我们已经知道抢红包的方法是哪个方法了,那最好可以在那个方法里打一个断点,调试下参数、函数之间的调用关系等
调试原理
Xcode的调试器:LLDB
全称:low level debuger
为什么Xcode可以调试手机上run的程序呢?
原因:手机上有一个debugserver
LLDB传送指令给debugserver
如:po self → 这些指令是运行在手机上的
debugserver接收到指令,传给App,App将结果回传给debugserver
LLDB如何传输指令给debugserver呢?通过手机线呀...
相关概念
编译器
GCC (GNU这个组织开发的)
LLVM (基于GCC升级的)
目前(5.0以后),苹果用的LLVM9.0编译器,是自己的。
很久很久以前,用的是GCC(4.1左右)
动态调试器
GDB (GNU这个组织开发的)
LLDB (基于GDB升级的)
找找Debugserver
一开始在Xcode中,手机第一次连接Xcode,会被自动安装这个文件
Xcode LLDB的局限性
只能调试直接通过Xcode Run起来的App
动态调试任意App
原理:在终端启动LLDB,建立终端和debugserver的连接
步骤
debugserver连接App
> Xcode默认已经做好这两步连接了
> 之前Xcode安装的DebugServer,权限不足,不能调试非Xcode安装的App
> 需要重新签debugserver的权限
Debugserver在手机上的路径:Device/Developer/usr/bin
做法
debugserve添加权限安装到手机上
- debugserver拿到mac上
- ldid -e debugserver debugderver.entitlements 导出权限文件,查看他的权限
- 默认权限
- 需要签的权限 get-task-allow task_for_pid-allow
- 重新签名 ldid -Sdebugserver.entitlements debugserver
- 把debugserver重新安装回手机
- 问题:developer/usr/bin这个目录无法放入,没权限
- 解决:放入usr/bin目录中
- 好处:之后可以直接通过debugserver命令启动它
- 给debugserver附加权限chmod 777 debugserver
让debugserve附加到某个App进程
- debugserver *(代表主机地址): 端口号(手机的端口号) -a 进程名称或ID
- 写端口号的原因:需要和LLDB进行交互的
- debugserver *:25777 -a WeChat
LLDB连接Debugserver
- 启动lldb:lldb
- process connect connect://IP地址:端口(25777)
- 我们之前使用了usbmuxd进行端口转发,以通过usb连接手机,此处依然可以。
- tcprelay.pt -t 手机端口号:电脑的端口号
- 此处监听成功
- 一旦连接成功,相当于下断点了,手机端无反应 - 其实更准确的说,一旦手机端启动debugserver,就开始无反应了。
- 此处监听成功
LLDB调试指令
指令 | 作用 | 示例 | 备注 |
---|---|---|---|
c | 跳过断点(resume) | c | |
n | step over | ||
s | step into | ||
finish | step out | ||
help | 查看指令用法 | help breakpoint | |
breakpoint set | 下断点 | ||
breakpoint set -a 函数地址 | |||
breakpoint set -n 函数名 | breakpoint set -n "-[ViewController touchesBegan:withEvent:]" | ||
breakpoint list | 列出所有断点 | ||
breakpoint disable/enable/delete 断点编号 | 禁用/启用/删除断点 | ||
image list | 列举当前进程中的所有模块(链接的库吧应该是...) | image list -o -f |