美文网首页
iOS逆向实战之多彩截屏闪烁

iOS逆向实战之多彩截屏闪烁

作者: 码农老王 | 来源:发表于2018-05-29 13:55 被阅读100次

    这里通过一个非常简单的小项目来梳理前几天提到的工具, 如名字所说, 就是让截屏时闪烁的白光变成随机的颜色, 下面一步步开始.

    运行环境

    macOS10.13.4
    iPhone5c 10.3.3/h3lix越狱

    工具依赖

    macOS端

    class-dump
    Theos

    iOS端

    OPENSSH
    Cycript
    CydiaSubstrate
    均为cydia安装

    实战阶段

    需求其实很简单, 就是改变截屏时的颜色, 那么我们就从寻找对应的头文件开始.

    dump头文件并定位函数

    截屏的操作是在SpringBoard中完成的, 那么我们需要找到SpringBoard的app文件, 然后拷贝到本地, 进行dump.
    因为系统app没有从App Store加壳, 所以这里不需要用到dumpdecrypted.

    寻找app文件所在的目录

    可以参考Unix和iOS的常用目录整理
    也可以直接使用查看进行的命令迅速定位

    $ ps -e | grep SpringBoard
     4156 ??         0:38.88 /System/Library/CoreServices/SpringBoard.app/SpringBoard
     4457 ttys000    0:00.01 grep SpringBoard
    

    可以定位到/System/Library/CoreServices/SpringBoard.app/SpringBoard就是执行文件所在, 那么就复制下来

    $ scp root@192.168.6.79:/System/Library/CoreServices/SpringBoard.app/SpringBoard ~/Desktop/tmp 
    root@192.168.6.79's password: 
    

    现在拿到了对应的执行文件开始dump

    $ class-dump -S -s -H SpringBoard -o ./SpringBoardHeaders
    
    $ ls SpringBoardHeaders 
    AVExternalDeviceDelegate-Protocol.h                                            SBLockScreenTimerViewController.h
    BBAccessoryIcon-SBUtilities.h                                                  SBLockScreenTimerViewControllerDelegate-Protocol.h
    BBBulletin-SBBulletinBanner.h                                                  SBLockScreenToAlertWorkspaceTransaction.h
    BBBulletin-SBUtilities.h                                                       SBLockScreenToAppsWorkspaceTransaction.h
    BBBulletinRequest-SBBulletinBannerControllerTest.h                             SBLockScreenUnlockRequest.h
    BBDataProvider-Protocol.h                                                      SBLockScreenUserPictureView.h
    BBObserverDelegate-Protocol.h                                                  SBLockScreenUserPictureViewController.h
    BBRemoteDataProvider-Protocol.h                                                SBLockScreenView.h
    ....
    

    我们在这一堆头文件中寻找那么一个截屏的函数的确有点大海捞针的意思的了, 当然我们不能一个一个函数的寻找, 现在就得使用一点发散思维, 比如截屏的闪光一般你如何定义呢, 试试flash关键字的搜索吧!

    当你在SpringBoardHeaders文件夹搜索flash的时候, 会发现只有五个头文件包含flash, 而最显眼的那个就是SBScreenFlash.h, 从名字看起来我们已经很接近要寻找的目标了, 那么打开它一探究竟.

    #import <objc/NSObject.h>
    
    @class NSMutableArray, UIScreen, UIView, UIWindow;
    
    @interface SBScreenFlash : NSObject
    {
        NSMutableArray *_flashCompletionBlocks;
        UIScreen *_screen;
        UIWindow *_flashWindow;
        UIView *_flashView;
        BOOL _windowVisible;
    }
    
    + (id)mainScreenFlasher;
    - (void).cxx_destruct;
    - (void)_createUIWithColor:(id)arg1;
    - (void)_orderWindowFrontAndThenOut:(id)arg1 withColor:(id)arg2;
    - (void)_orderWindowOut:(id)arg1;
    - (void)_tearDown;
    - (void)flashColor:(id)arg1 withCompletion:(CDUnknownBlockType)arg2;
    - (void)flashWhiteWithCompletion:(CDUnknownBlockType)arg1;
    - (id)initWithScreen:(id)arg1;
    
    @end
    

    这就是整个SBScreenFlash.h的内容, 令我们兴奋的是我们发现了(void)flashColor:(id)arg1 withCompletion:(CDUnknownBlockType)arg2;函数! 它看起来的确就是我们要寻找的函数了.

    使用Cycript实时调试以验证我们的猜测
    $ cycript -p 4156
    cy# [[SBScreenFlash mainScreenFlasher] flashColor:[UIColor redColor] withCompletion:nil]
    

    然后你会发现手机屏幕会闪烁红色的亮光, 那么可以肯定我们寻找的函数是正确的, 当然你可以换成任意你希望的颜色.

    编写tweak插件来实现随机的自动的更换闪烁颜色

    $ $THEOS/bin/nic.pl 
    

    选择 [11.] iphone/tweak模板创建项目
    作用包 MobileSubstrate Bundle filter [com.apple.springboard]
    关于Theos的详细介绍详见

    Makefile内容
    include $(THEOS)/makefiles/common.mk
      
    TWEAK_NAME = ColorfulScreenShots
    ColorfulScreenShots_FILES = Tweak.xm
    THEOS_DEVICE_IP = 192.168.6.47
    
    include $(THEOS_MAKE_PATH)/tweak.mk
    
    after-install::
            install.exec "killall -9 SpringBoard"
    

    其中THEOS_DEVICE_IP为你自己手机的IP
    TWEAK_NAME 为你自己项目的名字
    controll和 ColorfulScreenShots.plist在这里不需要修改

    Tweak.xm内容
    %hook SBScreenFlash
    -(void)flashColor:(id)arg1 withCompletion:(id)arg2 {
    
    
            CGFloat red = (arc4random() % 256) / 255.0;
            CGFloat green = (arc4random() % 256) / 255.0;
            CGFloat blue = (arc4random() % 256) / 255.0;
    
            UIColor *c = [UIColor colorWithRed:red green:green blue:blue alpha:1.0];
            %orig(c, arg2);
    }
    %end
    

    这里稍微解释一下
    %hook SBScreenFlash声明要勾住刚刚我们找到SBScreenFlash.h的实例对象
    %end为结束符
    然后我们将-(void)flashColor:(id)arg1 withCompletion:(id)arg2重写
    UIColor *c = [UIColor colorWithRed:red green:green blue:blue alpha:1.0]
    获得了一个通过随机RGB生成的的颜色.
    %orig(c, arg2);
    执行原始函数并且把第一个函数替换成我们刚才的颜色
    大功告成!

    安装

    在tweak目录下
    make
    make package install
    输入两次密码, 等待手机桌面重启后截屏看看效果吧!

    相关文章

      网友评论

          本文标题:iOS逆向实战之多彩截屏闪烁

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