2Tweak - 很小的小练习
Mon, May 7, 2018
去掉SpringBoard的未读数字
思路
- 编写一个Tweak给桌面用
- 桌面应用:SpringBoard
- 路径:System/Library/CoreServices/SpringBoard.app
- 找到Mach-O文件
- 验证是否加壳 otool -l SpringBoard | grep crypt
- MachOView查看是否加密
- class-dump出头文件
- 希望查看下通知个数这个UI控件在哪里..但是没有办法用Reveal查
- 通过Cycript查看控件在哪
使用Cycript寻找待修元素在哪里
查看根控制器的子控制器
找根控制器的Subviews - 希望找到小红点UI
问题:查到的东西过多
解决:靠经验去猜
猜测SBIconView是图标,尝试使用Cycript隐藏之,发现桌面图标确实少了一个,说明这个控件就是图标
再往下看,发现关键字:Badge
测试之,发现就是这个东东
查看指定类的头文件找思路
在class-dump中查看SBIconParallaBadgeView头文件
开发Theos
Done
实例二:微信UI修改
目标
思路
- 通过Reveal查看UI层级,拿到类名,tableView
- 改数据源
- 数据源就是它所在的控制器
- 找到这个控制器,修改数据源方法
其它
脱壳
Clutch会脱壳失败
可以使用decrypted脱壳方案进行脱壳
编写Tweak
numberOfSectionsInTableView这个方法需要先调用原方法,然后再+1
调用原始方法:%orig - 不写传参,所有参数会自动传入
尝试修改Cell
数据存储
开关的值保存起来
方案:可以使用NSUserDefaults把当前值存起来
提示:Tweak编写的时候可以定义宏
注意:
在Hook里面写的方法,默认为替换原方法(若木有源方法,默认不生效)
新方法需要在方法名前添加%new
加载图片资源
方案一:手机全路径
[UIImage imageWithContentsOfFile:@"全路径"];
全路径意味着,从手机的跟路径开始写起。
方案二:打包到Tweak里
- 新建一个layout文件夹 - Tweak默认会把layout文件夹下的文件,拷贝到手机跟路径中去
- 建议放图片资源的文件夹 - Device/Library/PreferenceLoader/Preferences
- 所以,需要在layout文件夹下放/Library/PreferenceLoader/Preferences这三个层级的文件夹
- 也可以放在/Library/Caches中,这个路径也是挺nice的
资源规划
方案一:抽宏
方案二:利用OC语法细节
@"字符串一" "字符串二" 相当于这是一个字符串
#path → 把传入的path自动加双引号 宏定义的语法
哈
去掉内涵段子的广告
定位UI
EssayTipCellImage
提示:
Reveal可以直接拿到内存地址
注意看右下方
问题
直接hook这个Cell的话有问题
- 可能会影响其他Cell
- Cell返回nil可能会Crash
方案
Cell的数据来自模型,能不能把模型干掉呢?
猜测数组模型中,有广告模型,也有正常模型,可以把广告模型滤掉
处理
找到TableView的dataSource
查看dataSource的属性,找疑似的数据源变量
还可以到class-dump出来的头文件中找到这个类查看
继续看可疑的EssayFeedListModel,发现dataList
cy中查看listModel里的dataList属性里有啥
结果
查看长度
猜想这个里面放的是模型,验证下,通过Cell找它对应的模型
发现了SSTipModel这个模型属性。我们返回到上面的那一坨结果中,发现里面有不少SSTipModel,说明我们的猜想成立
通过MJ封装的工具也可以搂出来_listModel成员变量中所有有关SSTipModel的数据
分析SSTipModel
发现它的init方法,尝试hook,让它返回nil
完成,广告被干掉了
其他思路
思路一:
思路二:
细节
- [xxxClass class] 可以用 %c表示
- 如果报「方法找不到」,可以随便声明一下这个方法就好 - 见上面截图的@interface一段
思路三:
找到发网络请求的方法,修改网络请求的返回JSON值
腾讯视频去广告
启动广告
目标
方案
Reveal找到广告类
class-dump导出头文件
尝试Hook掉init方法
问题
广告去掉了,但是黑屏了。
解决
发现有个showSplash方法,可以Hook它,直接调用hideSplash方法
视频广告
目标
思路
看下控制器,发现广告控制器和真正的视频控制器不是同一个,所以直接Hook掉广告控制器
实现
done