7逆向 - 动态调试

 

概念

→ 把程序运行起来,通过打断点、打印等方式,查看参数、返回值、函数的调用流程

→ 可以进入函数,一步一步的看看函数的调用是什么样的

→ 逆向的过程中也经常要这么干..

→ 比如,我们已经知道抢红包的方法是哪个方法了,那最好可以在那个方法里打一个断点,调试下参数、函数之间的调用关系等

调试原理

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添加权限安装到手机上
  1. debugserver拿到mac上
  2. ldid -e debugserver debugderver.entitlements 导出权限文件,查看他的权限
    1. 默认权限
  3. 需要签的权限 get-task-allow task_for_pid-allow
  4. 重新签名 ldid -Sdebugserver.entitlements debugserver
  5. 把debugserver重新安装回手机
    1. 问题:developer/usr/bin这个目录无法放入,没权限
    2. 解决:放入usr/bin目录中
    3. 好处:之后可以直接通过debugserver命令启动它
  6. 给debugserver附加权限chmod 777 debugserver
让debugserve附加到某个App进程
  1. debugserver *(代表主机地址): 端口号(手机的端口号) -a 进程名称或ID
    1. 写端口号的原因:需要和LLDB进行交互的
    2. debugserver *:25777 -a WeChat

LLDB连接Debugserver

  1. 启动lldb:lldb
  2. process connect connect://IP地址:端口(25777)
    1. 我们之前使用了usbmuxd进行端口转发,以通过usb连接手机,此处依然可以。
    2. tcprelay.pt -t 手机端口号:电脑的端口号
      1. 此处监听成功
      2. 一旦连接成功,相当于下断点了,手机端无反应 - 其实更准确的说,一旦手机端启动debugserver,就开始无反应了。

LLDB调试指令

指令作用示例备注
c跳过断点(resume)c
nstep over

sstep into

finishstep 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