阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

只需双击,老铁!debugserver 快速启动插件

  • 2020-04-10
  • 本文字数:2346 字

    阅读完需:约 8 分钟

只需双击,老铁!debugserver快速启动插件

debugserver+lldb 很好用,但启动起来太麻烦?我们开发了一款 iOS SpringBoard tweak 小插件,简化 debugserver 启动过程。老铁,请双击!

0x00 懒是第一生产力

我们经常要通过 debugserver 对 App 进行调试,有书籍和论坛对相关的技术和实践进行了说明,但实际应用起来还是有些麻烦。先要重签拷贝,再要启动终端 ssh 到 iPhone 启动 debugserver,各种 ls 加 grep 找到想调试的应用,敲命令启动 debugserver,然后 Mac 本地终端启动 lldb。这样折腾下来,至少要开两个终端,有的时候甚至更多。GitHub 上有个 issh 工具对上述操作有封装和优化,但是还是需要敲命令找 App,再运行 debugserver。


所以做个 tweak 提升一下生产力。只需 双击应用图标,即可一键启动 debugserver


代码见:Github https://github.com/TalkingData/tap2debug


运行界面



我们所用的开发环境是 iOS 13.3,但是并没有用到特殊版本的 API,低版本手机应该也 OK。


下面简单分享开发过程:

0x01 通过图标找到应用执行路径

从界面找逻辑,逆向发现 SpringBoard 的图标是 SBIconView。并且有一个叫属性 applicationBundleIdentifierForShortcuts 返回的是图标对应的 App 的 Bundle ID。通过 Bundle ID 构造 LSApplicationProxy 对象,并且获得 canonicalExecutablePath 属性,也就是应用的可执行文件路径。


Class LSApplicationProxy_class = objc_getClass("LSApplicationProxy");NSObject* proxyObj = [LSApplicationProxy_class performSelector:@selector(applicationProxyForIdentifier:) withObject:bundle];NSString * canonicalExecutablePath = [proxyObj performSelector:@selector(canonicalExecutablePath)];
复制代码

0x02 寻找注入点添加扩展

接续看 SBIconView,图标上有两个手势对象:


  • 单击,用来启动 App。

  • 长按,进入编辑状态,执行删除和排列图标等操作。


所以,我们来给图标交互加个双击扩展。


%hook SBIconView


- (void)didMoveToWindow{    %orig;    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleDoubleClick:)];    [doubleTap setNumberOfTapsRequired:2];    [self addGestureRecognizer:doubleTap];    NSArray * ges = self.gestureRecognizers;    for(UITapGestureRecognizer * each in ges){        if([each isKindOfClass:[UITapGestureRecognizer class]]){            [each requireGestureRecognizerToFail: doubleTap];        }    }}
复制代码


这里额外说一句,[each requireGestureRecognizerToFail: doubleTap] 添加了双击手势指挥,由于 iOS 内部维护了手势的状态机,我们进行单击操作的时候,其实产生了两种 Possible State。第一种是识别为单击,然后结束。第二种是识别为双击的第一下并等待第二下的发生,然后根据两次点击之时间间隔阈值来判断是不是合法的双击。


所以我们手动增加了约束,相当于指定了识别的优先级,只有双击失败了,才继续执行单击回调。这种操作会带来一点几乎无感的瑕疵:单击后等待双击识别失败的延迟,延迟的值就是双击识别执行的阈值(大约零点几秒)。

0x03 debugserver 启动和关闭

debugserver 是一个二进制文件,狗神的教程里有如何重签,issh 把这些过程给简化了。先看一下 debugserver 的权限:


-rwxr-xr-x 1 root admin 9876848 Jan 19 11:28 /iOSRE/tools/debugserver*


再来看一下 SpringBoard 的权限:


-rwxr-xr-x 1 root wheel 71264 Dec 5 13:15 SpringBoard*


属主用户都是 root,没毛病。找个函数调用一下:


  1. system 函数

  2. posix_spawn 函数

  3. NSTask ,面向对象方便管理,异步执行,不会 block UI,就用它了。


代码如下:


task = [[NSTask alloc]init];[task setLaunchPath:bin_serverpath];[task setArguments:args];[task launch];
复制代码


每次 server 在 launch 之前,要把之前的 task 结束掉。


- (void)interrupt; // Not always possible. Sends SIGINT.
复制代码


- (void)terminate; // Not always possible. Sends SIGTERM.
复制代码


NSTask 头文件里竟然告诉我 Not always possible。事实上,在调用的时候,还真的不怎么 possible,实际测试第一次 server 正常启动,后续由于没成功关闭,所以第二次就没法启动了。


所以还是换种方式关闭吧。简单粗暴的 kill 函数:


NSTask * task = [TaskManager sharedManager].runningTask;if(task){    kill(task.processIdentifier,SIGKILL);    task = nil;}
复制代码

0x04 添加 UI 交互

直接用 Alert,又有按钮又有输入框,不过 UIAlertView 已经被废弃掉了,需要用 UIAlertController。由于弹出 Controller 需要父 Controller,通过 View 找到当前的 Controller,做正向的应该都写过这段代码吧:



@implementation UIView(find)-(UIViewController*)findViewController{ UIResponder* target= self; while (target) { target = target.nextResponder; if ([target isKindOfClass:[UIViewController class]]) { break; } } return (UIViewController*)target;}@end
复制代码

0x05 优化一下用户体验

输入框里的 IP 和 debugserver 的 path,每个人都不一样,所以在第一次输入完成之后,把这些值用 NSUserDefault 持久化存储起来,下次直接读取填充。

0x06 后记

之前在相关技术论坛读到讨论用 Root 身份运行 App 的帖子,学习完帖子里的技巧,增强对操作系统的理解以及实践之后,发现如果真的想 RootApp 运行,其实 SpringBoard 本身就是一个 RootApp,我们把 SpringBoard 当做 RootViewController,很容易把一些系统工具做出界面,从而提升生产力。比如砸壳、重签、拷贝 App 等。


参考资料:


书籍:https://book.douban.com/subject/25826902/


论坛:http://bbs.iosre.com/t/debugserver-lldb-gdb/65


issh 工具:https://github.com/4ch12dy/issh


2020-04-10 18:33546

评论

发布
暂无评论
发现更多内容

Charles for Mac(HTTP协议抓包工具)v5.0b12注册激活版

iMac小白

Loopback for Mac(mac虚拟音频设备)v2.3.2直装版

iMac小白

聚道云软件连接器助力宁波银行与金蝶产品高效对接

聚道云软件连接器

案例分享

2023年实时音视频行业观察-黄金时代彻底过去

轻拿轻放

音视频

音视频:音视频的编解码 | 社区征文

笨笨的鸟

音视频

快速体验Spark Connect

CloudEon开源

Linux学习笔记0 - 三个感想

袁世超

Linux 学习 内核

IBM SPSS Statistics 27 for Mac(spss数据统计分析软件) v27.0.1中文版

iMac小白

微信多开 WechatTweak for Mac(微信多开、消息防撤回工具) v3.8.6中文集成版

iMac小白

深入浅出分析云原生微服务的技术结构和架构设计

Tech技术攻关

架构 微服务 云原生 云原生微服务 云原生技术

聚道云软件连接器助力精成MES与金蝶K3wise的无缝对接

聚道云软件连接器

案例分享

OH与AI绘画的碰撞,打造个性化视觉艺术

白晓明

OpenHarmony Stable Diffusion Ai绘图

mxxWechatBot微信机器人V2使用教程(图文)最全最详细

穆雄雄

微信机器人 mxxWechatBot

2023年12月 GitHub 关注度最高的前十名

晴空万里

GitHub github Contributing

聚道云助力企业数字化转型:金蝶云星空与旺店通无缝对接

聚道云软件连接器

案例分享

聚道云软件连接器助力哗啦啦与开联通预付卡无缝对接

聚道云软件连接器

案例分享

AI 时代:保持好奇心

石云升

AI 年终总结

mxxWechatBot微信机器人V2(流程图、原理)

穆雄雄

微信机器人 mxxWechatBot

SmartSVN for Mac(SVN客户端) v14.4激活版

iMac小白

混合专家语言的快速推理的大模型

想得开居士

高效视频处理框架BMF实践

轻口味

音视频

边缘计算学习总结与趋势预测:个人成长与项目经验分享

Geek_39796e

物联网 边缘计算 技术分享 城市智能化 边缘计算平台

聚道云软件连接器助力建筑企业实现资金系统与易快报的无缝对接

聚道云软件连接器

案例分享

CloudEon V1.3.0版本发布!

CloudEon开源

Typora for Mac(Markdown文本编辑器) v1.7.6中文版

iMac小白

Sketch for mac(专业矢量绘图设计软件)v99.1中文激活版

iMac小白

航行在梦中的夜

少油少糖八分饱

人生 读后感 无限游戏 内心 最伟大的作品

2023 总结与 2024 展望

air

技术 总结

GPT大比拼,谁才是最好用的GPT | 主赛道

雪奈椰子

文心一言 VS 讯飞星火 VS chatgpt (168)-- 算法导论13.2 1题

福大大架构师每日一题

福大大架构师每日一题

技术人的 2023 总结|AI大模型探索

世人万千丶

开发者 前端 AI大模型

只需双击,老铁!debugserver快速启动插件_文化 & 方法_TalkingData小张同学_InfoQ精选文章