美文网首页iOS 功能类
IPhone一起玩越狱 -(十二)- Tweak修改系统应用Sp

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

作者: struggle3g | 来源:发表于2018-06-25 20:50 被阅读6次

引言

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

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

相关文章

网友评论

    本文标题:IPhone一起玩越狱 -(十二)- Tweak修改系统应用Sp

    本文链接:https://www.haomeiwen.com/subject/ifdcyftx.html