iOS逆向-动态调试(LLDB)任意App

请注意,本文编写于 382 天前,最后修改于 191 天前,其中某些信息可能已经过时。

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

Xcode动态调试的原理

Xcode中内置LLDB调试器,通过与iPhone连接,在iPhone安装debugserver的程序,debugserver与LLDB互相通信,发送调试指令和接收结果,debugserver与App之间互相通信,发送指令和接受结果。

动态调试任意App

由于/Developer/usr/bin/是只读的,不能随意调试App。我们需要自己创建一个debugserver的可执行文件,并且赋予其相应的权限。如果希望调试App,则需要对debugserver签上get-task-allowtask_for_pid-allow两个权限。

  • 通过ldid导出手机中debugserver的权限 (ldid -e debugserver > debugserver.entitltments
    debugserver权限
    debugserver权限
  • 签上权限并且为debugserver重新添加权限(ldid -Sdebugserver.entitlements debugserver
    签上权限
    签上权限
  • 将debugserver放到手机的/usr/bin目录并且附上可执行权限(chmod +x debugserver

移动debugserver到手机
移动debugserver到手机

  • 端口转发
    通过接口转发的方式将mac的10011端口映射到iphone的10011端口。
  • 将debugserver附加到某个app上(debugserver *:10011 -a WeChat
    使用ssh连接iPhone,将debugserver附加到某个app上。由于使用的USB接口转发的方式,所以主机地址直接填*,这里是将debugserver附加到微信上WeChat是进程名称,也可以写进程编号。

将debugserver附加到某个app上
将debugserver附加到某个app上

  • 在mac的lldb环境下使用progress命令连接手机的debugserver

连接手机
连接手机

  • 使用lldb命令进行调试

常用LLDB命令

  • 格式
    <command> [<subcommand> [<subcommand>...]] <action> [-options [optionvalue]] [argument [argument...]]
  • help
    可以使用help查看执行的用法
  • expression
    执行表达式 print、p、call也可以执行表达式,效果一样
  • thread breaktrace || bt 调用栈
  • thread return 返回
  • from variable 查看栈帧中的所有变量
  • 流程控制 源码级别 针对自己写的源代码
    thread continue 程序继续执行 简写:continue 、c

thread step-over单步运行 把子函数当做一个整体一步执行 简写:next、 n
thread step-in 单步运行 遇到子函数进入子函数 简写:step、s
thread step-out 直接执行完当前函数的所有代码,返回至上一个函数 简写:finish

  • 指令级别 汇编指令
    thread step-over next 跳过函数调用 简写:ni

thread step-inst stepi 进入函数调用 简写:si

  • 代码断点
    breakpoint set -n 函数名

breakpoint set -n "-[类名 函数名]"
breakpoint set -r 正则表达式
breakpoint set -s dylib -n 函数名
breakpoint list 断点列表
breakpoint diaable 禁用 enable 启用 delete 删除 后面加断点编号

  • 断点命令
    breakpoint command add 断点编号 给断点添加一些命令

breakpoint command list 断点序号 命令列表
breakpoint command delete 断点序号 删除命令

  • 内存断点
    watchpoint set variable 变量self->age

watchpoint set expression 内存地址
list disable enable delete command

  • 模块查找
    image lookup -t 查找某个类型的信息

image lookup -a 查看内存地址对应的模块的哪一行
image lookup -n 加函数名或者符号就会找到该模块的位置

笔记来自 www.520it.com 小码哥iOS逆向

Comments

添加新评论