lldb 大家应该很熟悉,已经被苹果集成到xcode开发工具中,我们平时写程序的时候,调试程序经常会打断点,程序运行到断点的地方会自动停下来,然后在控制台中就可以使用lldb 的命令来进行调试。
但是lldb是运行在osx 中的,要想调试iOS程序,还需要另一个工具,那就是lldb。
debug 运行在iOS中,顾名思义,它作为服务端,实际执行lldb 传过来的命令,再把执行结果反馈给lldb,显示给用户,即所谓的远程调试。在默认情况下,iOS 上并没有安装debugserver ,只有连接过一次xcode ,并在Windows->device菜单栏下添加此设备,debugserver 才会被xcode安装到iOS的/developer/usr/bin 目录下。
但是缺少task_for_pid 权限,通过xcode安装的debugserver 只能调试我们自己的app---调试自己的app是正向开发的事。要想动态的调试别人的app ,发挥他们在逆向工程中的真正威力。
首先配置debug server
① 从你的iPhone中将debug server 拷贝到做面上
$
scp [email protected]:/Developer/usr/bin/debugserver ~/Desktop/
②帮debug server 减肥
lipo -thin arm64 ~/Desktop/debugserver -output ~/Desktop/debugserver
注意,我的手机的cpu 是arm64 架构的,将这个arm64换成你对应的机型
③给debug server 添加task_for_pid 权限
codesign -s - --entitlements /Users/uusafe/Desktop/tools/iOSReverse/ent.plist -f ~/Desktop/debugserver
④将经过处理的debug server 拷贝到iOS中并添加执行权限
scp ~/Desktop/debugserver [email protected]:/usr/bin/
以上都是在OSX中进行的拷贝iPhone中后,给debugserver添加执行权限
Administratorde-iPhone:/Developer/usr/bin root# chmod a+x /usr/bin/debugserver
这样debug server 就制作完成了
然后就怎么用了
用debug server 启动或附加加进程
我们可以看看我们手机现在运行着什么程序
Administratorde-iPhone:~ root# ps -e |grep /Applications
413 ?? 0:42.37 /Applications/MobileMail.app/MobileMail
502 ?? 0:00.85 /private/var/db/stash/_.C6Hvhq/Applications/MobileSafari.app/webbookmarksd
618 ?? 0:39.52 /Applications/Preferences.app/Preferences
780 ?? 0:14.50 /Applications/Cydia.app/Cydia
1261 ?? 0:01.86 /private/var/db/stash/_.C6Hvhq/Applications/MobileCal.app/PlugIns/CalendarWidget.appex/CalendarWidget
1263 ?? 0:14.51 /private/var/db/stash/_.C6Hvhq/Applications/Stocks.app/PlugIns/StocksWidget.appex/StocksWidget
5936 ?? 0:13.82 /Applications/AppStore.app/AppStore
17841 ?? 0:01.26 /Applications/MobileSafari.app/MobileSafari
19191 ?? 0:01.30 /Applications/MobileSMS.app/MobileSMS
19204 ttys002 0:00.01 grep /Applications
比如我们要调试mobileSMS在iPhone端:
Administratorde-iPhone:~ root# /usr/bin/debugserver *:1234 -a "MobileSMS"
debugserver-@(#)PROGRAM:debugserver PROJECT:debugserver-320.2.89
for arm64.
Attaching to process MobileSMS...
Listening to port1234 for a connection from *...
Waiting for debugger instructions for process 0.
然后另起终端,在OSX端:
$ lldb
(lldb) process connect connect://192.168.213.6:1234
Process 19159 stopped
* thread #1: tid = 0x11bf5c, 0x0000000198998e0c libsystem_kernel.dylib`mach_msg_trap + 8, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
frame #0: 0x0000000198998e0c libsystem_kernel.dylib`mach_msg_trap + 8
libsystem_kernel.dylib`mach_msg_trap:
-> 0x198998e0c <+8>: ret
libsystem_kernel.dylib`mach_msg_overwrite_trap:
0x198998e10 <+0>: movn x16, #0x1f
0x198998e14 <+4>: svc #0x80
0x198998e18 <+8>: ret
(lldb) image list -o -f
image list 用于列举当前进程中的所有模块(image)。
模块的序号 偏移量
[ 0] 0x0000000000014000
模块全路径 偏移后模块基地址/private/var/db/stash/_.C6Hvhq/Applications/MobileSMS.app/MobileSMS(0x0000000100014000)
然后使lldb 来进行调试
在终端输入
(lldb) image list -o -f
得到如下图
在ida 中打开如下
然后计算偏移后地址
0000000100013898 + 0x0000000000040000 = 10053898
(lldb) br s -a 0x10053898
Breakpoint 1: address = 0x0000000010053898
这时再按下home键 是没反应的
更多关于lldb 的用法以后再介绍
新手一枚,参考 《iOS应用逆向工程》