Bootstrap

浏览器指纹修改指南2024 - 修改Geolocation API指纹(十一)

引言

在前几篇文章中,我们已经详细探讨了Geolocation API的定义、作用及其在浏览器指纹中的重要性,并深入分析了Chromium源码中Geolocation API的实现位置和修改方法。通过这些分析,我们为后续的修改工作奠定了坚实的基础。

在本篇文章中,我们将继续深入探讨如何具体实现对Geolocation API返回值的修改。我们会提供详细的代码示例和操作步骤,帮助读者更好地掌握这项技术。通过这些修改,读者将能够自定义地理位置信息,从而有效地保护用户的隐私,避免被追踪和识别。

修改源代码

上一篇文章中,我们定位到了OnPositionUpdated函数中,我们在这里需要构造一个新的Geoposition对象的指针,然后将其赋值给last_position_变量。

1.1blink::MakeGarbageCollected讲解

在构造时我们会使用到blink::MakeGarbageCollected

blink::MakeGarbageCollected 是 Chromium 项目中用于创建垃圾回收对象的一个方法。这个方法主要用于 Blink 引擎中的对象管理,确保对象在不再使用时能够被垃圾回收机制正确回收。

方法定义

blink::MakeGarbageCollected 的定义通常如下:

template <typename T, typename... Args>
T* MakeGarbageCollected(Args&&... args){
    returnnew (AllocateObject<T>()) T(std::forward<Args>(args)...);
}
返回值

该方法返回一个指向新创建的垃圾回收对象的指针。具体来说,它返回一个类型为 T* 的指针,其中 T 是你要创建的对象的类型。

1.2 修改步骤讲解

我们先构造出来一个GeolocationCoordinates*,然后使用其来构造Geoposition,具体步骤如下:

  1. 构造GeolocationCoordinates
blink::GeolocationCoordinates* new_coordinates =
      blink::MakeGarbageCollected<blink::GeolocationCoordinates>(
          -23.1454, 26.8441, std::nullopt, 30.0, std::nullopt, std::nullopt,
          std::nullopt);
  1. 构造Geoposition
blink::Geoposition* new_position =
      blink::MakeGarbageCollected<blink::Geoposition>(
          new_coordinates,
          blink::ConvertTimeToEpochTimeStamp(base::Time::Now()));
  1. 赋值并通知更改
  last_position_ = new_position;
  PositionChanged();
  return;

这样就完成了更改。

完整代码

更改后的完整代码如下:

void Geolocation::OnPositionUpdated(
    device::mojom::blink::GeopositionResultPtr result) {
  disconnected_geolocation_ = false;



  // modified
  blink::GeolocationCoordinates* new_coordinates =
      blink::MakeGarbageCollected<blink::GeolocationCoordinates>(
          -23.1454, 26.8441, std::nullopt, 30.0, std::nullopt, std::nullopt,
          std::nullopt);
  blink::Geoposition* new_position =
      blink::MakeGarbageCollected<blink::Geoposition>(
          new_coordinates,
          blink::ConvertTimeToEpochTimeStamp(base::Time::Now()));
  last_position_ = new_position;
  PositionChanged();
  return;
  // modify end



  if (result->is_position()) {
    if (!ValidateGeoposition(*result->get_position())) {
      return;
    }
    last_position_ = CreateGeoposition(*result->get_position());
    PositionChanged();
  } else {
    DCHECK(result->is_error());
    const auto& geoposition_error = *result->get_error();
    GeolocationPositionError* position_error =
        CreatePositionError(geoposition_error);

    auto* context = GetExecutionContext();
    DCHECK(context);
    if (!geoposition_error.error_technical.empty()) {
      context->AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>(
          mojom::blink::ConsoleMessageSource::kNetwork,
          mojom::blink::ConsoleMessageLevel::kError,
          geoposition_error.error_technical));
    }

    if (position_error->code() == GeolocationPositionError::kPermissionDenied) {
      position_error->SetIsFatal(true);
    }
    HandleError(position_error);
  }
  if (!disconnected_geolocation_)
    QueryNextPosition();
}

我们选择在返回之前提前拦截并返回,不对原有逻辑进行修改。

测试功能

我们编译一下并测试功能是否可用。

启动后打开Geolocation API - BrowserLeaks来测试一下是否如我们修改的一样。

可以看到返回值和我们的修改值一样,这样就完成了修改。

结语

通过本文的详细讲解和代码示例,我们成功实现了对Geolocation API返回值的修改。通过构造新的GeolocationCoordinatesGeoposition对象,并将其赋值给last_position_变量,我们能够自定义地理位置信息,从而有效地保护用户的隐私,避免被追踪和识别。

在实际操作中,我们不仅需要理解代码的实现细节,还需要掌握如何在不同场景下应用这些技术。通过不断地实践和测试,我们可以确保修改的有效性和稳定性。

希望本文能够帮助读者更好地理解和掌握Chromium指纹技术中的Geolocation API修改方法。如果您在实际操作中遇到任何问题,欢迎随时与我们交流和讨论。让我们共同努力,提升浏览器隐私保护的技术水平。

;