系统环境: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博客