吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3069|回复: 2
收起左侧

[会员申请] 申请ID:cysin【申请通过】

[复制链接]
吾爱游客  发表于 2021-2-21 08:34
1.申请ID:cysin
2.个人邮箱:pecado@163.com
3.原创技术文章:本田车机破解分析记录
​​TL;DR1.本文是一篇尚未完成的分析记录。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提权,进而安装一些三方软件和对车机本身进行修改。按照文中所述,确实可以进入开发者模式,只是在进行点击操作时要快,若太慢不会生效。xda文中还提供了一个github仓库https://github.com/codeage/root-honda,除破解脚本之外还提供了一些apk(但是并没有提供源码)。另外,从这个github提供的信息获知,最早提供破解脚本的大概是https://github.com/jersacct/2016PilotOneClick,提权利用的是CVE-2016-5195Dirty 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信息:由于有泄漏的漏洞源码,所以分析起来容易很多。有以下几点:1.入口页面会进行判断选择加载,只有目标机器才会加载正确的js文件,相关代码如下:其中idvalue在不同浏览器特性下会有不同的值,决定了加载的js文件名。车机访问时:所以可以强制idvalue='id'2.script.js加载stage4.js时有一个trk参数,根据stage4_js.py:trk决定了aes密钥,可以强制trk='-213173581276'。实际上autohack并没有使用aes加密,所以这一步对autohack来说就关系不大。3.stage4.js中调用module.so时,根据具体实现不同,传入参数不同:vincicar:若trk传入不正确,则上图第一行32个字节为fake key,无法进行正确的aes解密。autohack: Screenshot from 2021-02-16 10-56-16.png
上图中key,agent,flags参数在首页:看到这里key其实是最早输入的auth code,不像是一个常规密钥,基本可以判定要么没加密,要么密钥hard code在module.so里。另外,这些参数应该最终都是字符串类型,因为js作为一个弱类型和脚本(文本)语言,很难搞一些其他类型的变量(不怎么做js,不知此观点是否正确)。4.通过分析js得知module.so的下载地址:vincicar: https://a2carf.vincicar.com/module.soautohack: http://www.autohack.cn/root/module.so直接思路就是写一个可执行文件调用这两个so文件,看一下实际会发生什么。由于有hacking team的源码,比较容易理解,module.so的主要工作就是创建socket连接通过http下载所需文件,执行exploit和安装apk。但由于以上这些测试并未按照漏洞被设计的流程来走,所以必须保证所有前序工作尽可能按照作者意图实现。首先确保传入的key是正确的。用Ghidra看一下这两个module.so,看看有没有什么幺蛾子。通过对比这两个文件对aes256_init的call graph,确定autohack并没有使用aes加密。左为vincicar,右为autohack为了确认key是正确的,写了一个简单的aes解密工具,用来测试key是否正确。代码在https://github.com/cysin/honda_hacking_analysis/tree/main/aes_decrypt看起来没问题。通过上文图中js代码传入的参数来看,vincicar的参数多为url,都是字符串类型,应该没什么特别。这里不用理会用png图片做的伪装,用urlrewrite即可实现。但是autohack的参数有一个flags=‘2’,为了避免掉入陷阱,需要看一下。用ghidra打开,看一下am_start函数:其中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即可进行编译:因为是测试分析,只要有安卓环境能够运行即可(实机测试过于危险),所以这里用了一个arm开发板(nanopi m4),刷成android:​连接PC,用adb将loader和对应的module.so传到开发板:执行loader: t1.jpg
由于运行环境并非真实的本田车机,所以可能会遇到一些错误。所有执行输出及结果已上传至github,可以在这里查看:
vincicar: https://github.com/cysin/honda_hacking_analysis/tree/main/module/vincicarautohack: https://github.com/cysin/honda_hacking_analysis/tree/main/module/autohackx.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.apkautohack:installer即为APK安装包首先安装APK逆向的两个主要工具,https://github.com/skylot/jadxhttps://ibotpeaches.github.io/Apktool/。jadx主要是用于反编译成阅读性更好的java,便于理解思路和寻找关键字,但是再recompile比较困难;apktool主要是反编译成smali,类似汇编的字节码,便于修改之后重新打包成可正常运行的apk文件。所以需要两个工具结合使用。用jadx将两个apk导出为gradle工程:vincicar:习惯性看一下src/main/res/values/strings.xml:只有短短几行,看来只是一个下载器,需要找到下载真正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,并启动:于是一目了然。vincicar是先访问https://carw.vincicar.com/vb/car/assistant_app_download?try_count=1&agent=official¶m=empty获取apk下载地址,再进行下载。原来jadx并未完全正确反编译vincicar.apk,仔细看上图输出error count为2,所以找不到此下载地址(从apktool反编译的smali文件中是可以找到的)。autohack:从src/main/res/values-zh-rCN/strings.xml看出这个apk直接就是最终应用。从反编译的代码里可以找到一些url连接:尝试浏览器访问http://www.autohack.cn/app/appstore.php?lang=zh,可以得到当前(20210216)最新版本的下载地址:http://www.autohack.cn/app/HondaHack-7.0.1-release.apk。修改binary破解方法:安装运行后发现一些功能无法使用,点击会有一些注册提示:尝试破解,用最简单的方法。首先从src/main/res/values-zh-rCN/strings.xml找到‘需要专业版’:其对应的name是'pro_function',从代码里找到包含pro_function的片段:打开C1320tb.java,定位到pro_function:从逻辑不难看出m5618a返回true,是已注册专业版,false则是未注册。但此时还无法判断m5618a是否就是唯一的检测函数,看一下代码里调用m5618a的地方:有很多,看一下其中的代码逻辑,基本符合先前的预测,那就修改一下,让m5618a永远返回true,再测试一下。用apktool反编译:下面是找到修改的位置。参考C1320tb.java中包含有一些固定字符串:可用'google.com'作为关键词搜索:然后打开./cn/autohack/hondahack/tb.smali,通过函数顺序,可以定位到m5618a函数对应的smali代码:由于是第一次接触smali,照葫芦画瓢,在函数一开始加入两行,给p0赋值0x01,然后返回p0。保存之后用apktool重新打包,并重新签名:总的来说smali字节码的修改要比修改二进制可执行文件简单的多,可直接插入新的代码而不用考虑原有代码的结构。重新安装之前需要卸载原来安装的版本,因为签名变了。重新安装后:(后记:此方法对于6.9.16版本是有效的,但apktool对于最新版7.0.1支持可能有问题,导致重新编译后的apk无法运行,可以用注册机的方法实现破解)注册机方法:点一个锁定功能会弹出注册窗口:随便输入一个注册码:根据注册时的错误提示,找到对应文本:​然后找到对应文件​打开AsyncTaskC1224e.java,定位到regkey_error:然后定位m5622c函数并打开相应的C1320tb.java文件:可以看到m5622c基本包含了主要的注册码算法,所有代码都在这一个文件里,并不是很复杂。分析过程不再赘述,其主要思路是:1.获取蓝牙MAC地址2.添加‘PREFIX-’前缀3.获取hash4.转换成HEX5.添加'google.com'前缀6.获取hash7.做一些运算后取高16位做判断同时可以得到注册码的格式为:XXXX-XXXX,其中前4个XXXX是用来做判断的。一个用C++写的简单的注册机代码已经上传至github仓库:https://github.com/cysin/honda_hacking_analysis/blob/main/apk/autohack_register/register.cpp其中machine code与上图中提示的设备ID一致,注册码只有前四位有用。将注册码填入:这里的APK破解,其实并不像想象中那样复杂,主要是:1.jadx生成了质量极高且可读性极好的代码2.APK并没有采用什么特殊的保护措施3.代码实现也并未做特殊的逻辑处理4.注册逻辑相对简单,没有联网处理若是加入了一些packer,反跟踪和混淆等手段,再去反编译和破解可能就没那么容易了。vincicar:用jadx解压之后就没几个文件,应该是用了一些保护手段,用apkid看一下:legu将主要字节码都保存在libshell-super.2019.so,用IDA看一下(ghidra的分析明显不如IDA更准确一些),基本确认了解密算法在sub_206D4: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漏洞的一个完整实战应用解析。很多时候无意打开一个网页,可能整个系统就无任何秘密可言。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2021-2-23 15:02
I D:cysin
邮箱:pecado@163.com

申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。
cysin 发表于 2021-3-30 09:19
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-3-29 09:14

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表