本田车机破解分析记录

查看 105|回复 11
作者:cysin   
TL;DR
1.本文是一篇尚未完成的分析记录。
2.本文算是一个备忘,主要是为了以后需要时可以方便的查阅,无他。
3.发到这里只是想找一个相对稳定的地方保存一下,无他。
4.本文仅是针对本田车机破解所做的一些分析和记录,并无创新。
5.逆向和安全方面并非专业,也从未有深入研究,可能有不准确的地方。
6.https://github.com/cysin/honda_hacking_analysis是分析时做的一些记录和相关代码。7.https://cysin.github.io/honda_hacking_analysis/ 本田黑科技在线注册码生成器。
起因
在网上偶然看到https://forum.xda-developers.com/t/guide-how-to-enter-developer-mode-on-2017-honda-civic-and-now-root-install-apps.3621582/,大义是目前相当一部分本田车型的车机都是基于安卓开发的系统,可以通过一些默认操作进入开发者模式,改变usb传输方向,进而可以利用某些漏洞进行root提权,进而安装一些三方软件和对车机本身进行修改。


Screenshot from 2021-02-16 07-47-02.png (122.67 KB, 下载次数: 0)
下载附件
2021-2-23 21:10 上传

按照文中所述,确实可以进入开发者模式,只是在进行点击操作时要快,若太慢不会生效:


16.jpg (14.85 KB, 下载次数: 1)
下载附件
2021-2-23 21:37 上传



15.jpg (12.58 KB, 下载次数: 0)
下载附件
2021-2-23 21:37 上传

xda文中还提供了一个github仓库https://github.com/codeage/root-honda,除破解脚本之外还提供了一些apk(但是并没有提供源码)。另外,从这个github提供的信息获知,最早提供破解脚本的大概是https://github.com/jersacct/2016PilotOneClick,提权利用的是CVE-2016-5195(Dirty copy-on-write)漏洞,相关代码实现https://github.com/timwr/CVE-2016-5195。由于这些代码和不开源的软件包可能会对系统造成不可逆修改,未进行实机测试。
线索
去某宝搜了一下,不出所料,主要有两家**奇小助手和**黑科技(以下分别简称vincicar和autohack),百十块钱便可进行网页远程破解。应该是利用了浏览器的漏洞获取了userland exploit并进行kernel exploit进而安装apk。在安卓4.2的年代,webkit简直就是直接奔向exploit的康庄大道。
对这些商家提供的网页大体看了一下,通过关键字等很容易就定位到两家都是通过几年前hacking team事件泄漏的代码:
https://github.com/hackedteam/vector-exploit/tree/master/src/ht-webkit-Android4-src
对于这个漏洞的描述,代码中有几幅手写图例:
https://github.com/hackedteam/vector-exploit/tree/master/src/ht-webkit-Android4-src/docs
另外还有这里的分析:
https://security.tencent.com/index.php/blog/msg/87
分析
理论到实践是完全两个不同的过程,而对于目前已经商用的不错的案例来说肯定是值得借鉴和学习的。这里主要谈一下应用阶段。由于需要通过http进行分析,所以尽可能的模拟实机访问,防止掉入一些可能被设计的坑里。将车机连入热点,访问一个简单的php脚本,提取车机访问的header信息:


17.jpg (13.54 KB, 下载次数: 0)
下载附件
2021-2-23 21:37 上传

由于有泄漏的漏洞源码,所以分析起来容易很多。有以下几点:
1.入口页面会进行判断选择加载,只有目标机器才会加载正确的js文件,相关代码如下:
https://github.com/hackedteam/vector-exploit/blob/master/src/ht-webkit-Android4-src/src/go.js#L40


Screenshot from 2021-02-16 09-28-18.png (63.4 KB, 下载次数: 0)
下载附件
2021-2-23 21:09 上传

其中idvalue在不同浏览器特性下会有不同的值,决定了加载的js文件名。车机访问时:


Screenshot from 2021-02-16 09-55-17.png (141.6 KB, 下载次数: 0)
下载附件
2021-2-23 21:09 上传

所以可以强制idvalue='id'
2.script.js中:
https://github.com/hackedteam/vector-exploit/blob/master/src/ht-webkit-Android4-src/src/script.js#L2051


Screenshot from 2021-02-16 09-59-23.png (49.65 KB, 下载次数: 0)
下载附件
2021-2-23 21:11 上传

加载stage4.js时有一个trk参数,根据stage4_js.py:
https://github.com/hackedteam/vector-exploit/blob/master/src/ht-webkit-Android4-src/src/stage4_js.py#L14


Screenshot from 2021-02-16 10-02-15.png (53.14 KB, 下载次数: 0)
下载附件
2021-2-23 21:12 上传

trk决定了aes密钥,可以强制trk='-213173581276'。实际上autohack并没有使用aes加密,所以这一步对autohack来说就关系不大。
3.stage4.js中调用module.so时,根据具体实现不同,传入参数不同:
https://github.com/hackedteam/vector-exploit/blob/master/src/ht-webkit-Android4-src/src/stage4.js#L125
vincicar:


Screenshot from 2021-02-16 10-54-20.png (84.66 KB, 下载次数: 0)
下载附件
2021-2-23 21:13 上传

若trk传入不正确,则上图第一行32个字节为fake key,无法进行正确的aes解密。
autohack:


Screenshot from 2021-02-16 10-56-16.png (23.88 KB, 下载次数: 0)
下载附件
2021-2-23 21:14 上传

上图中key,agent,flags参数在首页:


Screenshot from 2021-02-16 10-59-14.png (5.31 KB, 下载次数: 0)
下载附件
2021-2-23 21:14 上传

看到这里key其实是最早输入的auth code,不像是一个常规密钥,基本可以判定要么没加密,要么密钥hard code在module.so里。另外,这些参数应该最终都是字符串类型,因为js作为一个弱类型和脚本(文本)语言,很难搞一些其他类型的变量(不怎么做js,不知此观点是否正确)。
4.通过分析js得知module.so的下载地址:
vincicar: https://a2carf.vincicar.com/module.so
autohack: http://www.autohack.cn/root/module.so
直接思路就是写一个可执行文件调用这两个so文件,看一下实际会发生什么。由于有hacking team的源码,比较容易理解,module.so的主要工作就是创建socket连接通过http下载所需文件,执行exploit和安装apk。但由于以上这些测试并未按照漏洞被设计的流程来走,所以必须保证所有前序工作尽可能按照作者意图实现。
首先确保传入的key是正确的。用Ghidra(https://ghidra-sre.org/)看一下这两个module.so,看看有没有什么幺蛾子。通过对比这两个文件对aes256_init的call graph,确定autohack并没有使用aes加密。


b.jpg (10.62 KB, 下载次数: 0)
下载附件
2021-2-23 21:15 上传

左为vincicar,右为autohack
为了确认key是正确的,写了一个简单的aes解密工具,用来测试key是否正确。代码在https://github.com/cysin/honda_hacking_analysis/tree/main/aes_decrypt


Screenshot from 2021-02-16 13-28-41.png (31.2 KB, 下载次数: 0)
下载附件
2021-2-23 21:16 上传

看起来没问题。通过上文图中js代码传入的参数来看,vincicar的参数多为url,都是字符串类型,应该没什么特别。这里不用理会用png图片做的伪装,用urlrewrite即可实现。但是autohack的参数有一个flags=‘2’,为了避免掉入陷阱,需要看一下。用ghidra打开,看一下am_start函数:


Screenshot from 2021-02-16 13-32-33.png (71.34 KB, 下载次数: 0)
下载附件
2021-2-23 21:16 上传

其中DAT_00019004应该是传入的struct,DAT_00019004+0x400是struct的第五个参数,也就是flags;access是判断是否存在su文件。所以这里是判断有没有su文件,有的话才继续进行后续下载和其他操作。但是这个flags如果等于1的话,则忽略检查,强制进行后续工作。所以flags并没有什么特殊含义。
通过ghidra看了一下基本确认没有啥太大问题的话,接下来模拟module.so的调用执行。
首先安装ndk,可通过https://developer.android.com/ndk/downloads下载或通过android studio安装。下载临时编写的动态库调用代码https://github.com/cysin/honda_hacking_analysis/tree/main/loader,执行build.sh即可进行编译:


Screenshot from 2021-02-16 14-06-27.png (108.66 KB, 下载次数: 0)
下载附件
2021-2-23 21:18 上传

因为是测试分析,只要有安卓环境能够运行即可(实机测试过于危险),所以这里用了一个arm开发板(nanopi m4),刷成android:


aa.jpg (16.52 KB, 下载次数: 0)
下载附件
2021-2-23 21:18 上传

​连接PC,用adb将loader和对应的module.so传到开发板:


Screenshot from 2021-02-16 13-58-32.png (41.77 KB, 下载次数: 0)
下载附件
2021-2-23 21:19 上传

执行loader:


Screenshot from 2021-02-16 14-01-03.png (129.24 KB, 下载次数: 0)
下载附件
2021-2-23 21:19 上传

由于运行环境并非真实的本田车机,所以可能会遇到一些错误。所有执行输出及结果已上传至github,可以在这里查看:
vincicar: https://github.com/cysin/honda_hacking_analysis/tree/main/module/vincicar
autohack: https://github.com/cysin/honda_hacking_analysis/tree/main/module/autohack
x.log是module.so的日志输出,记录了下载了哪些东西。
由于所有的操作由module.so发起,所以只能结合x.log(看system调用)和其下载的脚本看个大概:
vincicar: crack为处理脚本,logo.png和getcrack均为exploit,logo2.png是一个重启脚本,logo4.png是一个zip包,包含busybox,su,下载器的apk等。其中crack是exploit提权之后做的一些处理,主要是解压logo4.png的zip包,重新mount文件系统为可写,拷贝busybox,su到系统目录,备份一些文件,更新白名单,删除友商已下载apk,安装下载器的apk等。
autohack:exploit.sh为处理脚本,主要思路基本差不多,重新mount文件系统,拷贝busybox,su等,另外还会再下载一个install.sh(http://47.75.14.109/root/install.php?key=0946993636)脚本,这样做主要是为了方便随时更新吧。install.sh主要是更新白名单,安装最终的apk等。
这里重点关注一下两个exploit的实现,通过用ghidra查看以及相关关键字,猜测vincicar和autohack分别用的是:
https://github.com/timwr/CVE-2013-6282
https://github.com/android-rooting-tools/android_run_root_shell
APK分析
上述两个module.so下载的文件中,已经包含了相应的APK文件:
vincicar:logo4.png为zip包,解开之后包含vincicar.apk
autohack:installer即为APK安装包
首先安装APK逆向的两个主要工具,https://github.com/skylot/jadx和https://ibotpeaches.github.io/Apktool/。jadx主要是用于反编译成阅读性更好的java,便于理解思路和寻找关键字,但是再recompile比较困难;apktool主要是反编译成smali,类似汇编的字节码,便于修改之后重新打包成可正常运行的apk文件。所以需要两个工具结合使用。
用jadx将两个apk导出为gradle工程:


Screenshot from 2021-02-16 19-03-21.png (24.86 KB, 下载次数: 0)
下载附件
2021-2-23 21:22 上传

vincicar:
习惯性看一下src/main/res/values/strings.xml:


Screenshot from 2021-02-16 19-08-09.png (70.53 KB, 下载次数: 0)
下载附件
2021-2-23 21:23 上传

只有短短几行,看来只是一个下载器,需要找到下载真正apk的地址。但是用grep甚至是正则去找可能的下载地址字符串,都没有结果。把module.so下载的一堆文件翻了个遍也没有结果。难道是用了字符拼接或者ascii码防止逆向?或者是把url加密保存在系统里?把jadx导出的文件基本看了个遍也没有任何线索(事后证明想多了,这只是jadx的坑)。唯有把这个apk装上,做一下网络的traffic monitor看一下到底访问了什么地址。
运行pip install mitmproxy,安装mitmproxy(代{过}{滤}理机器要开启相应端口或关闭防火墙),启动:
mitmproxy --listen-host 192.168.0.130 --listen-port 8080
将目标机器的网络代{过}{滤}理设置成192.168.0.130:8080,先用浏览器访问mitm.it,安装证书,否则无法监听https。然后安装vincicar.apk,并启动:


Screenshot from 2021-02-16 21-11-38.png (49.54 KB, 下载次数: 0)
下载附件
2021-2-23 21:23 上传

于是一目了然。vincicar是先访问https://carw.vincicar.com/vb/car/assistant_app_download?try_count=1&agent=official&param=empty获取apk下载地址,再进行下载。原来jadx并未完全正确反编译vincicar.apk,仔细看上图输出error count为2,所以找不到此下载地址(从apktool反编译的smali文件中是可以找到的)。
autohack:
从src/main/res/values-zh-rCN/strings.xml看出这个apk直接就是最终应用。从反编译的代码里可以找到一些url连接:


Screenshot from 2021-02-16 21-32-34.png (49.48 KB, 下载次数: 0)
下载附件
2021-2-23 21:24 上传

尝试浏览器访问http://www.autohack.cn/app/appstore.php?lang=zh,可以得到当前(20210216)最新版本的下载地址:http://www.autohack.cn/app/HondaHack-7.0.1-release.apk。
修改binary破解方法:
安装运行后发现一些功能无法使用,点击会有一些注册提示:


11.jpg (26.58 KB, 下载次数: 0)
下载附件
2021-2-23 21:25 上传

尝试破解,用最简单的方法。首先从src/main/res/values-zh-rCN/strings.xml找到‘需要专业版’:


Screenshot from 2021-02-16 21-50-10.png (26.2 KB, 下载次数: 0)
下载附件
2021-2-23 21:25 上传

其对应的name是'pro_function',从代码里找到包含pro_function的片段:


Screenshot from 2021-02-16 21-53-24.png (45.65 KB, 下载次数: 0)
下载附件
2021-2-23 21:26 上传

打开C1320tb.java,定位到pro_function:


Screenshot from 2021-02-16 21-56-13.png (42.33 KB, 下载次数: 0)
下载附件
2021-2-23 21:26 上传

从逻辑不难看出m5618a返回true,是已注册专业版,false则是未注册。但此时还无法判断m5618a是否就是唯一的检测函数,看一下代码里调用m5618a的地方:


Screenshot from 2021-02-16 22-01-52.png (190.19 KB, 下载次数: 0)
下载附件
2021-2-23 21:26 上传

有很多,看一下其中的代码逻辑,基本符合先前的预测,那就修改一下,让m5618a永远返回true,再测试一下。
用apktool反编译:


Screenshot from 2021-02-16 22-20-44.png (38.35 KB, 下载次数: 0)
下载附件
2021-2-23 21:27 上传

下面是找到修改的位置。参考C1320tb.java中包含有一些固定字符串:


Screenshot from 2021-02-16 22-23-02.png (20.26 KB, 下载次数: 0)
下载附件
2021-2-23 21:28 上传

可用'google.com'作为关键词搜索:


Screenshot from 2021-02-16 22-23-49.png (7.81 KB, 下载次数: 0)
下载附件
2021-2-23 21:28 上传

然后打开./cn/autohack/hondahack/tb.smali,通过函数顺序,可以定位到m5618a函数对应的smali代码:


Screenshot from 2021-02-16 22-26-51.png (42.47 KB, 下载次数: 0)
下载附件
2021-2-23 21:29 上传

由于是第一次接触smali,照葫芦画瓢,在函数一开始加入两行,给p0赋值0x01,然后返回p0。保存之后用apktool重新打包,并重新签名:


Screenshot from 2021-02-16 22-39-02.png (112.48 KB, 下载次数: 0)
下载附件
2021-2-23 21:19 上传

总的来说smali字节码的修改要比修改二进制可执行文件简单的多,可直接插入新的代码而不用考虑原有代码的结构。重新安装之前需要卸载原来安装的版本,因为签名变了。重新安装后:


12.jpg (17.15 KB, 下载次数: 0)
下载附件
2021-2-23 21:30 上传

(后记:此方法对于6.9.16版本是有效的,但apktool对于最新版7.0.1支持可能有问题,导致重新编译后的apk无法运行,可以用注册机的方法实现破解)
注册机方法:
点一个锁定功能会弹出注册窗口:


14.jpg (10.86 KB, 下载次数: 0)
下载附件
2021-2-23 21:31 上传

随便输入一个注册码:


13.jpg (8.11 KB, 下载次数: 0)
下载附件
2021-2-23 21:31 上传

根据注册时的错误提示,找到对应文本:


Screenshot from 2021-02-17 07-37-00.png (22.57 KB, 下载次数: 0)
下载附件
2021-2-23 21:32 上传

​然后找到对应文件:


Screenshot from 2021-02-17 07-38-33.png (46.21 KB, 下载次数: 0)
下载附件
2021-2-23 21:32 上传

​打开AsyncTaskC1224e.java,定位到regkey_error:


Screenshot from 2021-02-17 07-41-16.png (18.3 KB, 下载次数: 0)
下载附件
2021-2-23 21:32 上传

然后定位m5622c函数并打开相应的C1320tb.java文件:


Screenshot from 2021-02-17 07-43-52.png (65.98 KB, 下载次数: 0)
下载附件
2021-2-23 21:33 上传

可以看到m5622c基本包含了主要的注册码算法,所有代码都在这一个文件里,并不是很复杂。分析过程不再赘述,其主要思路是:
1.获取蓝牙MAC地址
2.添加‘PREFIX-’前缀
3.获取hash
4.转换成HEX
5.添加'google.com'前缀
6.获取hash
7.做一些运算后取高16位做判断
同时可以得到注册码的格式为:XXXX-XXXX,其中前4个XXXX是用来做判断的。一个用C++写的简单的注册机代码已经上传至github仓库:
https://github.com/cysin/honda_hacking_analysis/blob/main/apk/autohack_register/register.cpp


Screenshot from 2021-02-17 09-03-14.png (19.48 KB, 下载次数: 0)
下载附件
2021-2-23 21:33 上传

其中machine code与上图中提示的设备ID一致,注册码只有前四位有用。将注册码填入:


18.jpg (23.14 KB, 下载次数: 0)
下载附件
2021-2-23 21:34 上传

这里的APK破解,其实并不像想象中那样复杂,主要是:
1.jadx生成了质量极高且可读性极好的代码
2.APK并没有采用什么特殊的保护措施
3.代码实现也并未做特殊的逻辑处理
4.注册逻辑相对简单,没有联网处理
若是加入了一些packer,反跟踪和混淆等手段,再去反编译和破解可能就没那么容易了。
vincicar:
用jadx解压之后就没几个文件,应该是用了一些保护手段,用apkid看一下:


Screenshot from 2021-02-18 09-45-18.png (33.75 KB, 下载次数: 0)
下载附件
2021-2-23 21:34 上传

legu将主要字节码都保存在libshell-super.2019.so,用IDA看一下(ghidra的分析明显不如IDA更准确一些),基本确认了解密算法在sub_206D4:


Screenshot from 2021-02-18 09-52-36.png (24.01 KB, 下载次数: 0)
下载附件
2021-2-23 21:35 上传

sub_28960是根据tosversion的前16字节与固定密码'^o0o7Ql]M8Y5:+1m~nTcA&3a7|?GB1z@'做一些运算得到(可能的)密钥,sub_2AB7C则是具体的解密部分。解密之后再用NRV解压缩。由于时间关系,脱壳就没有继续研究。关于legu网上有一些不错的相关资源,看起来不算特别复杂:
https://blog.quarkslab.com/a-glimpse-into-tencents-legu-packer.html
https://github.com/quarkslab/legu_unpacker_2019
小结
1.如果只是在车机里安装导航等其他软件,那么root之后就可以了。
2.商业软件对车机系统的修改是不可逆的,并非如商家所说车机有一套完整的备份,可以随时恢复。车企没有必要也没有良心再花成本做一个完整的备份。
3.个人不会在车机上使用这些商业性质的破解,毕竟行车安全第一。
4.对车机功能的修改和破解,等以后有时间再做分析罢。实际上这反而是整个过程最简单的部分。
5.安全无小事。如文中所述,是hacking team的webkit漏洞的一个完整实战应用解析。很多时候无意打开一个网页,可能整个系统就无任何秘密可言。

下载次数, 下载附件

zc1313113   

大佬666,C++简易注 册那里,是要在   cerr << argv[0] << " xx:xx:xx:xx:xx:xx (bluetooth mac address)",这一行填入,蓝牙MAC地址;然后在   cout << setw (20) << "machine code: " << ahex << endl; 这一行,填入机器码。运行就能返回注 册码么?
又菜又很爱玩   

感谢楼主无私分享,作为本田车主,既不想花大价钱更换新的车机,某宝搞的破解办法还收费,终于找到了友情分享的根据地,也感谢52破解提供这个平台,回头也整整这破解试试
cysin
OP
  

不通过好像无法编辑。如何编辑排版和删除无用图片?
mdx005   

感谢大神的分享,好精彩的分析过程
sic5s   

好像奥德赛DA屏无戏
ibetawang   

后排围观,以前用过黑科技的破解版,联网就会被锁软件
optimismsj   

确实啊!主机安全第一位的!谢谢楼主!
ph1999   

看看就好,自身安全的东西不能乱调
伯牙   

楼主思路可以,现在玩电动车更爽,特别是造车新势力的车机,配置高多了,更好玩。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部