引言
在前几篇文章中,我们已经详细探讨了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
,具体步骤如下:
- 构造
GeolocationCoordinates
blink::GeolocationCoordinates* new_coordinates =
blink::MakeGarbageCollected<blink::GeolocationCoordinates>(
-23.1454, 26.8441, std::nullopt, 30.0, std::nullopt, std::nullopt,
std::nullopt);
- 构造
Geoposition
blink::Geoposition* new_position =
blink::MakeGarbageCollected<blink::Geoposition>(
new_coordinates,
blink::ConvertTimeToEpochTimeStamp(base::Time::Now()));
- 赋值并通知更改
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返回值的修改。通过构造新的GeolocationCoordinates
和Geoposition
对象,并将其赋值给last_position_
变量,我们能够自定义地理位置信息,从而有效地保护用户的隐私,避免被追踪和识别。
在实际操作中,我们不仅需要理解代码的实现细节,还需要掌握如何在不同场景下应用这些技术。通过不断地实践和测试,我们可以确保修改的有效性和稳定性。
希望本文能够帮助读者更好地理解和掌握Chromium指纹技术中的Geolocation API修改方法。如果您在实际操作中遇到任何问题,欢迎随时与我们交流和讨论。让我们共同努力,提升浏览器隐私保护的技术水平。
标签:MakeGarbageCollected,Geolocation,指纹,blink,修改,std,error,position From: https://blog.csdn.net/qqyy_sj/article/details/143481334