引言
今天没什么大的事情,就修改IPhone手机中SpringBoard
这个App
所有内容仅技术交流
步骤
-
在越狱手机上面找到SpringBoard这个App,将其中的MachO文件copy出来
xxxx-iPhone:~ root# ps -A //找到运行的SpringBoard这个App然后将其中的MachO文件导出来
-
用class-dump将这个MachO的头文件导出来
✘ xxx $ class-dump -H SpringBoard -o RemoveAngle/SpringBoardHeader/
-
USB访问iphone手机,使用cycript调试SpringBoard这个App
- 查看SpringBoard默认的桌面控制器
cy# @import tools cy# ZaCurrentVC() #"<SBHomeScreenViewController: 0x10473b220>"
- 循环遍历整个keyWindow的子控件
cy# UIApp.keyWindow.recursiveDescription().toString ()
- first尝试
找到你想改变的东西的控件,将你想改变的控件隐藏尝试一下//比方说我喜欢SBIconView这个感兴趣 cy# choose(SBIconView) //找到你要找的类,然后隐藏它,你在你的手机主页上面有可能会看到一个AppIcon消失了 //当然App消失以后,怎么才能让他在出现呐? xxxx-iPhone:~ root# killall -9 SpringBoard //杀死桌面App,然后会自动重启,还原状态,原因是你hidden的icon只是在内存当中修改,当App重启以后你内存修改内容也就会被还原
- Second尝试,设置badge角标'99'
修改所有的badge角标,全部设置成99,是不是很有意思?
cy# UIApp.keyWindow.recursiveDescription().toString () //我们可以找到一个类“ SBIconView”这个是应用的图标,但我在这个view的子视图没有找到badge相关的字段、子控件,会不会找错了,我们在当前控制器中打印一下所有的子视图 cy# UIApp.keyWindow.recursiveDescription()
find查找“badge”
尝试隐藏这个控件,观察手机是否隐藏了当前界面的角标,如果是那么证明这个就是。
当然我在手机上证明了我的猜想是正确的。
尝试用class-jump到处MachO文件中的所有的头文件,查看"SBIconParallaxBadgeView"这个类的属性#import "SBIconBadgeView.h" #import "_UISettingsKeyObserver.h" @class NSString, SBFParallaxSettings; @interface SBIconParallaxBadgeView : SBIconBadgeView <_UISettingsKeyObserver> { SBFParallaxSettings *_parallaxSettings; } - (void).cxx_destruct; - (void)_applyParallaxSettings; - (void)settings:(id)arg1 changedValueForKey:(id)arg2; - (void)dealloc; - (id)init; // Remaining properties @property(readonly, copy) NSString *debugDescription; @property(readonly, copy) NSString *description; @property(readonly) unsigned long long hash; @property(readonly) Class superclass; @end
父类
#import "UIView.h" #import "SBIconAccessoryView.h" @class NSString, SBDarkeningImageView, SBIconAccessoryImage; @interface SBIconBadgeView : UIView <SBIconAccessoryView> { NSString *_text; SBDarkeningImageView *_incomingTextView; _Bool _animating; CDUnknownBlockType _queuedAnimation; _Bool _displayingAccessory; SBIconAccessoryImage *_backgroundImage; SBDarkeningImageView *_backgroundView; SBIconAccessoryImage *_textImage; SBDarkeningImageView *_textView; } + (id)_createImageForText:(id)arg1 highlighted:(_Bool)arg2; + (id)_checkoutImageForText:(id)arg1 highlighted:(_Bool)arg2; + (id)_checkoutBackgroundImage; + (id)checkoutAccessoryImagesForIcon:(id)arg1 location:(int)arg2; + (struct CGPoint)_overhang; + (double)_textPadding; + (struct CGPoint)_textOffset; + (double)_maxTextWidth; + (id)_textFont; @property(copy, nonatomic) CDUnknownBlockType queuedAnimation; // @synthesize queuedAnimation=_queuedAnimation; - (void).cxx_destruct; - (void)_resizeForTextImage:(id)arg1; - (void)_clearText; - (void)_zoomOutWithPreparation:(CDUnknownBlockType)arg1 animation:(CDUnknownBlockType)arg2 completion:(CDUnknownBlockType)arg3; - (void)_zoomInWithTextImage:(id)arg1 preparation:(CDUnknownBlockType)arg2 animation:(CDUnknownBlockType)arg3 completion:(CDUnknownBlockType)arg4; - (void)_crossfadeToTextImage:(id)arg1 withPreparation:(CDUnknownBlockType)arg2 animation:(CDUnknownBlockType)arg3 completion:(CDUnknownBlockType)arg4; - (void)_configureAnimatedForText:(id)arg1 highlighted:(_Bool)arg2 withPreparation:(CDUnknownBlockType)arg3 animation:(CDUnknownBlockType)arg4 completion: (CDUnknownBlockType)arg5; - (void)setAccessoryBrightness:(double)arg1; - (struct CGPoint)accessoryOriginForIconBounds:(struct CGRect)arg1; - (void)prepareForReuse; - (_Bool)displayingAccessory; - (void)configureForIcon:(id)arg1 location:(int)arg2 highlighted:(_Bool)arg3; - (void)configureAnimatedForIcon:(id)arg1 location:(int)arg2 highlighted:(_Bool)arg3 withPreparation:(CDUnknownBlockType)arg4 animation:(CDUnknownBlockType)arg5 completion:(CDUnknownBlockType)arg6; - (void)layoutSubviews; - (void)dealloc; - (id)init; // Remaining properties @property(readonly, copy) NSString *debugDescription; @property(readonly, copy) NSString *description; @property(readonly) unsigned long long hash; @property(readonly) Class superclass; @end
分析这两个类
当我拿到这个类的头文件并没有修改角标的明确的方法,所以摆在我面前的道路:
1.查看当前类及它的父类
2.分析:所有的方法属性去尝试修改,然后调试数据,查看手机变化定位到角标的属性、方法;花费很多时间
3.直接hook当前类的方法-(id)init,将所有角标隐藏return nil,当然也有修改角标的方法
4.创建SpringBoard的tweak项目,如果tweak有问题请参阅十一
5.hook%hook SBIconBadgeView
这个类
实现一%hook SBIconBadgeView - (id)init{ return nil; } %end
结果
所有的Appicon的角标消失
实现二%hook SBIconBadgeView + (id)_createImageForText:(id)arg1 highlighted:(_Bool)arg2{ return %orig(@"99",NO); } %end
结果
你会发现原来不管是多少的角标,现在显示的全部都是99
扩展
我能不能在所有的Appicon上面加上角标呐?
通过在SpringBoard当前控制器中打印的所有子控件,已知
SBIconView
这个就是App的icon,隐藏以后整个应用的icon就看不到了,所以每个icon的角标都应该与之对应,我们在查看的时候发现,不是所有的SBIconView
中都有SBIconParallaxBadgeView
这个类,所以我的思想是在创建SBiconView的时候,应该有个判断条件来判断是否要创建SBIconParallaxBadgeView
只要我们将这个条件放开,所有icon上面加上角标也就不是问题。
呐,现在就玩到这里,出去吃饭。
网友评论