iOS 越狱开发那些事儿之五

来源:互联网 发布:php简历真实 编辑:程序博客网 时间:2024/04/29 12:45

LLDB + IDA 双剑合璧

参考书籍:《iOS应用逆向工程 分析与实战》(沙梓社,吴航)
参考书籍:《iOS应用逆向工程(第2版)》(沙梓社,吴航)

  1. 用debug server启动或附加进程

    debug server最常用的两种场景,就是启动和附加进程,命令也都很简单,分别是:

    A:debug server会启动executable,并开启port端口,等待LLDB接入:

    debugserver -x backboard IP:port /path/to/executable

    B:debug server会附加ProcessName,并开启port端口,等待LLDB接入:

    debugserver IP:port -a “ProgressName”

  2. 启动LLDB接入进程

    在终端输入:

    lldb

    (lldb)process connect connect://iOSIP:1234

  3. LLDB+IDA开始调试

    (1)image list

    用于列举当前进程中所有模块(image),使用命令如下:

    (lldb) image list -o -f

    第一列是序列号,第二列是模块在虚拟内存中的起始地址因LSAR产生随机偏移(简称ASLR偏移),第三列是模块的全路径,括号里是偏移之后的起始地址.

    偏移后模块基地址 = 偏移前模块基地址 + ASLR偏移

    在IDA中,

    偏移后符号基地址 = 偏移前符号基地址 + 符号所在模块的ASLR偏移

    偏移后指令基地址 = 偏移前指令基地址 + 指令所在模块的ASLR偏移

    要记住:偏移前基地址从IDA里看,ASLR偏移从LLDB里看,两者相加就是偏移后基地址.

    (2)breakpoint

    用于设置断点,一般用到的是:

    b function

    br s -a address

    以及

    br s -a ‘ASLRoffset+address’

    前者在函数起始位置设置断点,后两者在地址处设置断点

    例:
    1 用IDA查看偏移前基地址

    第一条指令”push…”的偏移前基地址是0x17730

    2 用LLDB查看ASLR

    ASLR偏移是0xb5000

    3设置并触发断点

    (lldb) br s -a ‘0x17730 + 0xb5000’

    程序停下来后用”c”命令继续运行

    禁用某个断点的命令: (lldb) br dis 6

    禁用所有断点命令: (lldb) br dis

    启用所有断点命令: (lldb) br en

    启用某个断点命令: (lldb) br en 6

    删除所有断点命令: (lldb) br del

    删除某个断点命令: (lldb) br del 6

    另一个常用命令,是指定在某个断点得以触发的时候,执行预先设置的指令:

    (lldb) br com add 1

    执行这条命令后,LLDB会要求我们设置一系列指令,以”DONE”结束

    po [$r0 class]

    p (char *)$r1

    c

    DONE

    (4)next与stepi

    用于执行下一条机器指令,区别是前者不进入函数体,后者进入函数体,简写ni ,si

    (5)register write

    用于给指定寄存器赋值,(lldb) register write r0 1

0 0