数字取证实战:恢复与重放Garmin语音导航指令

本文详细介绍了从损坏的Garmin nuvi 56LM GPS设备中恢复语音日志,使用Python脚本和espeak-ng库将X-SAMPA格式的语音指令转换为可播放的WAV文件的技术过程。

恢复与重放Garmin语音指令

设备损坏与数据恢复

我们拿到了一台损坏的Garmin nuvi 56LM GPS设备,从中恢复了一个包含语音日志的文本文件。这个过程比较特殊,因此我们觉得分享这个故事会很有趣。

由于设备损坏严重,芯片提取成为唯一选择。芯片是SanDisk 8 GB eMMC芯片,多次读取产生的哈希值相同,表明芯片状态稳定。

文件系统提取与分析

使用R-studio成功从转储中恢复/提取了文件系统,发现了两个分区:

  • FAT16(128 MB)
  • FAT32(3.3 GB)

在寻找带时间戳的经纬度坐标时,发现了一些值得注意的文件:

FAT16/.System/SQLite/RecentStops.db 包含带有缩放经纬度数值的"history"表。将这些原始数字乘以180/2^31,可获得可绘制的经纬度坐标。

FAT16/.System/SQLite/pre.db “route_segment"表包含时间戳和经纬度路线信息。“history"表包含起始经纬度、结束经纬度和开始时间。

FAT16/.System/Diag/EventLogs/*.TXT 包含可能带时间戳的经纬度坐标,但文件也包含非ASCII/二进制字节。

语音日志的发现

BJ提醒我们注意一个有趣的工件:

FAT32/Voice/logs/vpm_log_all.log 这个文本文件按时间顺序记录GPS语音指令。由于缺乏测试设备,我们不能保证车辆正好在语音提示的位置,但这可能用于显示用户在该区域或知道该区域。

语音日志包含如下行:

1
D[2019/06/12 07:55:03] {22ce6e88} [vpm_tts_parse.c:vpm_tts_parse:3770] Navigation phrase selected: Keep right $USR_TO_NEXT_ROAD. (229)D[2019/06/12 07:55:03] {22ce6e88} [vpm_tts_log.c:vpm_tts_log_phonetics:277] Map Phonetics: "nju "IN|gl@nd *"haI|%we (MDB Lang: 23)

语音字符串分析

语音部分是"Map Phonetics: “和”(MDB Lang: 23)“之间的字符串。这些字符串使用的是X-SAMPA系统(国际音标ASCII表示法的一种)。

行格式可概括为:

1
D[YYYY/MM/DD HH:MM:SS] {4字节十六进制ID? 进程/线程ID?} [vpm_tts_log.c:vpm_tts_log_phonetics:277] Map Phonetics: VOICE_STRING (MDB Lang: 23)

语音合成解决方案

我们发现了一个使用Amazon Polly Speech API的网站(http://ipa-reader.xyz/),可以将X-SAMPA IPA字符串转换为语音。但为了处理大量日志条目,我们寻找了免费替代方案。

espeak-ng 是一个开源C库,Ubuntu可通过以下命令安装:

1
sudo apt-get install espeak-ng

转换过程

我们需要将X-SAMPA字符串转换为espeak-ng可理解的Kirshenbaum字符串:

  • 在输入字符串前后加上’[[‘和’]]’,让符号被解释而非拼写出来
  • 将’{‘字符替换为’a’
  • 将双引号"替换为单引号’,表示主要重音
  • 将’%‘替换为’,’,表示次要重音
  • 将’A’替换为’a’

例如,语音日志字符串:

1
"h{|m@nd *"{|v@n|ju

转换为:

1
[['ha|m@nd *'a|v@n|ju]]

要将其保存为WAV文件:

1
espeak-ng "[['ha|m@nd *'a|v@n|ju]]" -w output.WAV

Python脚本自动化

我们编写了Python3脚本(parse_garmin56LM.py),使用免费的espeak-ng库将Garmin 56LM语音日志文本转换为WAV文件。

脚本逻辑:

  • 打开/读取vpm_log_all.txt
  • 对每一行:提取语音字符串,转换为espeak-ng输入,生成WAV文件
  • 生成包含原始行文本、转换后文本和WAV文件链接的HTML报告

运行方式:

1
python3 parse_garmin56LM.py -f vpm_log_all.log -o op

最终成果

我们成功编写了脚本,从Garmin nuvi 56LM(2014)语音日志中提取IPA字符串并转换为WAV文件。脚本的字符串转换代码(见"process_voicestring"函数)可能需要根据用户数据/语言设置进行调整。该脚本可能适用于其他Garmin GPS型号,但尚未测试。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计