引言
今天沒(méi)什么大的事情容诬,就修改IPhone手機(jī)中SpringBoard
這個(gè)App
所有內(nèi)容僅技術(shù)交流
步驟
-
在越獄手機(jī)上面找到SpringBoard這個(gè)App右犹,將其中的MachO文件copy出來(lái)
xxxx-iPhone:~ root# ps -A //找到運(yùn)行的SpringBoard這個(gè)App然后將其中的MachO文件導(dǎo)出來(lái)
-
用class-dump將這個(gè)MachO的頭文件導(dǎo)出來(lái)
? xxx $ class-dump -H SpringBoard -o RemoveAngle/SpringBoardHeader/
-
USB訪問(wèn)iphone手機(jī)控妻,使用cycript調(diào)試SpringBoard這個(gè)App
- 查看SpringBoard默認(rèn)的桌面控制器
cy# @import tools cy# ZaCurrentVC() #"<SBHomeScreenViewController: 0x10473b220>"
- 循環(huán)遍歷整個(gè)keyWindow的子控件
cy# UIApp.keyWindow.recursiveDescription().toString ()
- first嘗試
找到你想改變的東西的控件,將你想改變的控件隱藏嘗試一下//比方說(shuō)我喜歡SBIconView這個(gè)感興趣 cy# choose(SBIconView) //找到你要找的類(lèi),然后隱藏它对雪,你在你的手機(jī)主頁(yè)上面有可能會(huì)看到一個(gè)AppIcon消失了 //當(dāng)然App消失以后,怎么才能讓他在出現(xiàn)吶米绕? xxxx-iPhone:~ root# killall -9 SpringBoard //殺死桌面App瑟捣,然后會(huì)自動(dòng)重啟,還原狀態(tài)栅干,原因是你hidden的icon只是在內(nèi)存當(dāng)中修改迈套,當(dāng)App重啟以后你內(nèi)存修改內(nèi)容也就會(huì)被還原
- Second嘗試,設(shè)置badge角標(biāo)'99'
修改所有的badge角標(biāo)碱鳞,全部設(shè)置成99桑李,是不是很有意思?
cy# UIApp.keyWindow.recursiveDescription().toString () //我們可以找到一個(gè)類(lèi)“ SBIconView”這個(gè)是應(yīng)用的圖標(biāo)窿给,但我在這個(gè)view的子視圖沒(méi)有找到badge相關(guān)的字段贵白、子控件,會(huì)不會(huì)找錯(cuò)了崩泡,我們?cè)诋?dāng)前控制器中打印一下所有的子視圖 cy# UIApp.keyWindow.recursiveDescription()
find查找“badge”
嘗試隱藏這個(gè)控件禁荒,觀察手機(jī)是否隱藏了當(dāng)前界面的角標(biāo),如果是那么證明這個(gè)就是角撞。
當(dāng)然我在手機(jī)上證明了我的猜想是正確的呛伴。
嘗試用class-jump到處MachO文件中的所有的頭文件,查看"SBIconParallaxBadgeView"這個(gè)類(lèi)的屬性#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
父類(lèi)
#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
分析這兩個(gè)類(lèi)
當(dāng)我拿到這個(gè)類(lèi)的頭文件并沒(méi)有修改角標(biāo)的明確的方法谒所,所以擺在我面前的道路:
1.查看當(dāng)前類(lèi)及它的父類(lèi)
2.分析:所有的方法屬性去嘗試修改热康,然后調(diào)試數(shù)據(jù),查看手機(jī)變化定位到角標(biāo)的屬性百炬、方法褐隆;花費(fèi)很多時(shí)間
3.直接hook當(dāng)前類(lèi)的方法-(id)init,將所有角標(biāo)隱藏return nil剖踊,當(dāng)然也有修改角標(biāo)的方法
4.創(chuàng)建SpringBoard的tweak項(xiàng)目庶弃,如果tweak有問(wèn)題請(qǐng)參閱十一
5.hook%hook SBIconBadgeView
這個(gè)類(lèi)
實(shí)現(xiàn)一%hook SBIconBadgeView - (id)init{ return nil; } %end
結(jié)果
所有的Appicon的角標(biāo)消失
實(shí)現(xiàn)二%hook SBIconBadgeView + (id)_createImageForText:(id)arg1 highlighted:(_Bool)arg2{ return %orig(@"99",NO); } %end
結(jié)果
你會(huì)發(fā)現(xiàn)原來(lái)不管是多少的角標(biāo),現(xiàn)在顯示的全部都是99
擴(kuò)展
我能不能在所有的Appicon上面加上角標(biāo)吶德澈?
通過(guò)在SpringBoard當(dāng)前控制器中打印的所有子控件歇攻,已知
SBIconView
這個(gè)就是App的icon,隱藏以后整個(gè)應(yīng)用的icon就看不到了梆造,所以每個(gè)icon的角標(biāo)都應(yīng)該與之對(duì)應(yīng)缴守,我們?cè)诓榭吹臅r(shí)候發(fā)現(xiàn)葬毫,不是所有的SBIconView
中都有SBIconParallaxBadgeView
這個(gè)類(lèi),所以我的思想是在創(chuàng)建SBiconView的時(shí)候屡穗,應(yīng)該有個(gè)判斷條件來(lái)判斷是否要?jiǎng)?chuàng)建SBIconParallaxBadgeView
只要我們將這個(gè)條件放開(kāi)贴捡,所有icon上面加上角標(biāo)也就不是問(wèn)題。
吶村砂,現(xiàn)在就玩到這里烂斋,出去吃飯。