安卓手机 F2FS文件系统镜像快速解析技巧
F2FS文件系统相对于传统的EXT4文件系统更适合移动设备存储。EXT4文件系统最初是从Linux系统延申应用至安卓系统的。可以理解安卓系统是Linux系统的一个变种,很多Linux系统机制和内核漏洞也会在安卓系统中体现。然而,EXT4文件系统最初并不是为安卓存储而设计,没有考虑到安卓系统这样大规模的碎片化存储问题。这导致安卓系统从设计之初到现在一直存在着“诟病”的碎片化问题,表现为安卓系统的智能设备使用时间越长越慢,最终变得无法忍受。
直到F2FS文件系统的诞生,这种碎片化问题才得到了有效的改善。2016年底,华为公司发布了自己设计的移动设备CPU——海思麒麟960,并推出了一款基于安卓系统的智能手机——华为Mate9,广告宣称该型号使用18个月不卡顿。实际上,能让Mate9使用18个月不卡顿的主要功勋是F2FS文件系统。需要注意的是,F2FS文件系统的优化对于提升系统速度和效率起到了很大的帮助,但并不是说仅仅因为F2FS,华为对安卓系统的优化贡献最大。实际上,在现有的安卓源码中,华为贡献了相当大一部分,华为和Google之间有着大量的交叉互换专利协议。华为拥有大量的系统设计修改经验,因此华为的实力不容小觑。
F2FS是一种动态的文件系统,这意味着采用F2FS文件系统的手机用户分区在正常开机状态下会不断变化。文件系统就像一本书,有目录和内容,但F2FS的目录和内容时刻都在变化。因此,对于镜像的制作,是否应该在文件系统工作时进行呢?也就是在开机状态下进行呢?答案很明显,目录部分已经被镜像出来了,但在进行内容镜像时(实际上是根据存储地址进行先后拷贝的,但可以这样理解),即使手机没有新的文件写入,前面的文件目录已经发生了变化,而已经拷贝的镜像是不能随意更改的。因此,镜像F2FS文件系统时,应尽量减少其发生变化的量。不建议在手机系统正常工作的条件下进行镜像。对于采用FDE加密的F2FS分区,建议在第三方恢复模式下进行镜像(这样提取的镜像可能会有部分数据错乱,导致最终解析出错)。对于未加密的F2FS分区,建议采用关机状态下进行镜像(一定要正常关机,非正常关机可能导致镜像中部分数据错乱)。
由于F2FS文件系统存在上述问题,目前还没有开源的镜像解析方案。关于F2FS文件系统镜像的解析方法,早在2017年我们就写过类似的文章。当时我们利用虚拟机安装Ubuntu系统,在虚拟机中挂载F2FS镜像文件,虽然可以解析文件系统,但提取和分析数据相当繁琐,很多取证软件无法很好地配合和利用。今天我们继续探讨F2FS文件系统镜像内数据的快速提取和解析,作为对之前方法的一个补充利用。
对于一个典型机型,比如锤子的PRO2S,遇到这个机器,很多人都会感到头疼。但我们首先通过9008端口对其用户分区进行镜像,幸运的是,这台机器没有加密。如何判断是否加密呢?我们只需镜像userdata分区的前500M(或者像我这样有强迫症的可以完全镜像105G),然后用WinHex打开。如果从0x0开始一片都是00000000,那么可以判定userdata没有采用FDE全盘加密(但未采用FDE全盘加密并不意味着没有加密,稍后我会解释另一种加密方式:FBE)。
接下来,我们完整地镜像userdata,大约需要2个小时左右,相当煎熬。将105G的用户区镜像克隆到一张128G的TF卡上(如果您比我有钱,可以购买256G或更大容量的卡,只要比当前镜像容量大即可)。然后,我们找到一部17年以后生产销售的、已经解锁并刷好第三方恢复模式的华为手机(一定要华为,不要问为什么,因为爱国!)。
将克隆的镜像TF卡安装到手机上,将手机连接到电脑。由于第三方恢复模式默认开启了ADB无需配对,我们直接使用调试台。从上图可以看到,/external_sd就是TF卡。需要注意的是,如果默认情况下没有挂载data分区,可以继续下一步。如果data