尝试Hack自己的车

背景

自从有了车之后生活方便了很多。我的车是 Lexus NX 300h,开起来没什么毛病,动力平顺且充沛,省油,行驶质感也不错。但是美中不足是车自带的导航不太好用,不支持 CarPlay。在 2019 款后雷克萨斯在国外的车都是自带 Carplay 的,并且放出了固件可以让 2018款的车升级支持 Carplay 的版本。见链接:https://camryupdate.home.blog/2019/08/26/carplay-update-files/

经过

根据文档,只要把固件下载下来放到U盘里,然后把U盘插到车机上,在车机上选择更新程序就能将固件刷入。但是这里有个问题是,提供的固件是供给北美市场的,和大陆市场的固件不一样。

我的车机的ID 17LDLMCN-EB02 而需要的车机ID为 17LDL1NA-EB02。根据各种信息都可以得知除了ID不一样其他的各种东西都是一模一样的。那么思路就变成了:可以把固件的信息修改了,欺骗程序使得把提供给美国市场的固件强刷入国内市场的车机么?

首先第一个想到的是修改文件名,把文件名从 17LDL1NA-EB02_1990.kwi 改成了 17LDLMCN-EB02_1990.kwi。这个非常简单估计不会成功,试了一下果然失败了。

然后就想到能不能通过修改固件来实现,于是我用 HEX 编辑器打开了固件文件(使用的 Hex 编辑器是Mac下的 Hex Fiend),结果第一行就看到:

果断修改之,然后扔到了U盘里又试了一次,结果又失败了,提示“新软件与系统不兼容”。

不过这也算是一个进步,遂猜想应该是固件里内置了什么 checksum 之类的东西,需要通过升级软件的校验才能开始刷机。校验首先猜的是会不会在固件最后append了几个字节,于是尝试了 sha256、md5、crc32,都不对。

忽然想到了下载的文件里有好几个固件应对不同的机型的,会不会其实那个里面的机型中也有只改了ID其他都不变的固件呢?

果然 17LDL1NA-EB02_1990.kwi 和 17LDL1NA-EB42_1990.kwi 文件大小都是一样的,非常有可能是这样。

所以我用下面的命令给这两个文件做了比较

$ xxd 17LDL1NA-EB02_1990.kwi EB02.hex && xxd 17LDL1NA-EB42_1990.kwi EB42.hex && diff EB02.hex EB42.hex

结果是这样的

所以我们锁定了offset 从 1771 开始的 256bytes 分别为

9D212608 2ABFF029 B3FD68F7 45257806 B8DEFE33 AA21AB09 4501A576 AE0BBB3E EE3DDB84 EC23E1D5 DDC9663B 2DED0343 785E8BED 3CBF8A64 A20B7413 3A7EFA35 43DA6A79 918BD013 D76CDB5E B705B8BC AD052E1A 0FAD812A DC716337 332829EF 4E23203D B897EE0E 247E84A0 0772CE9A 84F0A0BF F5BBBC11 5F40A535 FBEEBBD4 8854E76E 772F2DAC CB2E8304 14FE79D1 F1A18DB2 1E9DBE96 3830F8A0 A244DF8F 6F43BAA8 C1C4A298 B8F35970 B4985F2A 3DFC7608 0191958A 2C86A9C9 2B6CF678 C4585F0A 52BD417B 6058E94A 7EF3CCCC 434B02BF DBB6FFBC 9B3B4476 4AFCE56A F622EC41 6E0162B6 797B4539 D860CB17 DBD74308 7F9C88BE F0281F62 7A1B654F

063F105A FBA80CA2 51195DFC DCD99632 B5E91529 EB52FB08 860271B6 AA1ADB7E 26639C3D 48A7E3E6 E2A309B0 99666E4C 987E0119 90C63BAE D6B4FA1A 697B2C08 92015F0C B751BEA9 25ACB0A6 15549E6F F2E27F14 9D669391 66A17832 6D033E1E 5E43E333 8886B804 179F15AF 33360DFA 4530AE28 FFE7FF34 24EE6D60 FEF5C6E6 F94C2BE9 69B610EB FBE932E1 C0FCBBCF A12CE1C1 86F48256 3EED271F A65A3C6B 8FCDFB20 7AFE9240 3CE6BF1A 9BCBF61E 43D98530 24D1A8F2 10F12A91 F1629F24 EA44C87E DF638378 9B361321 62EFB8A9 04D5F90D EA4DC405 94D10CD4 BABBFE99 F463A22A ADFE4C7A 37DEC566 FBFFA9AE E4C2DCEF B45FE8F3 7E8AB970 9C467C7F

对比后虽然只改了两个字符,但是这一串就比较离散,很有可能是某一种hash,不过我暂时想不到一个可以生成这么长hash的算法,或者是某几个hash的合并。也有可能是一种签名。不过如果是签名的话,没有私钥基本上就没有办法了。

过程大概就到这里,目前可以确定的是,只要能够将这个 256byte 替换成正确的值,那么理论上强刷就不会有问题。

后记

这里给出过程是希望抛砖引玉,没有什么技术含量,主要是给其他人一些参考。虽然最后也没有成功但是折腾的过程还是很开心的。另外刷机有风险,尤其是汽车这样的东西……

淘宝上有那种汉化中东版车机的服务,原理应该是拆了芯片欺骗程序然后强刷的国行固件。反过来这个应该可以用于国行强刷海外固件。不过要拆芯片,有可能会降低系统稳定性所以我暂时不考虑这个方案。

另外虽然支持了 CarPlay 但是还是需要插着 USB 线才可以使用,如果有非常想要 CarPlay 功能的车友也可以考虑在淘宝上购买第三方的加装车机,提供了无线的CarPlay。成本大概在 2k+。缺点是需要装额外的车机以及没有那么原生。

还有是腾讯科恩实验室发现了一个蓝牙的bug成功刷入了恶意固件,详情见 https://keenlab.tencent.com/zh/2020/03/30/Tencent-Keen-Security-Lab-Experimental-Security-Assessment-on-Lexus-Cars/

其中提到了

逆向uCOM固件及其固件更新逻辑,我们能够将一个恶意固件重新刷写到uCOM电路板模块中

可能意味着这个固件的更新逻辑没有我想象的那么复杂。不过能力有限,就先不继续探索了。

在2021年他们按照流程公布完整技术报告的时候可能就有非常多有价值的信息可以使用了。

也许丰田会在提供补丁的时候顺便给了新的系统?(做梦=。=)