数字取证实战:解析2016款本田雅阁车载系统数据
“红色的车跑得更快!” - 原始图片来源于 caranddriver.com
Monkey 最近 “试驾”(或者说 “试解析”?)了一个来自2016款本田雅阁(美国款)的数据镜像。本文将描述这段奇妙的旅程。
特别感谢 Manny Fuentes 慷慨地分享了他的本田数据。没有这些数据,这篇博客和相关的脚本就不会存在。
脚本可在 GitHub 上获取。
数据镜像概览
使用 X-Ways Forensics 解析镜像后,显示了 7 个分区,其中 6 个包含 EXT4 文件系统。第一个分区未被 X-Ways 识别。
以下是 X-Ways 的分析结果:
- 分区1 = 251 MB 未知
- 分区2 = 879 MB EXT4 (系统部分1,约8332个文件)
- 分区3 = 251 MB EXT4 (系统部分2,约1275个文件)
- 分区4 = 1.7 GB EXT4 (用户数据,约15115个文件)
- 分区5 = 251 MB EXT4 (21个文件,包含带时间戳的日志)
- 分区6 = 1.1 GB EXT4 (49个文件,似乎包含语音相关数据)
- 分区7 = 125 MB EXT4 (966个文件,大部分存储在 “data_org.tar.gz” 中)
注意: 两个分区(分区2和分区3)包含
/system目录。
系统信息分析
基于在 分区2 中找到的字符串:
\system\build.prop
系统运行的是 Android 4.2.2 (ro.build.version.release=4.2.2),似乎由 Clarion 制造 (ro.product.manufacturer=Clarion, ro.board.platform=r8a7791, ro.build.description=T2X-user 4.2.2 9TXX9211 211 release-keys)。构建日期是 2015年8月6日 16:57:16 UTC (ro.build.date.utc=1438880236)。
分区2:\system\app 也包含各种 .apk 和 .odex 文件。
分区3 的 \system\build.prop 同样确认了上述 Android 属性:
ro.build.version.release=4.2.2ro.build.date=2015ro.build.date.utc=1431482880ro.product.model=MY15ADAro.product.brand=Honda- …
ro.product.manufacturer=Clarionro.board.platform=r8a7791
分区3:\system\alps\evolution\paired_device_list.txt 包含 ASCII 文本,列出了各种蓝牙地址及其设备名称。这与在 分区4 的 bluetoothsettings.db 中找到的数据一致。
用户数据发现
分区4 包含 Android /user 数据(主要在 com.android、com.clarion、com.honda 目录下)。
同样在 分区4 发现:
\property\persist.sys.timezone[包含设置为 “US/Central” 的 ASCII 文本]\system\usagestats\usage-history.xml[包含各种带时间戳的 Android 活动日志。未验证]\data\com.android.settings\shared_prefs\bluetooth_settings.xml[包含 “last_discovering_time” 的时间戳字符串值。似乎是自 1970年1月1日 以来的毫秒数。未验证]\data\com.clarion.displayaudio.apps.generalsettings\shared_prefs\com.clarion.displayaudio.apps.generalsettings_preferences.xml[包含 “currentTimeZoneIdNotDaylight”(例如 “US/Central”)和 “currentTimeZoneName”(例如 “CST UTC-6”)的字符串值]\data\com.clarion.displayaudio.apps.telephonyapp\shared_prefs\activity.PhoneTopActivity.xml[包含字符串 “DEVICENAME” 和一个看起来像是 MAC 地址的内容 - 可能是最常用的设备?]\data\com.honda.displayaudio.navi\Garmin\sqlite\quick_search_list.db[包含一个空的 “quick_search_list” 表]
分区5 包含各种带时间戳的错误日志(例如 ErrorLevelPower.log、ErrorLevelSoft.log、ErrorLevelHard.log)。
分区6 似乎包含各种文本转语音相关文件。
分区7 将其大部分文件存储在 “data_org.tar.gz” 中。这似乎是 分区4:/data 的恢复备份。
SQLite 数据库取证与 Python 脚本
最有价值的用户相关信息是在 分区4:/data 下的各种 SQLite 数据库中发现的。
对于我们这个数据镜像,有 4 个感兴趣的 SQLite 数据库:
\data\com.honda.displayaudio.navi\Garmin\sqlite\RecentStops.db\data\com.honda.telematics.core\databases\crm.db\data\com.clarion.bluetooth\databases\phonedb.db\data\com.clarion.bluetooth\databases\bluetoothsettings.db
因此,我们编写/测试了四个 Python3 解析脚本,运行环境为 Win10x64 + Python 3.9。
这四个脚本的工作方式类似——它们接受一个输入参数(指向相应的 SQLite 数据库)和一个输出参数(用于输出的 TSV 文件名)。然后,它们运行 SQL 查询以获取相关数据,并将选定的字段输出到 TSV 文件。
对于我们的数据,除了 phonedb.db,在同一目录下还有一个预写式日志文件 (phonedb.db-wal)。
建议在此类场景中运行 accord_2016_phonedb.py 脚本两次并比较两个输出:
- 在不将
phonedb.db-wal文件与指定的phonedb.db放在同一目录的情况下运行脚本。 - 在将
phonedb.db-wal文件与指定的phonedb.db放在同一目录的情况下运行脚本。
用户无需在命令行指定 -wal 文件,因为如果存在,SQLite 会自动(神奇地)合并该文件。
对于我们的数据,包含 phonedb.db-wal 文件导致了额外 10 条 通话记录被发现/输出。
接下来介绍这些脚本…
1. accord_2016_recentstops.py
- 功能: 读取
RecentStops.db中的 “history” 表,并将详细信息输出到 TSV 文件。 - 表说明: 该表似乎记录了带时间戳的经纬度坐标。我们不确定是什么触发了条目创建。
- 数据库路径:
\data\com.honda.displayaudio.navi\Garmin\sqlite\RecentStops.db - SQLite 查询:
"SELECT time, lat, lon, name FROM history ORDER BY time ASC;"
使用示例:
|
|
输出 TSV 格式:
time lat lon name
time显示为 ISO 格式字符串,解释为自 1989年12月31日(UTC)以来的 Garmin 秒数。lat和lon应用了缩放因子= 180 / 2^31来转换为度。name可以包含交叉路口或位置字符串,有助于确认计算出的经纬度。
2. accord_2016_crm_eco_logs.py
- 功能: 读取
crm.db中的 “eco_logs” 表,并输出详细信息到 TSV 文件。 - 表说明: 该表似乎记录了各种带时间戳的行程段(带时间戳的里程表/行程范围测量值)。
- 数据库路径:
\data\com.honda.telematics.core\databases\crm.db - SQLite 查询:
"SELECT _id, trip_date, trip_id, mileage, start_pos_time, start_pos_odo, finish_pos_time, finish_pos_odo, fuel_used, driving_range FROM eco_logs ORDER BY _id ASC;"
使用示例:
|
|
输出 TSV 格式:
_id trip_date trip_id mileage start_pos_time start_pos_odo finish_pos_time finish_pos_odo fuel_used driving_range
trip_date,start_pos_time,finish_pos_time显示为 ISO 格式字符串,解释为自 1970年1月1日(UTC)以来的毫秒数。mileage,start_pos_odo,finish_pos_odo,fuel_used,driving_range以未知单位测量,但可用于趋势分析。
3. accord_2016_phonedb.py
- 功能: 读取
phonedb.db中的 “callhistory”、“contact”、“contactnumber” 表,并输出详细信息到 TSV 文件。 - 数据库说明: 该数据库似乎记录通话历史和联系人信息。
- 数据库路径:
\data\com.clarion.bluetooth\databases\phonedb.db - 通话历史 SQLite 查询:
"SELECT _id, address, phonenum, calldate, calltype FROM call_history ORDER BY calldate ASC;" - 联系人 SQLite 查询:
"SELECT contact._id, contact.address, contact.firstName, contact.lastName, contact.phonename, contactnumber.number, contactnumber.numbertype FROM contact JOIN contactnumber ON contactnumber.contact_id = contact._id ORDER BY contact._id ASC;"
使用示例:
|
|
CALLS 输出 TSV 格式:
_id address phonenum calldate calltype
address看起来是一个 MAC 地址。calldate显示为 ISO 格式字符串,解释为自 1970年1月1日(UTC)以来的毫秒数。calltype似乎是 1、2 或 3。通过使用通话计费记录或检查设备,应该可以确定每个值的含义(例如,未接、来电、去电)。
CONTACTS 输出 TSV 格式:
_id address firstname lastname phonename contactnum contacttype
address看起来是一个 MAC 地址。- 对于我们所有的联系人,
contacttype始终设置为 3。
4. accord_2016_bluetoothsettings.py
- 功能: 读取
bluetoothsettings.db中的 “bluetooth_device” 表,并输出详细信息到 TSV 文件。 - 表说明: 该表似乎记录蓝牙设备名称和 MAC 地址。
- 数据库路径:
\data\com.clarion.bluetooth\databases\bluetoothsettings.db - 注意: 还有一个 “speed_dial” 表,但它是空的,所以我们不确定这个表是如何填充的。
- SQLite 查询:
"SELECT device_bank, device_addr, device_name FROM bluetooth_device ORDER BY device_bank ASC;"
使用示例:
|
|
输出 TSV 格式:
device_bank device_addr device_name
device_bank似乎是每个设备条目的索引。device_addr看起来是一个 MAC 地址。
总结与展望
如果您有类似年代的本田数据镜像,我们将非常感激您能运行这些脚本并告知我们结果如何。
显然,由于这些脚本是基于一组数据编写的,可能存在缺陷或错误的假设。
或者,如果您能提供更多关于本田 Android 数据镜像的见解,我们很乐意听取您的发现。
最后,如果您能分享任何其他车辆的数据镜像,并希望我们编写一些解析脚本,请告知我们。
也欢迎在下面的评论部分提出意见和建议。