数字取证实战:解析2016款本田雅阁车载系统数据

本文详细记录了对2016款本田雅阁车载系统数据镜像进行取证分析的过程,包括分区识别、文件系统分析,并重点介绍了为提取关键用户信息(如最近停留位置、行程日志、通话记录、联系人及蓝牙设备)而编写的四个Python解析脚本。

数字取证实战:解析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.2
  • ro.build.date=2015
  • ro.build.date.utc=1431482880
  • ro.product.model=MY15ADA
  • ro.product.brand=Honda
  • ro.product.manufacturer=Clarion
  • ro.board.platform=r8a7791

分区3:\system\alps\evolution\paired_device_list.txt 包含 ASCII 文本,列出了各种蓝牙地址及其设备名称。这与在 分区4bluetoothsettings.db 中找到的数据一致。

用户数据发现

分区4 包含 Android /user 数据(主要在 com.androidcom.clarioncom.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.logErrorLevelSoft.logErrorLevelHard.log)。

分区6 似乎包含各种文本转语音相关文件。

分区7 将其大部分文件存储在 “data_org.tar.gz” 中。这似乎是 分区4:/data 的恢复备份。

SQLite 数据库取证与 Python 脚本

最有价值的用户相关信息是在 分区4:/data 下的各种 SQLite 数据库中发现的。

对于我们这个数据镜像,有 4 个感兴趣的 SQLite 数据库:

  1. \data\com.honda.displayaudio.navi\Garmin\sqlite\RecentStops.db
  2. \data\com.honda.telematics.core\databases\crm.db
  3. \data\com.clarion.bluetooth\databases\phonedb.db
  4. \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 脚本两次并比较两个输出:

  1. 在不将 phonedb.db-wal 文件与指定的 phonedb.db 放在同一目录的情况下运行脚本。
  2. 在将 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;"

使用示例:

1
2
3
4
c:\Python39\python.exe accord_2016_recentstops.py -d RecentStops.db -o rsop.txt
Running accord_2016_recentstops.py v2021-03-22
Processed/Wrote 26 entries to: rsop.txt
Exiting ...

输出 TSV 格式: time lat lon name

  • time 显示为 ISO 格式字符串,解释为自 1989年12月31日(UTC)以来的 Garmin 秒数。
  • latlon 应用了缩放因子 = 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;"

使用示例:

1
2
3
4
c:\Python39\python.exe accord_2016_crm_eco_logs.py -d crm.db -o crmop.txt
Running accord_2016_crm_eco_logs.py v2021-03-22
Processed/Wrote 300 entries to: crmop.txt
Exiting ...

输出 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;"

使用示例:

1
2
3
4
5
c:\Python39\python.exe accord_2016_phonedb.py -d phonedb.db -o op
Running accord_2016_phonedb.py v2021-03-22
Processed/Wrote 98 CALL entries to: op_CALLS.txt
Processed/Wrote 41 CONTACT entries to: op_CONTACTS.txt
Exiting ...

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;"

使用示例:

1
2
3
4
c:\Python39\python.exe accord_2016_bluetoothsettings.py -d bluetoothsettings.db -o btop.txt
Running accord_2016_bluetoothsettings.py v2021-03-23
Processed/Wrote 6 entries to: btop.txt
Exiting ...

输出 TSV 格式: device_bank device_addr device_name

  • device_bank 似乎是每个设备条目的索引。
  • device_addr 看起来是一个 MAC 地址。

总结与展望

如果您有类似年代的本田数据镜像,我们将非常感激您能运行这些脚本并告知我们结果如何。

显然,由于这些脚本是基于一组数据编写的,可能存在缺陷或错误的假设。

或者,如果您能提供更多关于本田 Android 数据镜像的见解,我们很乐意听取您的发现。

最后,如果您能分享任何其他车辆的数据镜像,并希望我们编写一些解析脚本,请告知我们。

也欢迎在下面的评论部分提出意见和建议。

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