这里通过一个非常简单的小项目来梳理前几天提到的工具, 如名字所说, 就是让截屏时闪烁的白光变成随机的颜色, 下面一步步开始.
运行环境
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 [email protected]:/System/Library/CoreServices/SpringBoard.app/SpringBoard ~/Desktop/tmp
[email protected]'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
@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
输入两次密码, 等待手机桌面重启后截屏看看效果吧!