iOS逆向, 基础工具之LLDB和debugserver

相信大家对LLDB都不陌生, 平时在开发中会多少用到, 没用过也肯定见过~

而debugserver就是服务端, 实际执行LLDB传来的命令, iOS默认没有安装, 设备连接过一次xcode, 并在devices中添加此设备后, debugserver会被安装到iOS的/Developer/usr/bin目录下

因为缺少task_for_pid权限, 通过xocdedebugserver只能调试自己的app

配置debugserver

从iOS拷贝下来debugserver

$scp root@192.168.6.52:/Developer/usr/bin/debugserver ~/CommonFiles/ReverseEngineering 
root@192.168.6.52's password: 

然后帮它减肥

$lipo -thin armv7s debugserver -output ./debugserver

注意armv7s, 换成所使用设备对应的ARM

给debugserver添加task_for_pid权限

创建一个ent.xml文件

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>com.apple.springboard.debugapplications</key>
        <true/>
        <key>get-task-allow</key>
        <true/>
        <key>task_for_pid-allow</key>
        <true/>
        <key>run-unsigned-code</key>
        <true/>
</dict>
</plist>

先安装依赖ldid

$brew install ldid

然后执行

$ ldid -Sent.xml debugserver 
最后把经过处理的debugserver拷贝回iOS
$scp debugserver root@192.168.6.52:/usr/bin/debugserver
root@192.168.6.52's password: 

原版debugserver不可写, 无法覆盖

而且加入到/usr/bin下, 无需输入路径就可以执行

启动debugserver或附加进程

启动命令

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

启动并附加进程

debugserver IP:port -a "ProcessName"

实例

$debugserver -x backboard *:1234 /Applications/iBooks.app/iBooks     
debugserver-@(#)PROGRAM:debugserver  PROJECT:debugserver-360.0.26.3
 for armv7.
Listening to port 1234 for a connection from *...

手机也会跟随启动相应的APP
附加进程

$debugserver *:1234 -a "SpringBoard"
debugserver-@(#)PROGRAM:debugserver  PROJECT:debugserver-360.0.26.3
 for armv7.
Attaching to process SpringBoard...
Listening to port 1234 for a connection from *..

然后再Mac上客户端连接

$lldb
(lldb) process connect connect://192.168.6.52:1234

耐心等待连接成功即可!

Process 2440 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
    frame #0: 0x1c754900 libsystem_kernel.dylib`mach_msg_trap + 20
libsystem_kernel.dylib`mach_msg_trap:
->  0x1c754900 <+20>: pop    {r4, r5, r6, r8}
    0x1c754904 <+24>: bx     lr

libsystem_kernel.dylib`mach_msg_overwrite_trap:
    0x1c754908 <+0>:  mov    r12, sp
    0x1c75490c <+4>:  push   {r4, r5, r6, r8}
Target 0: (SpringBoard) stopped.
(lldb)  

输入c让程序继续执行

(lldb) c
Process 2440 resuming
利用LLDB断点进行类HOOK的操作

下面简单介绍下ASLR偏移和断点功能, 实现类似HOOK的功能, 其它具体的LLDB功能, 本文不做赘述, 这里主要是介绍工具和如何配置. 以后整理后可能会专门写一篇关于LLDB的文章.
首先进行image list列出所有的image的信息, 这一步主要是确定ASLR偏移了多少

(lldb) image list -o -f
[  0] 0x0002c000 /System/Library/CoreServices/SpringBoard.app/SpringBoard(0x0000000000030000)
[  1] 0x00963000 /Users/wangyu/Library/Developer/Xcode/iOS DeviceSupport/10.3.3 (14G60)/Symbols/usr/lib/dyld
[  2] 0x00888000 /Library/MobileSubstrate/MobileSubstrate.dylib(0x0000000000888000)
[  3] 0x0218c000 /Users/wangyu/Library/Developer/Xcode/iOS DeviceSupport/10.3.3 (14G60)/Symbols/System/Library/PrivateFrameworks/StoreServices.framework/StoreServices

第一个地址就是偏移量, 记住这个地址0x0002c000

然后把对应的执行文件, 我这里就是用的SpringBoard, 在本地拖入IDA进行分析, 分析完成后, 选择一个你感兴趣的函数

-[SBDashBoardViewController noteMenuButtonDown] __text  0019B9F0    0000001E            R   .   .   .   .   T   .

这是home键按下的函数, 其地址在IDA中静态地址显示为0x0019B9F0

我们需要断点 = 静态基地址 + 偏移量

0x1C79F0 = 0x0019B9F0 + 0x0002c000

现在将这个地址加入断点

(lldb) br s -a 0x1C79F0
Breakpoint 1: where = SpringBoard`_mh_execute_header + 1643184, address = 0x001c79f0 address = 0x0019b9f0

之后我们在手机上进行按下home键的操作.

Breakpoint 2: where = SpringBoard`_mh_execute_header + 1643184, address = 0x001c79f0
Process 2440 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1
    frame #0: 0x001c79f0 SpringBoard`_mh_execute_header + 1669616
SpringBoard`_mh_execute_header:
->  0x1c79f0 <+1669616>: .long  0x01f8f647                ; unknown opcode
    0x1c79f4 <+1669620>: smulbteq r3, r0, r2
    0x1c79f8 <+1669624>: .long  0xf2434479                ; unknown opcode
    0x1c79fc <+1669628>: vrshr.s64 q10, q7, #0x40
Target 0: (SpringBoard) stopped.
(lldb)  

程序成功的停住了, 现在我们可以跟踪一些基本信息, 甚至动态调试, 输入c让程序继续执行

(lldb) p (char *)$r1
(char *) $0 = 0x005d0ddb "noteMenuButtonDown"
(lldb) c
Process 2440 resuming

详细关于LLDB打印信息, 动态调试, 或者断点前执行脚本的内容, 大家可以自行查阅, 有很多其它资料可供参考.

输入exit, 会提示LLDB会杀了这个进程, 是否愿意, 愿意输入y就退出了.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容