]iOS逆向实践记录-让非6s机型在SpringBoard拥有3DTouch

首先先给我这困难的语言表达能力道个歉哈,真的尽力了。ios

最近才接触不久的逆向工程,刷夜,爆肝,把《iOS应用逆向工程》这本书的工具,所有看了一遍,而且尝试了一遍,感受须要点什么。 那就是实践!  最近6s手机出了3DTouch,无奈手中没有这款机型,刚好最近对逆向小有心得,又据说过已经有插件能实现一样的需求,证实确实有可行性,因而开动。根据点击的判断和出现,初步感受,这应该不须要多少行代码就能搞定,应该只要添加一个手势,或者是更改一个手势的点击事件,让系统认为发生了3DTouch点击事件,就能够了。git

在这里我仍是要推荐下我本身建的iOS开发学习群:680565220,群里都是学ios开发的,若是你正在学习ios ,小编欢迎你加入,今天分享的这个案例已经上传到群文件,你们都是软件开发党,不按期分享干货(只有iOS软件开发相关的),包括我本身整理的一份2018最新的iOS进阶资料和高级开发教程程序员

所需工具: cycript,openSSH,class-dumpgithub

测试环境:iOS9.0.2,iPhone5s微信

备注:由于自身没有3DTouch,因此须要下载一个插件,让机器拥有3DTouch功能,我使用的是forcy,经过覆盖长按手势,实现ssh

经过查阅官方文档,获得关键词  Shortcut Menu peek pop函数

这个词未来就是要在找关键方法时刻所要用到的工具

如今开始!布局

经过ssh链接到手机,而后将cycript注入到SpringBoard学习

huangjipingde-iPhone:~ root# cycript -p SpringBoard

首先 先隆重介绍1个方法,2个函数

1方法 [view recursiveDescription]  该方法能够当作是Reveal的文字版,用来查看当前页面的布局

2函数,原理均是runtime,可是第二个没有怎么看懂。。。

1. printMethods 打印出该类全部的方法,后边接的是实现的地址,在这儿补充一下,若是想对某个方法打断点,可是又不想使用ida查看方法偏移,能够直接在这实现的地址处,添加断点,虽然不知道断在什么地方,可是能够确定必定是在执行该方法的时候。效果以下图:

iOS开发学习群:680565220

2. tryPrintIvars打印出对象全部的属性,效果以下图:

 

准备工做都作好了,将两个函数都先输入进去

由于最后的目标是应用图标,因此,如今咱们从主界面开始着手打印它的UI布局

1    [[UIApplication sharedApplication].keyWindow.rootViewController.view recursiveDescription]

iOS开发学习群:680565220

而后出来了一大片,红呦呦的代码,看着都眼睛疼,4点钟时看得眼睛都瞎了啊。此时应想,主界面能够滚动,是一个scrollView,是scrollView就得有contentSize,而后一看手机的页面,总共有5页,因为5s机型的宽度是320,因此这时候能够大胆猜想它的contentSize的最大宽度是1600,而后commond+F大法

准确命中,同时,还注意到,它的contentOffset是960又此时个人页面正是第4页,基本锁定目标,查找frame的坐标是960,0的view,此时能够获得大量信息了,SBRootIconListView,这个就是用来装一页全部图标的View,SBIconListModel这个里边,我猜是装了该view里边的模型信息,注意,11 icons,正好是咱们页面全部的图标数,此时再看后边SBIconView的size 62,62  这和图标尺寸的差距只有2个点,基本锁定,它就是咱们要找的目标

此时,让咱们找到是什么在处理SBIconView的事件,咱们所知道的,view通常是用来展现的,事件的发生通常都会交给代理来负责。让咱们使用nextResponder,或者寻找他们的代理,来定位到一个controller文件,很幸运,直接一步就找到了,就是它:SBIconController!

此时,咱们能够class-dump出SpringBoard的头文件了,去查看一下它的里边都有些什么方法和属性,若是想偷懒,去github直接搜索也行。。。

根据关键词和方法名译的意思大体锁定出来如下几个方法

ps:  这儿的char 是BOOL类型

本身写一个tweak,hook全部的这些函数,给他们全部的实现以前加上一个NSLog(),查看调用的顺序,和传进来的值的类型。 以及一次Peek事件所关联到了哪些方法。

 

此时咱们拿手机进行一次长按操做,使其弹出ShotcutMenu菜单,而后在openSSH中查看系统日志grep ZZT3D /var/log/syslog查看一下,该事件处理分别使用了那几个方法。

由于是要欺骗系统,因此方法应该是在前方,初步定位到这3个方法,第一个顾名思义返回值就是能不能显示shotcutMenu,第二个,咱们能够看到,这里传进来了一个手势,经过这手势的信息,基本能够推断,这个就是插件做者用来欺骗系统的手势,而该方法,就是手势的target方法,第三个,根据意思能够得知,从XXiconView,是否当即显示。核心就在于这儿了。最后,咱们再打印一遍SBIconView的全部属性,用来确认一下

继续搜索关键词,果真又有大收获_shortcutMenuPeekGesture有一个如此手势,里边的东西的手势。

猜想获得了极大的确定,下面就开始编写tweak了

因为是要给每个iconView都添加手势,而且只添加一次,因此翻看了iconView头文件,查看他的init方法,选择了在initWithContentType中初始化。

贴上Tweak.xm的源码

关于代码的编写,中间也踩过很多坑,好比_revealMenuForIconView中的yes,no的设置,还好一开始猜的时候就所有手动赋值。

至于手势为何传值须要如此怪异,由于检测发现原方法只识别长按手势,并不识别轻扫手势,可是由于我的习惯,不想覆盖系统手vc轻松搞定,如今轻扫一下手机!出现了意想之中的弹窗!

 

 

 

至此,所有结束,感谢您看彻底部.欢迎关注微信公众号:程序员大牛。

相关文章
相关标签/搜索