长安车机ota包解密
唉,一言难尽,我的车车CS75P 二代车机系统终于更新了,上了高德新版, 有了红绿灯倒计时,福音呀,盼了很久,终于更新了。
我就想着将OTA包里面的apk,直接提取出来,升级就行了,不需要更新车机系统了,结果失败!
拿到了心心念的OTA升级包,一打开。
哦豁~~~~
它竟然做了加密的,,,好惨
我就想着,既然这里做了加密,那么车机系统在拿到包后,肯定也需要进行解密才能去安装呀,于似乎带着好奇去看了看
0x1 获取升级apk
在车机交流群里面,顺利拿到了负责车机升级的apk,拖进jadx 里面,找关键字,HuOs
还真找到了。
这不就是我升级的路径,和包格式嘛 .zip
跟着调用栈一路静态分析,结果追到了解密方法:
这里发现 包被进行了 “AES/CBC/PKCS5Padding” 的加密,车机系统拿到文件,进行解密后,再安装
0x2 获取解密Key
又上一个步骤发现,是通过获取 “/system/bin/sd_ivi_data/ckey” 的值,
然后使用 未宸 解密,对这个文件进行解密,获取前16 字节,作为系统包的aes key
想要解密这个就得两个步骤:
1、获取到这个ckey 这个文件 (万能的车友群 把文件给了我)
2、拿到 whiteBox.decrypt 的代码实现逻辑 (万能的车友群 把文件给了我)
步骤2 走了一些弯路
起初以为 whiteBox.decrypt 这个代码的实现是放在 boot-framework.vdex 、最后通过搜索,发现是放在
boot-ext.vdex 里面的。
这里就需要使用两个工具
- vdex 转为cdex
- 再将 cdex 转为dex
最终打开,
解密方法则是将 文件的值,与一个key ,进到native 里面 计算出来
那么我们还需要获取到这个token :
0x3 获取解密Key的解密token
通过静态分析,获取token的 通过获取升级 apk 下的一些文件值,在native 里面进行判断,最后返回出结果。
起初,我以为需要在native 里面进行计算,最后反编译进去一看,,
这…… 好家伙只是将获取的数据进行了对比,然后直接返回token, 想复杂了。。。。
1 | int __fastcall Java_com_weichen_whitebox_encrytion_WhiteBoxNativeImpl_connectionToNativeVerifyDigest(JNIEnv *a1, int a2, int a3, size_t a4, int a5, int a6, size_t a7, int a8, int a9, int a10, int a11) |
0x4 解密Key
前面既然已经拿到了 token ,那我们直接使用Unidbg 将 token 值,和ckey 的值传入,计算出结果即可
1 | public byte[] key() { |
0x5 解密
拿到key 了,返回第一步,使用AES/CBC/PKCS5Padding 解密,获得ota包
然后使用 开源工具
payload-dumper-go 将 payload.bin 提取出 system.img 即可:
就拿到了 高德地图
0x6 总结
整体弄下来,花了一下午的时间,最开始想的太难了,动手起来,多亏了 万能的车群 提供了相应的文件进行分析,万事开头难,做起来就顺了。
整体分析难道不大,都是一些基础的调用,和简单的知识点结合就行。