二、屏幕录制 – UNI'S ON AIR资源提取逆向全记录

  此篇文章可以算作是时间线上的一个番外篇,是我一开始没能成功通过抓包获取到视频后做的其他尝试。本篇独立于该系列中其他文章,对屏幕录制没兴趣可以直接跳过本篇文章。

  之前说到我定位到了这种.usme文件就是要找的Live视频,但如果说.usme文件使用的是一种完全自研的视频压缩算法,类似古老的.rmvb格式那样,而不是对现有视频压缩算法比如MPEG-2的封装和加密,要让最终的视频可以在普通的播放器中播放,就意味着要自己搞一套解码器,这样的话难度相比于原来又提升了一个量级。

  而UNI'S ON AIR本身就是一个现成的解码器,并且游戏内还有专门供观赏Live视频用的模式,那直接录制屏幕不就行了吗?不过通过录制屏幕获得的视频会存在这样几个问题:

  1. 由于设备长宽比的差异,录制的画面和原始视频相比可能并不完整;
  2. 在视频下方会有分数和曲目名称等游戏内元素的遮挡;
  3. 视频原始分辨率和屏幕分辨率的差异,会造成画质的损失。

  由于当时在SNS上已经看到了许多通过录制屏幕获取的视频,我还天真地以为这是一件非常容易的事情,然而等到实际尝试录屏的时候才发现并没有那么容易。

0x01 iOS录屏

  首先拿iPhone X试一试,结果发现在录屏开启的情况下进入Live模式后,视频就会停止播放,只有把录屏关掉后才会继续。既然录屏不行,那用投屏将屏幕投到电脑上来录制总是可以的吧,于是下载了AirPlay的软件,打开手机的屏幕镜像进入游戏后发现,竟然还是会停止播放,这让我陷入了沉思,不过还是在网上找到了这个问题的答案。

  原来iOS 11新增了系统自带的录屏功能,而对于开发者来说有一些东西是不希望用户录制的,于是就有了防止录制屏幕的需求,因此苹果公司在iOS 11的SDK中新增了UIScreen的API来告知应用当前屏幕录制状态。当UIScreen.isCapturedtrue时,表示屏幕正在被录制、屏幕镜像或被AirPlay发送。当录屏状态发生变化时,UIKit会通过UIScreenCapturedDidChangeNotification来通知应用,因此应用可以基于此来对用户的录屏行为做相应的处理。这样就能解释为什么无法在iPhone X上进行录制了,iOS系统把录制、屏幕镜像和AirPlay都同等对待了,所有这些都被认为是录制屏幕的行为。

  那既然iOS自带的方法不管用,有没有第三方的屏幕录制软件可行呢,然而很可惜,由于iOS系统的限制,第三方的录屏软件不是调用了系统的录屏,就是使用了屏幕镜像功能,无一例外都被应用的防录屏措施限制住了。

  那是不是iOS上就完全没办法录制了呢?其实也不是,前面说了屏幕录制状态的API是iOS 11才加入的,在这之前的版本应用是无法检测到录屏状态的,而这个游戏支持的版本是iOS 9及以上,那拿个iOS 9或者iOS 10的手机应该就可以录制了,不过我没有这样的手机所以也没有验证。

  还有一个方法,根据多次的试验发现,录屏检测是每隔几秒一次,也就是说利用时间差,一次能录到几秒钟的视频,只要有足够的耐心,就可以把整个视频录完拼接起来,我在SNS上看到真有这么录的,不过这种方法显然不是我想要找的。

0x02 Andriod录屏

  既然iOS系统的限制比较大,那Android录屏应该相对比较容易一些吧。然而又想错了,Android上虽然可以在Live模式下录制屏幕,但是录完以后打开录制的视频发现,视频整个是黑的,也就是说录制下来视频和实际屏幕上看到的图像是不一样的,试了下投影到电脑上或者是第三方录屏软件,得到的都是黑屏。搜索了一下Android的防止录屏的方法,发现其实应用想要防止录屏只需要加一句代码getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE),就可以让录到的视频完全黑屏。

  然而Android是开源的,市面上有许多可以在电脑等x86平台上运行的Android模拟器,那从一个外部的系统来对显示画面进行录制总不会受到限制了吧。可是又遇到了另一个问题,没有一个模拟器能够成功运行起这个游戏。要么是安装不上,要么是打开游戏的时候闪退(后来才知道这是因为游戏用了ARM指令集的原生编译,模拟器处理不好的话就会闪退掉了,或者是应用中含有模拟器检测的措施,检测到是模拟器环境会终止运行),于是这条路也没有走通。但是貌似有些人的确是通过虚拟器录的,他们具体用的什么我也不清楚。

  不过,Android毕竟是开源的,root了以后系统随便改,这点限制算得了什么。看到论坛有人说Xposed框架有个DisableFlagSecure的软件可以去除禁止截屏的限制,不过因为我这联想的破手机root太过麻烦,因此并没有验证,对于我来说,知道这个原理已经足够了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注