安卓设备中利用Google Maps定位手机的技术解析

本文详细解析了如何通过Google Maps应用中的数据库和缓存文件获取安卓设备的位置数据,包括搜索历史、导航记录和保存位置等关键数字取证技术。

通过Google Maps定位手机(Android篇)

我坚信数字取证发现有时是坚持和运气的结合,而后者是准备和机会的结合。在开始调查之前,你永远不知道会发现什么。有时你开始寻找A的证据,结果却找到了B的证据。今年的Cellebrite CTF让我在Google Maps的一个已知但未完全理解的工件中发现了数据。

这将是Google Maps位置数据指南的上半部分,重点介绍Android,第二部分将涵盖iOS。

导航起点

对于初学者来说,Android上的Google Maps位于USERDATA/data/com.google.android.apps.maps/。如果你参加了今年的Cellebrite CTF,你还会知道它也可能存在于USERDATA/user/PROFILE_NUMBER/com.google.android.apps.maps/

其中一些非标准文件夹可能很熟悉。具体来说,app_tts-cacheapp_tts-temp。这两个文件夹都包含与Google Assistant在导航期间提供的逐向指示相关的音频文件。

保存的位置

用户可以在Google Maps中保存位置。有五个默认类别:收藏夹、加星标的地点、已标记、想去和旅行计划。用户也可以添加自定义类别。

存储有关保存位置信息的文件之一是gmm_sync.db,位于/databases文件夹中。相关表是sync_item_data

保存的位置可以放在上述默认类别之一,也可以添加到用户创建的自定义类别中。每个类别都被分配一个随机标识符,然后附加到gmm_sync.db中的位置记录中。item_proto列用于将随机标识符与友好名称关联。

一旦找到特定类别的随机标识符,检查员可以通过检查string_index列中的该值,并检查latitude_e7longitude_e7item_proto列来找到该类别的所有位置。

用户创建的自定义类别看起来略有不同。用户可以向自定义类别添加描述。

用户可以为位置添加标签。例如,如果用户想将一个位置标记为他们的家(预定义选项之一),他们可以这样做。文件gmm_myplaces.db包含与标记位置相关的信息。

其他数据库文件

下一个文件,同样在/database文件夹中,是gmm_storage.db。该文件处理起来也很麻烦,因为其中有大量的BLOB数据。感兴趣的唯一表是gmm_storage_table

该表中有许多重复信息,可以在前面讨论的文件中找到。_data列中的BLOB是序列化的Java,但它看起来也像protobuf。

文件

很多时候,检查员可能过于关注数据库而忽略了其他文件类型。这样做是有害的。Google Maps中的/files文件夹包含一些非常有价值的数据。

第一个文件是Cellebrite的Jean-Philippe Noat和Ian Whiffin今年早些时候在网络研讨会上介绍的文件。该文件是new_recent_history_cache.cs,虽然它有.cs扩展名,但该文件包含protobuf。

该文件包含已登录帐户的Google Maps搜索历史。检查员可以在此文件中找到搜索内容以及搜索发生的时间戳。此外,该文件还包含Google帐户登录的其他设备(即同步设备)的Google Maps搜索以及这些搜索发生的时间戳。

如果搜索返回了地址或一组GPS坐标,它会看起来不同。

检查员可以查看另一个文件来查看手机最后导航到的位置。该文件也在/files目录中,名为saved_directions.data.cs

该文件将包含两个(2)或有时三个(3)位置,具体取决于导航场景。蓝色高亮显示的纬度和 longitude 值表示获取到某个位置的指示时手机所在的位置。红色高亮显示的数据是预期目的地。

saved_directions.data.cs的底部有额外的数据。可以看到导航开始的时间(绿色框)、导航结束的时间(红色框)以及导航结束时手机的位置。

如果用户在到达预期目的地之前停止导航,这些坐标也会被捕获到此文件中。

Android Auto 相关文件

第三个文件可能存在于/files中,检查员会发现它很有用。我说“可能”是因为用户需要在Android Auto中使用Google Maps,此文件才会出现。如果不存在,则表示尚未在该场景中使用Google Maps。

该文件是new_recent_history_cache_navigated.cs,它包含有关手机通过Android Auto使用Google Maps至少开始导航到的位置的信息。

该文件有两个重要信息。首先,通过Android Auto在Google Maps中开始导航的时间戳(蓝色框),其次,正在导航到的位置;但请注意,位置出现在这里并不意味着手机到达了该位置。它只是意味着手机开始导航到该位置。

通常,我发现通过Android Auto界面在Google Maps中搜索是不一致的。有些通过Android Auto进行的搜索没有出现在new_recent_history_cache.cs中,而其他时候搜索确实出现了。

/files中最后一个感兴趣的文件是offline_saved_directions.cs。该文件包含与前面讨论的saved_directions.cs相同的数据。

更新(2025-03-29)

数字取证在不断变化,作为从业者,我们有责任确保自己保持最新。应用程序行为的变化导致了工件的改变、新工件的出现以及新的边缘情况。这是我们学科的本质。

下面讨论的更改与文件saved_directions.data.cs有关。在原始帖子中,该文件被描述为存储与最后一次非通过Android Auto进行的导航会话相关的信息,这部分仍然正确。变化在于此文件的内容,这取决于用户的行为以及某些操作发生的时间。

为了进行测试,我使用了我的Pixel 5a,运行Android 15和Google Maps版本25.12.01.737373685。在每个导航会话期间,saved_directions.data.cs被多次从手机中提取,通常与导航会话的变化相一致,无论是由我还是由手机触发的。

saved_directions.data.cs中的“新东西”(或我最初遗漏的东西)是一个键值为“您的位置”,带有一组相应的GPS坐标。测试表明,该值通常与文件开头的坐标一致。

“您的位置”很挑剔,但并非完全不可预测。为了说明,参见图36。这是与图32中看到的相同的导航会话。在此会话期间,我在到达预期目的地之前过早左转,偏离了路线。

这是同一会话的saved_directions.data.cs的开头,它完全不同。我最初获取指示的坐标消失了。此外,预期目的地移到了文件的最开头,与“您的位置”相关的坐标也发生了变化,并且位于文件的开头。

总体而言,saved_directions.data.cs的结构完全混乱。除了文件开头的更改之外,文件末尾没有导航会话的开始/结束时间戳。它只有结束位置,即我在过早左转后停下的地方。

为了确认这一发现,我重新运行了测试。图42显示了Maps UI中的路线计算。图43显示了saved_directions.data.cs中的坐标,图44将这些坐标显示在地图上。

图43中的坐标与“您的位置”值中的坐标近似。图45显示了saved_directions.data.cs中的“您的位置”,图46将这些坐标显示在地图上。

一旦我开始行程,我跟随导航行驶了一段时间,然后和之前一样,在到达预期目的地之前过早左转。参见图47。

检查saved_directions.data.cs发现了与之前类似的混乱情况。文件开头的原始坐标消失了,预期目的地位于文件的最开头,“您的位置”不仅发生了变化,而且移向了文件的开头。一个额外的变化是会话的开始和结束时间不在文件末尾;它们在文件大约四分之三的位置,但比之前更接近。

下一个测试涉及获取一组指示,沿着路线行驶一小段,然后开始导航会话。只要我没有沿着建议路线行驶太远,文件顶部的坐标集就保持不变。

我再次运行测试,但这次我沿着路线开得更远一些。最终,我开得足够远,蓝点变成了蓝色三角形。我停了一分钟,然后开始了导航会话,并立即提取了saved_directions.data.cs。文件的开头看起来完全不同。这里,目的地缺失了,“您的位置”反映了我实际开始导航会话的位置,而不是我最初获取指示的位置。

预期目的地移到了saved_directions.data.cs的更深处。

一旦我开始导航会话,我沿着路线行驶了一会儿,然后左转偏离了路线。正如预期的那样,Google Maps重新计算了路线。我再次提取了saved_directions.data.cs。结果很有趣。

saved_directions.data.cs有几个细微差别,这可能导致它看起来不像我原始测试中那样整洁。无论这是由于Google Maps的一些更改还是我在第一批研究中遗漏的行为,还有待观察。无论如何,关于此文件细微差别的额外信息可以帮助解释为什么它看起来不像最初那样整洁。

我们从业者处于不断学习的状态;我们的学科要求如此。

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