美文网首页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