分析iOS的截屏功能的例子(iOS8)
思路
- 1、用ssp 导出 Springboard的二进制文件到OS。
- 2、用class-dump导出Springboard的所有头文件。
- 3、搜索有screenShot的文件。
- 4、对有screenShot的文件。用cycript进行调试
实践
经过分析后,已知 SBScreenShotter
类里面有个函数叫saveScreenshot
。这个函数比较可以。用cycript测试一下1
2
3
4toufangde-iPod:~ root# cycript -p SpringBoard
cy# [[SBScreenShotter sharedInstance] saveScreenshot:YES]
cy# [[SBScreenShotter sharedInstance] saveScreenshot:NO]
cy#
两个调用都有产生截屏,只是参数为YES的会让屏幕闪了一下。说到闪光,继续查找文件可以找到一个 SBScreenFlash的类。里面有个- (void)flashColor:(id)arg1 withCompletion:(CDUnknownBlockType)arg2;
方法,貌似是改变闪屏的颜色的。写个tewak测试一下。
新建一个 theos工程。
1 | $ /opt/theos/bin/nic.pl |
编写Tweak.xm
1 | %hook SBScreenFlash |
编辑makefile
1 | THEOS_DEVICE_IP = localhost -p 2222 |
注意:
THEOS_DEVICE_IP = localhost -p 2222, 这个是因为用的是usb链接。
编译打包安装
1 | make package install |
查看 /var/log/syslog
1 | toufangde-iPod:~ root# grep iOSRE: /var/log/syslog |
如此看出,截屏的时候。SpringBoard调用了UICachedDeviceWhiteColor类,UICachedDeviceWhiteColor继承自UIDeviceWhiteColorSpace。于是继续往下找UIDeviceWhiteColorSpace这个类。
UIDeviceWhiteColorSpace
1 | // |
UIDeviceWhiteColorSpace 继承自 UIColor。如此我们来测试一下这个函数1
2# cycript -p SpringBoard
cy# [[SBScreenFlash mainScreenFlasher]flashColor:[[UIColor magentaColor] colorWithAlphaComponent:0.8] withCompletion:nil]
屏幕闪过一道紫光。
到此,我们可以勾住这个函数,让截屏的时候闪过一道紫光。
截屏的时候闪过一道紫色的光
1、修改tweak.xm
1
2
3
4
5
6%hook SBScreenFlash
- (void)flashColor:(id)arg1 withCompletion:(id)arg2
{
%orig([[UIColor magentaColor] colorWithAlphaComponent:0.8],arg2);
}
%end2、makefile配置,
注意
引入UIKit 这个framework1
2
3
4
5
6
7
8
9
10
11
12
13
14THEOS_DEVICE_IP = localhost -p 2222
ARCHS = armv7 arm64
TARGET = iphone:latest:8.1:8.0
include theos/makefiles/common.mk
TWEAK_NAME = screenShotter
screenShotter_FILES = Tweak.xm
screenShotter_FRAMEWORKS = UIKit Foundation
include $(THEOS_MAKE_PATH)/tweak.mk
after-install::
install.exec "killall -9 SpringBoard"
然后去截图,就可以看到紫色的闪屏了。