lldb+debugserver速查表


lldb+debugserver是iOS逆向的一个重要的工具,用于动态调试,包括寻找有用api、寻找有用信息等等,结合IDA构成iOS逆向的大半江山。以下是我的速查表。

一、准备阶段

  • iPhone端开启监听

    1
    2
    3
    debugserver 192.168.3.242:8888 -a "SpringBoard"

    debugserver -x backboard 192.168.3.242:8888 /Applications/AppStore.app/AppStore
  • lldb连接iPhone

    1
    process connect connect://192.168.3.235:8888
  • cycript连接

    1
    2
    3
    ps -e | grep /Applications(位置)查看当前可执行程序

    cycript -p 可执行程序

二、寻找思路

  • 列出当前镜像

    1
    image list -o -f
  • 列出调用栈信息

    1
    2
    3
    4
    5
    thread backtrace

    bt [all]

    sbt
  • 找到view对应的controller

    1
    2
    3
    4
    5
    6
    首先找到view界面的地址(easy),通过调用
    [#0x17f92890 nextResponder]找到controller的名字
    通过lldb po [controller名 _ivarDescription]和[controller名 _shortMethodDescription]
    看方法和属性
    对方法和属性所在内存下断点
    读取寄存器信息,获取寄存器存放的对象
  • 下断点(通过help br查看)

    1
    2
    3
    4
    5
    6
    7
    b function

    br s -a address

    br s -a ASLR+offset

    ......
  • 调试下一步

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    br l(断点列表)

    br dis 序号(不加为全)

    br en 序号

    br del 序号

    c(下一个断点)

    s 源码级别单步执行,遇到子函数则进入

    si 单步执行,遇到子函数则进入

    n 源码级别单步执行,遇到子函数不进入,直接步过

    ni 单步执行,遇到子函数不进入,直接步过

    finish/f 退出子函数

    br com add 序号
    (执行这条命令后,LLDB会要求我们设置一系列
    指令,以“DONE”结束,)
  • 寄存器

    1
    2
    3
    4
    5
    reg r -a/-A...

    register read -a/-A...

    register write 寄存器 值 (将寄存器赋值)reg w
  • 关于打印

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26

    po或p $寄存器 (打印寄存器的值)

    po [$寄存器 或类名 _shortMethodDescription]

    po [$寄存器 或类名 _ivarDescription]
    然后通过cycript进行调用,或者lldb本身可以调用:
    po [$寄存器 或类名 method]

    po [view subviews]

    po [view superviews]

    po [$r0(寄存器、地址) detailTextLabel]

    po [$r2 propertyForKey:@"set"]拿到setter方法

    po [$r2 propertyForKey:@"get"]拿到getter方法

    po[$r2 allTargets]拿到调用者,用于写在函数前面
    拿到了调用者也相当于拿到了类,可以用method或class-dump定位方法和属性,用ida定位方法,进入方法内部作进一步分析,结合lldb再做断点调试,看寄存器的method,看target和寄存器存放的形参。

    po [button allControlEvents]拿到部分形参

    [button actionsForTarget:#0x14609d00
    forControlEvent:64]

通过help ..查看详细

“函数的前4个参数存放在R0到R3中,其他参数
存放在栈中;返回值放在R0中。”

1
2
> debugserver -x backboard 192.168.3.183:8888 /var/containers/Bundle/Application/A910BD37-4684-49A6-97A7-924891F98D90/WYParking.app/WYParking
>
-------------本文结束感谢您的阅读-------------

本文标题:lldb+debugserver速查表

文章作者:ChengXiao

发布时间:2018年02月07日 - 11:02

最后更新:2018年03月01日 - 19:03

原始链接:http://chengxiao19961022.github.io/2018/02/07/lldb-debugserver速查表/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

你的鼓励是我前进的动力~