由于5.24晚上推送了一个5.25就生效的隐私更新政策,看到国内Android厂商收集的内容之多跟利用的底线之低。。我深深被震惊到了(当然还是
感谢粗粮和GDPR,第一次主动告诉我这么细致),在更换到apple家族之前,先只能尽量自己动手丰衣足食,动手实践参考这篇-粗粮crack实践指南文章会比较系统完整的先介绍Android的安全机制跟大体结构,有空也会单独补充一些其他概念跟权限管理,以及Android性能问题。。
0x00.前言
首先需要需要重新把安卓的安全机制,锁机制,root权限(Xposed框架)相关完整的理一下, 不然出了问题其实还是一头雾水. 已经过了单纯依赖工具刷机/越狱的时光了。 先看常见术语 :
1.BootLoader原理分析
BootLoader(简称BL)如果要类比 , 可以想成是PC的BIOS(个人理解).而BL锁就是类似BIOS中的SecureBoot,是正常来说大家能接触到的第一个关卡,不管是普通还是特殊模式启动Android系统,都需要从BL初始化(不知有没有绕过手段?6.16更新: 的确有,比如通过高通的CPU漏洞绕过..)。
常见的Android有三种启动流程:
- 常规启动:BootLoader –> Boot.img (加载Linux内核) –> System.img(加载Android) 3核心步
- Rec模式:BootLoader –> Recovery.img –> OTA加载rom 2核心步骤
- Fastboot模式:BootLoader –> 烧写分区镜像(这是什么?) 2核心步骤
加载的过程还会有相应签名检测:
- 启动加载BL的时候,会检测它的下一步(Boot or Recovery)要加载的镜像包的签名信息 ,如果发现不是厂商自己的(被修改或者缺失了),就会直接拒绝启动
- 上一步通过之后,会分普通启动 & 恢复模式启动各自检查Android-system/Rom的签名。同样如果检测不合法/非原厂,也会中断启动
那BL的判断流程是什么样的呢?(加密过程暂时不清楚)
- 首先它会在手机通电启动后初始化时某个(rom/ram?待确定)区域设置一个标志位(T/F),判断加锁状态
- 如果状态为加锁,则不会允许第三方rom/app进行后续读写修改的;如果为解锁就放开第三方权限,从而可以进入后续的刷rec/rom等操作
- 但是从流程我们不难看出,如果Hacker能找到这个标志位存放的地方,也就肯定有办法通过某种手段直接修改标志位,达到绕过后续解密过程的目的。
那BL的解密过程是什么样的呢:
- 首先依赖官方提供的解密软件跟绑定的设备+账号,根据手机硬件特征生成一个(可能明文的)中间码
- 然后根据中间码发送给服务器加密生成一个解锁码 (加密过程通常是用RSA/其它非对称加密 + 厂商自己设计的加密算法组合而成,所以说如果要从这个地方破解,几乎不可能且太鱼了)
- 然后通过解密软件usb与设备连接,把这个解锁码写入到特定位置(这个位置也是厂商可以自定的),启动手机时BL会根据内部逻辑先在这个特定位置检测解锁码是否合法 (至于细节是是判断是否相同,还是其它方式也是厂商自己实现的),如果合法就会修改标志位为解锁。
BL和BL锁的作用:
- 首先BL的作用主要是在系统加载前,用以初始化硬件设备,建立内存空间的映射图,为最终调用系统内核准备好环境
- 而BL锁简单说当然是为了安全。坦诚点说就是为了防止原本厂商的ROM被修改,不管是被用户刷第三方rom导致后续售后(变转,不稳定,升级等等问题)麻烦许多
- 还是考虑到被Cracker获取手机后刷入破解的rom从而更有可能破解一些手机底层机密信息,比如HDCP秘钥/手机钱包/人脸&指纹识别等的数据(这些数据一般从硬件层面加密过,甚至Android系统层面都无法访问),因此有些rom会设定一旦BL解锁,会停止找回/钱包等功能(清掉数据否?)
因为这个需要申请解锁,所以提前去做了,粗粮解锁地址,并提前下好解锁工具。
2.Recovery mode与Adb与Fastboot
Rec-mode(还原模式)就类似PC比如美帝良心想的还原模式,或者更准确的比喻是像一个超精简的PE/OS(因为它本质是由一个极简的Linux kernel+一个可执行程序recovery组成),它的多是内置在手机存储的一个隐藏保护分区中,紧急情况进行修复操作。
在rec模式下,会加载部分文件系统,所以用户才能读取到SD卡中的xxx.zip包进行文件写入,也因此才能清除系统缓存+用户数据(所谓的“双清”)。 手动进入rec-mode多是长按音量+/- 和电源键。
ADB又是什么呢全称Android Debug Bridge )?因为各种原因(比如按键坏了)需要快速操作手机,通过这个SDK工具包中的调试软件adb ,以命令的方式控制手机。例如让手机重启后自动进入rec mode —-命令 adb reboot recovery .
Fastboot其实是比Rec权力更大的幕后boss,只不过普通人接触会少很多。它可以改写手机内软件层面的任何文件/分区,所以只要fastboot没有损坏,rec或者rom包都是可以随便刷的,肯定可以修复。它其实是调用SPL(Second Program Loader )进行系统交互的 ,SPL也可以近似看成一个BIOS?(这个待确认)
但是如果fastboot出现了问题或者损坏了,那就基本手机真的变砖了(修复方法可能异常艰难)。它实现了一个简单的通信协议,通过USB数据线跟PC进行交互,在fastboot进行的镜像刷写一般俗称“线刷”。
3.USB调试模式&线刷&卡刷
USB调试模式细节原理待补充,大概也能理解。。
通过Rec模式,不需要PC,直接通过插入的SD卡进行的刷写ROM,一般简称“卡刷”,线刷上面说过。
4.手机的ROM到底是什么?
还有一个经常听到, 但是搞不清楚的名词就是ROM(Read only memory)和RAM(内存.)
这个东西本来很好理解,原意是只读存储,我们常见得磁盘一般都是可以写&读的,除了某些很底层的文件我们需要烧入到一个位置,确保之后稳定只能读不能改变, 一般就称之为ROM。
但是在Android厂商口中的说法很容易让人误解,它等于是把Android系统文件写入的地方称为了ROM,虽然这个地方一般没有修改权限,但是其实还是可以很简单的越权修改的. 然后剩余的用户存储部分,有些厂商习惯叫它”内置sdcard“ (反正我是很迷的..). 有些就干脆懒得说,直接都用ROM一起代替了, 个人是很不提倡这种做法的.
5.Xposed是什么?
Xposed框架是一款可以在不修改APK的情况下影响程序运行(修改系统)的框架服务,基于它可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。(最好是有Root权限,所以经常搭配SuperSU
用一个比较易懂的例子,本来Android用户就像魔法世界的”麻瓜”,任人宰割… 直到少部分人有一天找到了
简单原理参考如图: (详细图看之后的)
简单说就是替换手机原本的的启动器zygote为 Xposed 修改后的,在启动过程中加载 XposedBridge.jar,Hackers就可以通过Xposed提供的接口来实现在原APP执行操作的前后DIY.(代码)
然后看了简单的流程,再看看实际的例子: (很好理解了)
需要注意的是: 由于把原生的启动器替换了,一些厂商针对手机的优化也就没了. 同时过多/频繁使用插件调用 Hook 函数也会造成一些性能损失,开机速度会明显变慢以及 App 的稳定性速度也会受到影响.
6.其他的工具或名词(低频)
SU与SuperSU是什么
Syslock 是什么?
简单说root后,给这两个软件root权限,然后用sysclock解分区(后续补),最后使用xposed。
待补充…
0x01.Android体系相关知识
A.理论
大体的说,我把Android分为3层 :
- 顶层是各种面向用户的App/server(Java/Kotlin)
- 中间层是第三方库/SDK+Dalvik虚拟机(?)
- 底层是linux内核(c+asm)
我们需要hack the ROM,避免各种国产厂商在中顶层作恶,从结构来看,最直接的办法显然是把底层换成原生Android–但是因为种种原因,这种做法很难稳定普及。
那么从难易度来说,我们Hack the ROM最快实现的可能就是Hack the App/Server,那么如何Hack the app呢?大部分人的做法是依赖于一款Android神奇框架–Xposed
再说Root,从Unix体系而来的变种,本质都会有一个超级管理员权限可以对OS做任何修改操作。在Android上我们简称为获取root权限。
B.启动流程
流程这个东西复杂一点最好还是画图来看,直观清晰太多。图引用自网络,部分地方可忽略,首先是大体的流程:
图描述待补充。。
接下来是细节的图,自底而上的帮我们更深入理解BL之后的整个过程. 这张图也非常棒,非常感谢原作者.一图胜千言
描述待补充。。
C.文件结构
- /boot:存放引导程序,包括内核和内存操作程序
- /system:相当于电脑c盘,存放Android系统及系统应用
- /recovery:恢复分区,可以进入该分区进行系统恢复
- /data:用户数据区,包含了用户的数据:联系人、短信、设置、用户安装的程序
- /cache:安卓系统缓存区,保存系统最常访问的数据和应用程序
- /misc:包含一些杂项内容,如系统设置和系统功能启用禁用设置
- /sdcard:用户自己的存储区,可以存放照片,音乐,视频等文件
0x02.保护隐私的习惯
原则:
- 最小信任原则 (只相信尽可能少的可靠的服务,给尽可能少的权限)
- 随机化打散,低关联原则
- 生物识别优先原则(因为纯键盘输入的信息太容易被窃取了,就像语音/视频/图片也比文字安全性好)
- 鸡蛋不放一个篮子原则 (做备份,关键信息做多重加密,与原则1尽量不冲突)
- 安全无银弹..
(欢迎大家帮忙补充…)
- 查看云服务提供商的隐私条款,国内免费的云服务基本都是默认免费换你的个人数据,如果实在想用建议只开启你觉得必要且泄漏无所谓的文件 (照片可以只选部分文件夹备份,私人信息及时转移)。因为离线备份其实更完整的备份了你常见的信息,包括闹钟、wifi、浏览器、App&data、msg&contact等所以我觉得完全不需要在云端共享这些信息,一旦泄漏它比你都了解你自己。。。
- 不管root与否,尽可能的减少所有App的不必要权限获取。不确定的选项一律打?除非确认必须允许,否则一律拒绝,特别是莫名其妙需要调用你相机,搜集你本机已安装Apps或随便更改系统设置以及获取你短信等等,你会发现很多国内厂商简直丧心病狂,国外软件就正常多了
- 密码尽量随机化,网页密码大部分采用最小信任原则(采用onepass/lastpass这种管理软件)+16位多组合随机字符(避免一丢全丢). 只有极少安全等级最高的采用自己设置
- App等服务尽量优先与非主用邮箱绑定,如果非要手机,尽量与小/新号关联.
- 如果已经绑定手机的服务,登录如果能短信登录就优先,支付等可以用指纹代替. 优先使用二维码登录 . 开启设备锁等功能.保证可确定连接设备跟登录信息.
- 不重要/临时的服务需要个人资料的,建议尽量用临时号或者信息. 因为可能用一次就再也用不到
0x0n.后续思考
首先关于apple的安全性,大家一般认为是基于iCloud为主的。那么iCloud相关安全性,需要给出一个完整清晰的最新的说明,包括把存储数据放贵州是否有其它隐患等 –待补充
其次是关于Xposed的问题,时间如果回到8年前..也就是我才开始用Android1.6的时候….或者晚一点2.3的时候…那时候Root首先是比较容易的,root后就可以自行控制各种权限,DIY了.那么为什么近几年,大家说的更多的不是root,而是Xposed这个框架了呢? Xposed为什么必须完全root才能使用呢?
从现在的实现来看,因为Xposed需要修改系统文件,而这些文件只有root权限才能修改;但是这只是当前实现的特性(修改系统分区文件),而非根本原因。Xposed要实现的最终目的是在任意App进程启动之前能任意加载 特定Xposed模块 的代码;这些特定的Xposed模块中能在App进程启动之前有机会执行特定代码,从而控制任意进程的行为。归根结底,Xposed需要控制别的进程,而没有高级权限(Root),越俎代庖是不行的。
有没有别的实现方式?自己Hook自己?
PS:偶然看到这,觉得挺有意思. 以后
如果有机会继续关注~
另外最后更新一下, 由于 Xposed 随着版本迭代和维护的问题, 和以前鼎盛的 Cydia 一样, 估计也会日渐换代, 对于普通同学来说:
- 如果对 Android 原理/技术
- 感兴趣, 可以阅读前文后, 在自己的备用机实验测试 (不建议主机)
- 不感冒, 建议直接刷欧版/印度版的 UI, 一般国内的 Android 厂商在这边都会”严格”遵循 GDPR 或者隐私保护
- 刷欧版/印版的可靠性和好处毋庸置疑, 但是又引出一个很蛋疼的事
- NFC/移动支付等支持, 因为在海外没有果内这么多公交卡等打通, 那默认刷完之后是没有支持的
- 愿意折腾的同学, 可以尝试刷入第三方包, 但我觉得也有安全隐患. 建议不愿意折腾的同学, 使用NFC手环代替, 其他大部分影响就很小了
总体而言, 在 2020 GDPR 规范落实之后, 刷海外版的 UI 是使用 Andriod 手机最佳方案之一, 之后有空再单独用一篇文章讲述.
参考资料:



