IPhone一起玩越狱 -(十二)- Tweak修改系统应用SpringBoard

引言

今天没什么大的事情,就修改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上面加上角标也就不是问题。

呐,现在就玩到这里,出去吃饭。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 最近在做一个富文本编辑器的功能,里面牵扯到一些原生、第三方软键盘的判断处理逻辑.我是这样做的: 在 fun...
    iOS_我更专业阅读 4,019评论 11 6
  • 代码格式 使用空格而不是制表符 Tab 不要在工程里使用 Tab 键,使用空格来进行缩进。在 Xcode > Pr...
    small_Sun阅读 1,490评论 1 3
  • 来自网络 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会...
    用心在飞阅读 956评论 5 4
  • OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装、继承、多态。它既具有静态语言的特性...
    XLsn0w阅读 4,313评论 2 1
  • 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会到今年的就...
    独酌丿红颜阅读 2,494评论 18 60

友情链接更多精彩内容