使用lldb 和debugsever 调试程序

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 中打开如下

使用lldb 和debugsever 调试程序_第1张图片

然后计算偏移后地址

0000000100013898 + 0x0000000000040000 = 10053898


(lldb) br s -a 0x10053898

Breakpoint 1: address = 0x0000000010053898


这时再按下home键 是没反应的

更多关于lldb 的用法以后再介绍

新手一枚,参考 《iOS应用逆向工程》


你可能感兴趣的:(iOS应用逆向工程)