朋友家新进一台2016混动雅阁,看到网上有说可以破解车机来安装其他的第三方app,就想自己也搞一下,然后就找到我了。开始的时候我是拒绝的,因为我觉得这车机有个carplay已经够了,难道还有手机离身的时候吗,有蓝牙有wifi根本就无压力,但朋友坚持,也就帮忙去弄一下。
本来自己买车的时候也有考虑雅阁,但这混动高配版跟我看到的还是有不少区别的,这真皮,这按钮,都好用方便不少,少了波棍,少了手刹,也算是比较现代的配置了,虽然雅阁一直都是双屏的,但在这配置上这两个屏幕还是不能让我感觉到满意,最大的原因可能就是因为搭载了一个android,不是说android不好,而是说android背后带来的一系列的问题,容易改,乱七八糟,UI难看,很多时候还卡得一逼,其他的其实都还好,但我还是比较看重车机的体验的,而今晚就是要去root了这车机。
既然是android,那root其实就没什么太大难度了,搭载的是4.2.2,算是比较老的一个系统了,但作为车机系统而言,这个版本没什么意义。要root,那首先得连上去吧,我选择的是无线连接的方式,即是adb connect,山卡拉地方我也不指望会有wifi,所以还自带了一台android手机,用来充当热点AP。
本文都是基于XDA的教程来进行的,仅旨在描述过程中的一些细节操作技巧及部分原理。
电脑跟车机都连上了热点后,就可以直接用adb connect 来建立连接了
1 | adb connect 192.168.xx.xx:5555 |
默认的端口号为5555,而且默认就开启了无线调试,算是比较方便了。
连接上去后,解压XDA中提供的工具包,就可以开搞了。
root
第一步是root,XDA的大神已经为我们准备好了工具,root是利用了linux内核中的一个提权漏洞(CVE-2016-5195),其利用方式可以参考 CVE-2016-5195,使用这个工具编译出来的就是dirtycow了,当然也可以直接解压附件中的2016-Pilot-Root,里面已经带有编译好的dirtycow了。
工具中使用的root跟install的脚本都是使用OneClickInstall.sh的脚本,先来看一下root的部分做了什么东西,先来看一下用到的工具:
先从OneClickInstall.sh相关的部分:
1 | if [ $gotroot -gt 0 ]; then |
dirtycow就是漏洞的利用工具,su就不用多说了,主要的部分都集中在
1 | adb shell '/data/local/tmp/rootme/dirtycow /system/etc/factory_reset.sh /data/local/tmp/rootme/factory_reset_mod.sh' |
里。
这一句的目的是把factory_reset_mod.sh里的内容映射到/system/etc/factory_reset.sh里,使得只读权限提升为读写权限,利用到的就是上面的这个漏洞。因此执行完成后,就需要执行这个我们新植入的脚本,所以才需要执行恢复工厂设置的操作,而并非因为要清空什么数据还原什么数据。
当执行factory_reset时,就会执行到了factory_reset_mod.sh里的内容,而这个文件里的内容很简单,只是一个调用而已
1 |
|
也就是执行nefarious.sh
1 | #nefarious things |
这步比较简单,就是把su,busybox等工具都写进系统目录,完成这一步后,系统就算是完成root了。
install apks
root后就是如何安装应用了,事实上这车机本来就是支持安装的,但是为什么我们直接把apk下载下来是安装不了的呢?原因就是因为系统里有一个安装白名单的限制,目录在/data/system/whitelist.xml里,这个xml就定义了能够安装应用的一些信息,其中,比较重要的就是签名和包名,在安装时系统会使用这个文件去和将安装的apk进行对比,如果是在白名单里的才允许安装。
既然我们已经root了机头,即下一步就是把我们要装的应用信息写入到白名单里了。
先来看一下白名单里的结构。
1 | <application> |
我们需要添加一个安装信息,只需要获取到这${packageName}与${signInfo}就可以了。
获取包名很简单,直接使用aapt就可以了
1 | aapt d badging xx.apk|grep package |
如果要做成自动化,使用sed即可。
另外就是获取签名了,在附件提供的资源里,bin目录下有一个GetAndroidSig.jar的小工具就是用来读取签名信息的。
1 | java -jar GetAndroidSig.jar xx.apk |
得出类似
1 | Cert#: 0 Type:X.509 |
其中,To Char 字段即是我们要使用的签名信息。
既然已经拿到这两个信息,即就可以将包名与签名信息写入到whitelist.xml里,然后重新上传到车机的/data/system/whitelist.xml目录下就可以了。
这是XDA上提供脚本的一些原理解析,但事实上在我执行的过程中遇到了一些困难,一个原因是我使用的是mac,但很明显脚本里脚本的都是windows或者linux,虽然linux的脚本大部分都能跑,但跑到sed -r时,mac的就跪菜了,无奈之下我只有将-r去掉,但这样就无法达到分割字符串的效果了,虽然这样可以把脚本跑下去,但是是无补于是的,开始时我还不清楚这个白名单的数据格式,导致总是装不上,后来认真读了脚本后才整理出白名单的格式。
整理出格式后其实就没必要去跑脚本了(当然有脚本也是有好处的,起码可以自动化),将所有需要安装的apk信息都一次过写进去,然后推到车机系统上,然后剩下的事就是像正常android安装应用一样就行了。
需要注意的是,车机里提供了一个”Install APK”的一个应用,说可以从U盘或者根目录里安装应用,但由于刚刚的白名单限制,这点是不一定能够成功的(需要安装的应用不在名单里就废了),而且我至今都没找到所谓的“根目录”究竟指哪里。。。
车机可以直接连可以上网的wifi直接下载,也能从sdcard里安装,当把apk推上sdcard上后,就可以使用浏览器来运行执行安装
1 | file:///sdcard/xx.apk |
就能执行安装了。
附件的whitelist.xml里带了三个应用,车机版的高德,云音乐,和QQ影音。
需要说明一下的是为什么选择QQ影音,因为对于在视频播放这种软件,都会对GPU等有有一点要求,但明显,车机在这上面具备太多的优势,QQ影音在这方面个人觉得做得还算不错。
当然我们一般不这么做,因为adb install就能完成这系列的操作了,当然也能在push上去后执行pm install也能完成安装,困难总比办法多,事实上到这一步已经没什么困难了。
但不知道是传输介质有问题还是车机本身就慢,adb push 时传输的速度非常慢,慢得发指,可能在几十K一秒左右,传到一半断了就傻逼了。。。
总结
这次实操过程遇到了一些困难,大多是不了解原理,执行环境不一样导致的,但从原理上出发也没有十分困难的东西,这也多得雅阁来身限制不多,默认就开了调试模式,否则这些操作可能都比较麻烦,单是考虑怎么连接电脑跟车机就得好好想想了。
【参考】
https://github.com/jersacct/2016PilotOneClick
https://github.com/timwr/CVE-2016-5195