21款凯美瑞车机系统升级包分析

系统环境:Ubuntu(优麒麟 22.04 LTS)+VMware_17.5.0

用到的工具:CRC32、android-sdk-libsparse-utils,安装方法

sudo apt update
sudo apt install android-sdk-libsparse-utils
sudo apt install libarchive-zip-perl

目录结构:文件夹内是处理后的IMG镜像,为 RPG格式,根目录下的VER是校验文件

2024/07/27  15:04    <DIR>          .
2024/07/27  15:04    <DIR>          ..
2022/12/02  11:08    <DIR>          BOOT
2022/12/02  11:08    <DIR>          GPS
2022/12/02  11:09    <DIR>          HIBENDIR
2024/07/27  15:05               188 HIBENDIR.VER
2024/07/27  15:05               188 PJ190BOT.VER
2024/07/27  15:05               188 PJ190DAT_0.VER
2024/07/27  15:05               188 PJ190ERY.VER
2022/12/02  11:01               188 PJ190GPS.VER
2024/07/27  15:05               188 PJ190PLT.VER
2024/07/27  15:05               188 PJ190REC.VER
2024/07/27  15:05               188 PJ190UPI.VER
2024/07/27  15:05               188 PJ190WAM_0.VER
2024/07/27  15:04    <DIR>          PLATFORM
2022/12/02  11:08    <DIR>          RECOVERY
2022/12/02  11:08    <DIR>          RECOVERYEASY
2022/12/02  11:08    <DIR>          SNAPSHOT
2024/07/27  15:05               188 SNAPSHOT_0.VER
2022/12/02  11:08    <DIR>          USERAPI
2022/12/02  11:08    <DIR>          USERDATA
2022/12/02  11:09    <DIR>          WAM

注意,以下3-5步的文件大小(十六进制)和CRC32的校验数据,均需大小端转换,如"12 34",则转换为"34 12",具体转换方法已包含在代码内

1.PRG转IMG,以system分区为例,RPG去掉头部512个字节即为IMG(压缩版),使用simg2img将IMG(压缩版)转换为IMG.ext4(未压缩版),其中IMG.ext4(未压缩版)可以直接挂载修改

dd if="PJ190PLT.PRG" of="PJ190PLT.IMG" bs=512 skip=1
sudo simg2img PJ190PLT.IMG PJ190PLT.IMG.ext4

2.IMG.ext4(未压缩版)转IMG(压缩版)

sudo img2simg "PJ190PLT.IMG.ext4"  "PJ190PLT.IMG"

3.IMG转RPG

固定值"A55A5AA5"+

IMG(压缩版)的文件大小(十六进制)+

IMG.ext4(未压缩版)的CRC32校验数据+

原RPG文件对应位置的的36个字节+

IMG.ext4(压缩版)的CRC32校验数据+

原RPG文件对应位置的的460个字节

,共计512字节

用上面的512字节+IMG.ext4(压缩版),合并为新的RPG,代码如下

#! /bin/bash 

originalPRGFile="PJ190PLT.PRG"
imgToMakePRG="PJ190PLT.IMG"


dd if=$originalPRGFile of=originalPRGFile.header1 bs=4 skip=3 count=9
dd if=$originalPRGFile of=originalPRGFile.header2 bs=4 skip=13 count=115

SIZE="$(stat -c%s ${imgToMakePRG})"
echo "${imgToMakePRG} size is: $SIZE"

#We have to swap the hex values from big endian to little endian cause the NEX is arm.
UNSWAPPEDHEXSIZE="$(printf '%x\n' $SIZE)"
vSIZE="$UNSWAPPEDHEXSIZE"
SWAPPEDHEXSIZE="${vSIZE:6:2}${vSIZE:4:2}${vSIZE:2:2}${vSIZE:0:2}"
LEN=$(echo ${#SWAPPEDHEXSIZE})
if [ $LEN -eq 6 ]; then
      SWAPPEDHEXSIZE=${SWAPPEDHEXSIZE}00
fi

UNSWAPPEDHEXCRC="$(crc32 ${imgToMakePRG}.ext4)"
vCRC="$UNSWAPPEDHEXCRC"
SWAPPEDHEXCRC="${vCRC:6:2}${vCRC:4:2}${vCRC:2:2}${vCRC:0:2}"

echo "${imgToMakePRG} Unswapped size hex is: $UNSWAPPEDHEXSIZE"
echo "${imgToMakePRG} Swapped size hex is: $SWAPPEDHEXSIZE"
echo "${imgToMakePRG}.ext4 Unswapped crc hex is: $UNSWAPPEDHEXCRC"
echo "${imgToMakePRG}.ext4 Swapped crc hex is: $SWAPPEDHEXCRC"

#create new header
perl -e "print pack 'H*', 'A55A5AA5${SWAPPEDHEXSIZE}${SWAPPEDHEXCRC}'" > firstheaderhalf.header1

UNSWAPPEDHEXCRC="$(crc32 ${imgToMakePRG})"
vCRC="$UNSWAPPEDHEXCRC"
SWAPPEDHEXCRC="${vCRC:6:2}${vCRC:4:2}${vCRC:2:2}${vCRC:0:2}"
echo "${imgToMakePRG}.ext4 Unswapped crc hex is: $UNSWAPPEDHEXCRC"
echo "${imgToMakePRG}.ext4 Swapped crc hex is: $SWAPPEDHEXCRC"

perl -e "print pack 'H*', '${SWAPPEDHEXCRC}'" > firstheaderhalf.header2
cat firstheaderhalf.header1 originalPRGFile.header1 firstheaderhalf.header2 originalPRGFile.header2 "$imgToMakePRG" > "$originalPRGFile.new"
rm -rf firstheaderhalf.header1
rm -rf firstheaderhalf.header2
rm -rf originalPRGFile.header1
rm -rf originalPRGFile.header2
rm -rf "$originalPRGFile"
mv "$originalPRGFile.new" "$originalPRGFile"

4.RPG生成VER校验数据

part1:原VER文件的前172字节(包含文件名、版本号等信息)+RPG文件的大小信息(十六进制)+RPG文件的CRC32校验

part2:part1的CRC32校验

新VER:part1+part2

#! /bin/bash

originalVerFile="PJ190PLT.VER"
prgFile="PJ190PLT.PRG"

dd if="$originalVerFile" of="$originalVerFile.part1" bs=172 skip=0 count=1

SIZE="$(stat -c%s $prgFile)"
echo "$prgFile size is: $SIZE"
UNSWAPPEDHEXSIZE="$(printf '%x\n' $SIZE)"
vSIZE="$UNSWAPPEDHEXSIZE"
SWAPPEDHEXSIZE="${vSIZE:6:2}${vSIZE:4:2}${vSIZE:2:2}${vSIZE:0:2}"
LEN=$(echo ${#SWAPPEDHEXSIZE})
if [ $LEN -eq 6 ]; then
      SWAPPEDHEXSIZE=${SWAPPEDHEXSIZE}00
fi
UNSWAPPEDHEXCRC="$(crc32 $prgFile)"
vCRC="$UNSWAPPEDHEXCRC"
SWAPPEDHEXCRC="${vCRC:6:2}${vCRC:4:2}${vCRC:2:2}${vCRC:0:2}"

echo "$prgFile Unswapped prg size hex is: $UNSWAPPEDHEXSIZE"
echo "$prgFile Swapped prg size hex is: $SWAPPEDHEXSIZE"
echo "$prgFile Unswapped prg crc hex is: $UNSWAPPEDHEXCRC"
echo "$prgFile Swapped prg crc hex is: $SWAPPEDHEXCRC"
perl -e "print pack 'H*', '${SWAPPEDHEXSIZE}${SWAPPEDHEXCRC}A55A5AA5'" > "$originalVerFile.part2"

cat "$originalVerFile.part1" "$originalVerFile.part2" > "$originalVerFile.combined"

rm -rf "$originalVerFile.part1"
rm -rf "$originalVerFile.part2"

UNSWAPPEDHEXCRC="$(crc32 $originalVerFile.combined)"
vCRC="$UNSWAPPEDHEXCRC"
SWAPPEDHEXCRC="${vCRC:6:2}${vCRC:4:2}${vCRC:2:2}${vCRC:0:2}"
echo "$originalVerFile.combined Unswapped verstart crc hex is: $UNSWAPPEDHEXCRC"
echo "$originalVerFile.combined Swapped verstart crc hex is: $SWAPPEDHEXCRC"

perl -e "print pack 'H*', '${SWAPPEDHEXCRC}'" > "$originalVerFile.combined1"

cat "$originalVerFile.combined" "$originalVerFile.combined1" > "$originalVerFile.new"
rm -rf "$originalVerFile.combined"
rm -rf "$originalVerFile.combined1"
rm -rf "$originalVerFile"
mv "$originalVerFile.new" "$originalVerFile"

5.版本号修改

车机不支持降级或平级,如果想刷入需要版本号高于当前车机版本号。

版本号位于VER文件的9-10字节,且大小端转换,如132版本,为"32 01",修改版本号后不需要修改VER文件末尾的CRC32校验数据

按照上述方法,目前已成功通过车机的USB升级校验,但是在升级过程中的70%多会报000314错误,可能是修改的system镜像有点问题,目前还在研究

最后感谢外国友人研究的先锋刷机包解包方法:GitHub - bassrock/AVIC-NEX: A repo for modding the AVIC NEX

和另一个大神的分享:21款凯美瑞车机系统安装软件及OTA升级包浅析_凯美瑞b导航刷机包-CSDN博客

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值