iOS逆向开发-终端工具命令使用汇总(二)-LLDB命令

490 阅读3分钟

iOS逆向开发-终端工具命令使用汇总(一)

导语:使用lldb动态调试已经安装在手机上的App无法向自己做的项目那样在西xcode里随心所欲的调试,记录一些调试的用法,可以帮助我们动态调试没有源码安装到手机的项目。

调试breakpoint

  • 可以使用help获取具体的用法

    • Help breakpoint
    • Help breakpoint set
  • 给函数设置断点

    • breakpoint set -n 函数名
      • breakpoint set -n test
      • breakpoint set -n touchesBegan:withEvent:
      • breakpoint set -n "-[ViewController touchesBegan:withEvent:]"
    • breakpoint set -a 函数地址
    • breakpoint set -r 正则表达式
    • breakpoint set -s 动态库 -n 函数名
  • breakpoint list : 列出断点(包括断点编号)

  • breakpoint disable 断点编号 :禁用断点

  • breakpoint enable 断点编号 :启用断点

  • breakpoint delete 断点编号 :删除断点

  • breakpoint command

    • breakpoint command add 断点编号

      给断点提前设置一些可执行的代码或命令,到了触发断点时,会按顺序执行

    • breakpoint command list 断点编号

      查看某个断点已设置的代码或命令

    • breakpoint command delete 断点编号

      删除断点设置的代码或者命令

调试express,call,print,p,po

  1. 其实express,call,print,p作用差不多,可以直接使用p

  2. express -O -- XXXpo一样,类似于NSLog打印

    所以会使用 p、po就好了

(lldb) p array
(__NSArrayI *) $0 = 0x0000600000c86820 @"3 elements"

(lldb) po array  //打印更详细
<__NSArrayI 0x600000c86820>(
dfas,
dfdaf,
dfadf
)

函数调用栈

命令 thread backtrace 简写 bt

命令 thread return ,过掉当前方法后面的操作,直接结束当前方法

命令 frame variable,打印当前栈帧的变量

命令 thread continuecontinue 程序继续运行,简写 c

命令 thread step-over next 单步运行,遇到函数调用也一步跳过,简写n

命令 thread step-instep单步运行,遇到函数调用进入函数,简写s

命令 thread step-out finish 直接执行完当前所有代码,返回上一个函数

  • si(stepi)、ni(nexti) 与 s、n 类似

s、n 是源码级别调试命令

si、ni 是调试汇编用的命令

内存断点

  • 在内存数据发生变化的时候触发的

    • watchpoint set variable

      • watchpoint set variable self->age
    • watchpoint set expression 地址

      • watchpoint set expression &(self->_age)
  • watchpoint list

  • watchpoint disable 断点编号

  • watchpoint enable 断点编号

  • watchpoint delete 断点编号

  • watchpoint command add 断点编号

  • watchpoint command list 断点编号

  • watchpoint command delete 断点编号

模块(镜像)查找

  • 系统的动态库,App的可执行文件都是模块

  • image lookup

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

      • image lookup -t NSArray
    • image lookup -a 地址 :根据内存地址查找在某个模块的位置

    • image lookup -n 符号或者函数名:查找某个符号或者函数的位置

  • image list:列出所加载模块信息

  • Image list -o -f:打印出模块的偏移地址、全路径

内存操作

  • register read 寄存器 :读取寄存器的值

  • register write 寄存器 值 :修改寄存器的值

  • 读取对应内存地址的值

    • x/数量、格式、字节大小 内存地址

      x/4xg 0x00001001 :表示根据地址读取4段内存数据,数据是16进制的,每段数据8个字节

      x 0x00001001 :一个字节一个字节读取内存数据

    • 格式

      x 16进制

      f 浮点

      d 10进制

    • 字节大小

      b 1字节

      h 2字节

      w 4字节

      g 8字节

  • memory write 内存地址 数值 :修改内存中的值

小技巧

  • Enter键,会自动执行上次的命令
  • 尽量使用命令缩写