一步一步用debugserver + lldb代替gdb进行动态调试

/Symbols/usr/lib/libobjc.A.dylib 用 dyld_decache 导出的armv7s中libobjc.A.dylib
我IDA 导入 搜索到
EXPORT _objc_msgSend
_objc_msgSend _objc_msgSend ; CODE XREF: _redacted__53+56p
_objc_msgSend ; _redacted__54+3Ep …
_objc_msgSend CBZ R0, loc_2F122F7E
_objc_msgSend+2 LDR.W R9, [R0]
_objc_msgSend+6 LDRH.W R12, [R9,#0xC]
_objc_msgSend+A LDR.W R9, [R9,#8]
_objc_msgSend+E AND.W R12, R12, R1
_objc_msgSend+12 ADD.W R9, R9, R12,LSL#3
_objc_msgSend+16 LDR.W R12, [R9]

跟我正在调试代码不同???怎么回事?

代码不同是因为地址搞错了吧

大神,怎么计算 从 SpringBoard 到 libobjc.A.dylib 的地址~~~~
Process 3471 stopped

  • thread #1: tid = 0x181ac, 0x00000001003aa938 SpringBoard, queue = ‘com.apple.main-thread’, stop reason = instruction step into
    frame #0: 0x00000001003aa938 SpringBoard
    → 0x1003aa938: br x16
    0x1003aa93c: nop
    0x1003aa940: ldr x16, #985784 ; (void *)0x0000000196e9bce0: objc_msgSendSuper2
    0x1003aa944: br x16

(lldb) dis
libobjc.A.dylib`objc_msgSend:
→ 0x196e9bbc0: cmp x0, #0
0x196e9bbc4: b.le 0x196e9bc30 ; objc_msgSend + 112
0x196e9bbc8: ldr x13, [x0]
0x196e9bbcc: and x9, x13, #0x1fffffff8
0x196e9bbd0: ldp x10, x11, [x9, #16]
0x196e9bbd4: and w12, w1, w11
0x196e9bbd8: add x12, x10, x12, lsl #4
image list -o -f

你现在到了libobjc.A.dylib里
用0x196e9bbc0 - libobjc.A.dylib的ASLR偏移,得出的结果就是它在IDA里的地址

那么问题来了。
0x196e9bbc0 - 0x0000000004ac4000 为什么算出的地址在IDA 没有查到呢?
IDA 显示 Command “JumpAsk” failed
主要是我搜索二进制都搜不到结果~~~
IDA 中直接搜索libobjc.A.dylib 的_objc_msgSend函数
EXPORT _objc_msgSend 得到的跟正在调试的代码不同
我怀疑,我用dyld_decache 导出的dylib跟正在调试的dylib不同
大神,你怎么看?

不可能吧,你的cache文件是从本机拷出来的吗?

IOS 设备是5S IOS 8.12
cache 用ITOOLS 下载下来的 然后 dyld_decache导出,有两个 一个是armv7s 一个是arm64
arm64 导出的全是指针
armv7s 导出中 有libobjc.A.dylib
操作全是按照书上操作的~~
但是最后搜不到指定函数

问题就出在这里:5s是arm64,而dyld_decache不兼容arm64,所以你用IDA和lldb分析的不是同一个lib

2 个赞

我dyld_decache 导出的是 armv7s的 ,不是 arm64的 ,
问题解决了,发现用 dyld_decache 导出的armv7s 的dylib 不是正在调试的dylib
最后 我直接复制 本机的dylib 发现是同一个dylib~~~~

[121] 0x0000000005564000 /Users/panda/Library/Developer/Xcode/iOS DeviceSupport/8.1.2 (12B440)/Symbols/usr/lib/libobjc.A.dylib

(lldb) dis

libobjc.A.dylib`objc_msgSend:

→ 0x19793bbc0: cmp x0, #0

0x19793bbc4: b.le 0x19793bc30 ; objc_msgSend + 112

0x19793bbc8: ldr x13, [x0]

0x19793bbcc: and x9, x13, #0x1fffffff8

0x19793bbd0: ldp x10, x11, [x9, #16]

0x19793bbd4: and w12, w1, w11

0x19793bbc0-0x0000000005564000 = 00000001923D7BC0 这里是IDA 的地址
感觉自己搞的好麻烦,明明可以直接从本机导出dylib的,却要用dyld_decache去导出
那么问题来了,dyld_decache 到底什么时候才用啊???

当你在本机找不到lldb中调试的二进制文件时,那个文件就在cache里,需要decache

原来如此!!!感谢大神解惑!
最后再来一发问题:
在Cycript 脚本语言中 的例子
[objc_getClass(“CNFRegController”) controllerForServiceType:1] 获取掌管iMessage 账号的CNFRegController 实例,
那么我在Xcode 的文档中没有查到 CNFRegController 是什么 也没有查到 controllerForServiceType 方法
想问问这些函数在哪里查到的,是在官网吗,还是另外下载 AIP 文档???

你买书了吗?

是啊!!! 都要出新版了,我买了正版的旧版
widnows 转IOS 啥都不懂~~~~
5555555
按照书上写的~~~刚看到 Cycript 那里写脚本

那你应该了解私有和公开的区别,逆向工程的主要用途之一就是研究非公开API

好吧~~~发现可能问题出在没有看完书~_~

多谢分享,可是卡死了
xiaominde-iPad:~ root# debugserver *:1234 -a “SpringBoard”
debugserver-300.2 for armv7.
Attaching to process SpringBoard…
Spawning general listening thread.
Spawning kqueue listening thread.
Listening to port 1234 for a connection from *…

接下来就什么都没输出了,然后设备也卡主不能动了要重启

这个时候debugserver已经附加了SpringBoard,它在等你的LLDB连过去之后操作,进程本来就是处在卡死状态

:titter:多谢狗神威武

xiaomindeiMac:~ xiaomin$ process connect connect://iOSIP:1234
-bash: process: command not found
提示这个怎么解决

已经解决看教程不认真没有进入lldb