首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
iOS安全
发新帖
6
2
[原创]XCode调试越狱iOS上任意App和系统进程/查看界面元素
发表于: 2023-7-15 13:39
13510
[原创]XCode调试越狱iOS上任意App和系统进程/查看界面元素
lichaolich
2023-7-15 13:39
13510
## 背景 近一年没发过帖子了,近几年一直在iOS系统深耕,现在分享一个我去年的研究成果,项目地址[<mark class="encrypted">066K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6D9K9h3y4Z5y4q4)9J5c8X3c8W2j5Y4g2Y4M7$3g2J5N6X3g2J5i4K6g2X3j5i4A6B7i4K6g2p5i4@1f1K6i4K6R3H3i4K6R3J5</mark> 此项目为增强越狱环境下iOS上的调试器功能。主要为以下几点: 1. 使XCode支持调试任意第三方签名的App或者进程,包括系统进程 2. 使XCode支持查看任意App界面布局 笔者主要用的调试方式仍然是命令行远程调试,而图形化调试在某些情况下方便一些,如果开发了某些Tweak想要调试,使用XCode附加调试也能起到很好的效果 ## 分析 笔者环境: XCode11.x + iOS12.x 先从XCode入手研究XCode怎么实现调试的,可以看到设备在首次连接到Mac上时,会挂一个/Developer分区进去,debugserver就在其中,此debugserver用于XCode调试有自己开发着签名的App。而挂载的dmg其实在/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/12.5/DeveloperDiskImage.dmg 而Cydia源里其实也提供debugserver,此debugserver可以用于命令行远程调试任意进程,实际上是加了root权限和额外的entitlemet。XCode控制debugserver是通过lockdownd来通信的,此系统进程提供了USB相关的各种功能,例如XCode安装调试,还有爱思助手的各种功能,都要走lockdownd(如果想改爱思助手显示的设备参数其实也是从这里改)。 经过调试可以定位关键系统API为SMJobSubmit ``` { EnvironmentVariables = { "LOCKDOWN_MACH_SERVICE" = "lockdown.2144085414520.com.apple.debugserver"; }; KeepAlive = 0; Label = "lockdown.2144085414520.com.apple.debugserver"; LaunchOnlyOnce = 1; MachServices = { "lockdown.2144085414520.com.apple.debugserver" = 1; }; POSIXSpawnType = Interactive; ProgramArguments = ( "/Developer/usr/bin/debugserver", "--lockdown", "--launch=frontboard" ); RunAtLoad = 0; UserName = mobile; } ``` 可以发现XCode使用了/Developer/usr/bin/debugserver。但由于debugserver缺少root权限以及entitlemet导致无法附加到系统进程,因此XCode正常情况无法调试系统进程和第三方App(MonkeyDev之类重打包不算)。那么直接换成Cydia源里的debugserver是否可行呢,经过笔者测试,那个debugserver也是无法使用的,因为苹果原生debugserver是支持--lockdown参数的,而Cydia源的却不支持,因此必须自行改版debugserver。这一步其实很简单,将Cydia源里的debugserver的entitlement,ldid签名到Developer的debugserver即可。 下一步,想办法让lockdownd使用我们改版debugserver,最直接的想法是做个dmg,让lockdown挂上去,然而经过逆向和测试发现DeviceSupport下的有DeveloperDiskImage.dmg和DeveloperDiskImage.dmg.signature,后者用于文件校验,且用到RSA加密了,无解。因此笔者考虑使用tweak来改lockdownd ## 编码 替换ProgramArguments中的debugserver为我们定制的debugserver即可 ```Objective-C #include <dlfcn.h> #include <time.h> #import <Foundation/Foundation.h> static void nouse(){} static void* _SMJobSubmit = (void*)nouse; static void* _CFPropertyListCreateData = (void*)nouse; static int last_inst_time = 0; %hookf(CFDataRef, _CFPropertyListCreateData, CFAllocatorRef allocator, CFPropertyListRef propertyList, CFPropertyListFormat format, CFOptionFlags options, CFErrorRef* error) { if (CFGetTypeID(propertyList) == CFDictionaryGetTypeID()) { NSDictionary* info = (__bridge NSDictionary*)propertyList; if (info[@"Service"] != nil && [info[@"Service"] isEqualToString:@"com.apple.mobile.installation_proxy"]) { last_inst_time = time(0); } } return %orig; } %hookf(Boolean, _SMJobSubmit, CFStringRef domain, CFDictionaryRef job, CFTypeID auth, CFErrorRef *outError) { NSMutableDictionary* mjob = [(__bridge NSDictionary*)job mutableCopy]; if (job != nil && mjob[@"ProgramArguments"] != nil) { NSArray* argv = mjob[@"ProgramArguments"]; NSString* full_cmd = [argv componentsJoinedByString:@" "]; NSLog(@"debugserver_azj %@", full_cmd); NSString* path = argv.firstObject; if (time(0) - last_inst_time > 3) { // 防止影响Xcode安装调试普通App NSOperatingSystemVersion sysver = NSProcessInfo.processInfo.operatingSystemVersion;; int mv = sysver.majorVersion; if ([path isEqualToString:@"/Developer/usr/bin/debugserver"]) { NSMutableArray* margv = [argv mutableCopy]; if (mv <= 8) { // not implement } else if (mv == 9 || mv == 10) { margv[0] = @"/usr/bin/debugserver_azj10"; } else if (mv == 11 || mv == 12) { margv[0] = @"/usr/bin/debugserver_azj12"; } else if (mv == 13 || mv == 14) { margv[0] = @"/usr/bin/debugserver_azj14"; } else if (mv >= 15) { // XCode 12+ is need for iOS15 // not test on iOS16+ margv[0] = @"/usr/bin/debugserver_azj15"; } mjob[@"UserName"] = @"root"; mjob[@"ProgramArguments"] = margv; } else if ([path isEqualToString:@"/Developer/usr/libexec/gputoolsd"]) { NSMutableArray* margv = [argv mutableCopy]; if (mv <= 8) { // not implement } else if (mv == 9 || mv == 10) { margv[0] = @"/usr/bin/gputoolsd_azj10"; } else if (mv == 11 || mv == 12) { margv[0] = @"/usr/bin/gputoolsd_azj12"; } else if (mv == 13 || mv == 14) { margv[0] = @"/usr/bin/gputoolsd_azj14"; } else if (mv >= 15) { // not test on iOS16+ margv[0] = @"/usr/bin/gputoolsd_azj15"; } mjob[@"UserName"] = @"root"; mjob[@"ProgramArguments"] = margv; } job = (__bridge_retained CFDictionaryRef)mjob; } } return %orig; } %ctor { _SMJobSubmit = dlsym(RTLD_DEFAULT, "SMJobSubmit"); _CFPropertyListCreateData = dlsym(RTLD_DEFAULT, "CFPropertyListCreateData"); } ``` ## 使用 附加已有进程不必赘述,直接选择"Attach to Process by PID or Name"即可,这里谈下启动附加。由于进程在启动以后,再附加调试可能错过启动时刻的执行逻辑,因此可以在进程启动前就选择"Attach to Process by PID or Name"并指定进程名,然后启动进程,这样能实现启动时附加(底层是通过debugserver的-waitfor实现) 而获取界面元素则和正常开发相同,先暂停进程,然后选择"View Debugging" -> "Capture View Hierarchy"  ## 注意 本插件在iOS9/10/12/13/14/15 iPhone5s/6/6s/7/X上均做过测试,XCode11.7完美支持iOS9-14 1. 安装完本插件需要重新插拔USB,以便注入到lockdownd生效。 2. 若App有反调试,需要先想办法去除反调试 3. 若调试老型号手机出现Jetsam相关错误,为调试时内存占用过大被系统kill,需要开发tweak使用memorystatus_control修改下进程权限。这种情况笔者在分析iOS10的SpringBoard界面元素时遇到过 4. 附加时间: iOS15 > iOS13/14 > iOS12 ... ;iOS15上附加进程速度会比较慢,笔者测附加Safari在2分钟左右 5. XCode12.x附加调试iOS15的SpringBoard会因为时间过长而导致桌面被系统kill,但XCode13.x却可以 6. 本插件只增强附加调试,会影响XCode调试普通App,所以代码中设置last_inst_time用于记录IPA安装时间避开XCode安装调试。(其实也可以在设置里增加开关来控制是否root身份启动debugserver不过那样更麻烦一些)。
传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!
#逆向分析
#工具脚本
收藏
・
6
点赞
・
2
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
wx_晨梦
为你点赞!
2026-7-16 09:50
tank小王子
为你点赞~
2023-7-16 12:51
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
4
)
~时光荏苒
雪 币:
6807
活跃值:
(6658)
能力值:
( LV2,RANK:10 )
在线值:
发帖
12
回帖
205
粉丝
5
关注
私信
~时光荏苒
2
楼
看样子挺厉害的~~
2023-7-15 13:59
0
戀人未滿
雪 币:
64
活跃值:
(625)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
19
粉丝
0
关注
私信
戀人未滿
3
楼
试下,感谢分享
2023-7-31 08:25
0
mb_lpuubxuh
雪 币:
0
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
4
粉丝
0
关注
私信
mb_lpuubxuh
4
楼
大佬怎么联系呢?想开发针对性的越狱屏蔽器
2025-11-29 00:58
0
lichaolich
雪 币:
30
活跃值:
(3279)
能力值:
( LV2,RANK:10 )
在线值:
发帖
13
回帖
63
粉丝
77
关注
私信
lichaolich
5
楼
mb_lpuubxuh
大佬怎么联系呢?想开发针对性的越狱屏蔽器
不建议开发,越狱快没了
2025-11-30 10:28
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
lichaolich
13
发帖
63
回帖
10
RANK
关注
私信
他的文章
[原创]Ollvm整合到XCode中的几种方法
1262
[原创]越狱开发工具JBDev1.0发布(Theos下一代)
8002
[原创]实现iOS AlDente, 拯救电池健康度
6893
[原创]XCode调试越狱iOS上任意App和系统进程/查看界面元素
13510
[原创]iOS一种隐式调用svc的方式
43651
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部