如何识别浏览器的 HTML5 地理定位协议?

逆向工程 工具 协议
2021-06-28 01:35:53

我一直试图弄清楚像 chrome 或 firefox 这样的 html5 浏览器如何在后台执行地理定位,但我遇到了一些困难。

困难

更准确地说,我想知道当一段 javascript 调用navigator.geolocation.getCurrentPosition (success_func) success_func实际被回调之前会发生什么我想知道浏览器如何获取经纬度坐标。它使用的协议是什么?它查询哪些服务器来获取这些信息?等等。

这是我确定并尝试过的:

  • Chrome 和 Firefox 使用附近 wifi 接入点的 MAC 通过将其发送到 googlesapi.com 来获取地理位置。这是我最感兴趣的基于 MAC-wifi 的实现。
  • success_func被调用时,浏览器已经获得了地理位置数据。
  • 我使用代理和数据包捕获(如 tcpcatcher 和wireshark)取得了有限的进展。我看到正在查询,googleapis.com:443但当然是通过 tls/ssl 这意味着我无法阅读它。(在 tcpcatcher 中使用 ssl 监视器会导致 geoloc 在浏览器中失败)
  • 我尝试在浏览器中使用内置的 devtool 和控制台,但它似乎忽略了获取 geoloc 数据的通信。例如,使用 chrome 的 devtool ( ctrl+ shift+ I),它不会显示任何CONNECT方法或连接,googleapis.com即使 tcpcatcher 在地理定位期间清楚地捕获了它。
  • 我试过查看来源来确定这一点,但运气不佳。问题是浏览器代码库非常庞大,并且很难找到相关的类和源文件,尤其是因为我不熟悉它们的整体设计。搜索有趣的关键字仅到此为止。

如果你们试图确定和逆转给定浏览器用来实现地理定位的协议,你们将如何进行?

其他资源

以下是我已经看过的一些我认为有帮助的内容:

问题是那里提到的一些信息已过时且不再准确。我现在的目标是弄清楚发生了什么变化以及外部自定义应用程序如何使用该协议本身进行地理定位。

1个回答

对于 Firefox(即 Gecko)和 Chrome(即 Blink),您可以查看源代码:

在 Firefox 代码库中搜索getCurrentPosition产生源文件nsGeolocation.cpp正如您在链接的源代码行中看到的,它创建了一个地理定位提供程序的实例。假设 Firefox for Desktop,只有NetworkGeolocationProvider(FirefoxOS 也可能使用 GPS)。

从本质上说,壁虎打开一个XMLHttpRequest到指定的URLabout:configgeo.wifi.uri默认情况下,这是https://www.googleapis.com/geolocation/v1/geolocate?key=%GOOGLE_API_KEY%.

Blink 在network_location_request.cc 中执行其 http 请求,其 API 端点定义与 Firefox 中相同(参见location_arbitrator_impl.cc)。

(注意:我查看了 Gecko HG 修订版 a4f779bd7cc2 和 Blink SVN 修订版 287303)