对雷诺嵌入式 NavCore 9.884 的逆向工程(代号
beaumont)
测试于:Renault Laguna 3 GT Monaco GP 2012(顺便说一句,一辆很棒的车)
flowchart TD
A[Carminat TomTom LIVE] --> B[Samsung S5P6440<br/>Linux 2.6.28 verrouillé]
B --> C[NAND interne]
B --> D[Carte SD externe]
C --> E[Verrouillé]
D --> F[Modifiable]
E -.->|UART| G[shell root théorique ?]
F -.->|fichiers SD| H[Personnalisations<br/>splash · menus · POI]
style A fill:#5B4FBE,color:#fff
style E fill:#A32D2D,color:#fff
style F fill:#3B6D11,color:#fff
style G fill:#EF9F27,color:#000
style H fill:#1D9E75,color:#fff
Carminat TomTom LIVE 是雷诺为 2009-2014 年款车型(Laguna 3、Mégane 3、Scénic 3、Espace 4、Fluence、Latitude、Koleos……)配备的车载导航系统。它与非 Live 版 Carminat TomTom 的区别在于:
signedloop 会通过 Merkle 树验证 rootfs 的完整性(本分析未确认,参见 §3)本仓库记录了对 NavCore 9.884 beaumont 固件的分析,包括文件系统测绘、NavCore 二进制静态分析,以及通过 QEMU/strace 进行的运行时分析。
所采用的方法:
ttgo.bif、loopdir/ext3_loopback 文件)ttn 二进制进行动态分析(系统调用 strace、观察打开的文件、运行时行为)未对车辆物理设备进行任何修改。所有分析均在 SD 卡文件副本和下载的固件副本上进行。
此处记录的所有工作均基于个人 SD 卡(从车辆中取出用于分析)以及从 TomTom CDN 下载的官方固件完成。
📌 持续更新的文档:本报告代表本次分析当前的知识状态。随着未来的发现、社区贡献以及在真实硬件上的实证验证,它可能会被改进、修正或补充。欢迎贡献、修正和反馈。
| 字段 | 值 |
|---|---|
| DeviceName | TomTom Carminat LIVE |
| 硬件代号 | beaumont(rev 11) |
| NavCore 版本 | 9.884,构建 9.884.1609031 |
| 官方发布版 | NFA2.8-RC06,于 2014 年 6 月 27 日在迪耶普编译 |
| Linux 内核 | 2.6.28.10-tt1574740 |
| 工具链 | gcc 4.3.3 TomTom CipherWizardry 2009q1_203-474426 |
| Libc | uClibc |
| Init 系统 | Upstart(通过 shell 脚本 /sbin/init → exec /sbin/upstart) |
这些信息来自从 SD 卡 loopdir/ext3_loopback 镜像中提取的 ttgo.bif,以及 TomTom-Cfg/release.nfo 文件。
# Extrait ttgo.bif
[TomTomGo]
DeviceName=TomTom Carminat LIVE
DeviceVersionHW=beaumont
ApplicationVersionVersionNumber=9884
ApplicationVersion=1609031.550
RamDiskVersion=20140626
BootLoaderVersion=839378
LinuxVersion=1574740
| 组件 | 识别信息 |
|---|---|
| SoC | Samsung S5P6440(通过 /etc/udev/rules.d/20_local-s5p6440.rules 确认) |
| CPU | ARM1176JZF-S · ARMv6 · 小端序 · EABI |
| RAM | 静态分析未能确定 |
| 内部存储 | NAND flash · eMMC(/dev/mmcblk0) |
| 用户 SD 卡 | /dev/mmcblk1(可访问插槽) |
| 屏幕 | Samsung LCD LTA058B3L0F(依据 DTB) · 480×272 |
| 帧缓冲 | /dev/fb0 · RGB16/24 |
| GPS | SiRF3 PRIMA · /dev/ttySAC2 |
| GSM/GPRS 调制解调器 | Wavecom WISMO218 · /dev/ttyS0 |
| RDS-TMC 调谐器 | BCM4750 · bcm4750_spi |
| 蓝牙 | 集成 · hci_uart · 仅 HFP + PBAP(不支持 A2DP) |
| 触摸屏 | libts · /dev/input/event0 |
/etc/modules)unionfs · ppp_async · ppp_generic · slhc · hidp · hid · rfcomm
sco · hci_uart · l2cap · bluetooth · bcm4750_spi · vfat · msdos
fat · evdev
⚠️ 社区(gpspower.net)报告称,
signedloop模块会校验rootfs.img的完整性。在提取出的 rootfs 中未观察到该模块(既不在/etc/modules中,也不在/lib/modules/2.6.28.10-tt1574740/中)。有待确认。
固件可从 TomTom 的 Akamai CDN 无需身份验证下载:
curl -A "TomTom HOME/2.24.11.8" -O \
"http://download.tomtom.com/sweet/navcore/9.884.1609031_RC06.CAB-Dieppe.cab"
# SHA256 de référence
a4d32daae2cdd6bc23a0660285c4e32e3a098034731eb257172ed7aaef9052d5
其他可用版本(已测试 HTTP 200):
| 版本 | URL |
|---|---|
| 9.844 | http://download.tomtom.com/sweet/navcore/9844.634510.Carminat_TomTom.cab |
| 9.845 RC10 | http://download.tomtom.com/sweet/navcore/9.845_1115399_RC10.CAB-Camiron-RC10.cab |
| 9.846 RC12 | http://download.tomtom.com/sweet/navcore/9.846_1165624_RC12.CAB-Camiron-RC12.cab |
| 9.847 RC14 | http://download.tomtom.com/sweet/navcore/9.847.1302316_RC14.CAB-Camiron-RC14.cab |
| 9.884 RC06 | http://download.tomtom.com/sweet/navcore/9.884.1609031_RC06.CAB-Dieppe.cab |
brew install cabextract # macOS
mkdir extracted && cabextract 9.884.1609031_RC06.CAB-Dieppe.cab -d extracted/
ls extracted/
# → splashw.bmp ttsystem TomTom-Cfg/release.nfo
ttsystem是一个 ext2 镜像(不是 TTBL),与非 Live 版本不同。
cd extracted/
mkdir rootfs && 7z x ttsystem -o rootfs/
# Le rootfs réel est dans userfs_partition.tar.gz
cd rootfs/
tar xzf userfs_partition.tar.gz
# Contenu :
# _zImage → Linux kernel ARM zImage
# rootfs.img → filesystem Linux complet (ext2, 67 MB)
# WISMO218_*.cla → firmwares modem
mkdir rootfs_mnt
# Sur Linux :
sudo mount -o loop rootfs.img rootfs_mnt/
# Sur macOS (lecture seule) :
7z x rootfs.img -o rootfs_mnt/
rootfs_mnt/
├── bin/
│ ├── ttn ← NavCore principal (11.7 MB, ELF ARM dynamique)
│ ├── telttn ← wrapper IPC vers ttn
│ ├── fakettn ← fallback si ttn absent
│ └── gprscomd ← daemon GPRS
├── etc/
│ ├── inittab
│ ├── fstab
│ ├── passwd ← root:Twu6z6F/voF0Q (DES crypt)
│ ├── init/jobs.d/ ← 20+ jobs Upstart
│ └── udev/
├── lib/
│ ├── libosal.so.0 ← TomTom OS Abstraction Layer
│ ├── libhal.so.0 ← Hardware Abstraction (pilote fb0)
│ ├── libttmp.so.0 ← TomTom Multimedia
│ └── LoquendoTTS/ ← moteur TTS Loquendo
├── sbin/
│ ├── init ← script shell → exec /sbin/upstart
│ ├── mount_sd_loopback
│ ├── mount_sd
│ ├── run_gprscomd
│ └── ttsystem_present
└── (sur partition userfs au runtime)
└── /mnt/sdcard/script/
├── TTTaskList.lua ← liste complète des TASK_* (300+)
└── liblua.so ← VM Lua chargée par ttn via dlopen
| 分区 | 挂载点 | 类型 | 选项 |
|---|---|---|---|
mmcblk0p3 | /mnt/flash | ext3 | defaults,sync,noauto |
mmcblk0p5 | /content | ext3 | defaults,sync,noauto |
| (不在 fstab 中) | /mnt/sdcard | ext3 | 确切机制未经验证 |
/mnt/sdcard是内部 NAND,而非外部 SD 卡。这是 TomTom 命名习惯的遗留,其中“sdcard”指的是嵌入式存储。确切的挂载机制(可能是在/sbin/initshell 之前的 bootloader/initramfs 阶段)尚未经本分析验证;这一推测源于mount_internal对/content执行的remount,rw,这意味着此前已存在挂载。
SD 卡通过 unionfs 挂载到 /mnt/movi,配置如下:
# Script /sbin/mount_sd_loopback (simplifié)
sd_mount="/media/sdcard" # FAT32, RO
loop_mount="/media/loopback" # ext3_loopback, RW upper
union_mount="/mnt/movi" # unionfs des deux
mount -t vfat /dev/mmcblk1p1 $sd_mount \
-o rw,noatime,nodiratime,nosuid,nodev,noexec,sync
mount -o loop $sd_mount/loopdir/ext3_loopback $loop_mount \
-o rw,noexec,data=journal,commit=3600,async
mount -t unionfs unionfs $union_mount \
-o rw,async,noexec,dirs=$loop_mount:$sd_mount=ro
⚠️ 双重 noexec 保护:在 FAT32 上通过
mount显式指定该选项,并通过 unionfs 传播。社区还报告了一个内核钩子post_mount(),强制对所有非 loop 文件系统启用noexec(gpspower.net):本分析中未验证。