14.Chromium指紋瀏覽器開發教程之WebGL指紋定制

WebGL指紋概述

當在瀏覽器打開的網頁上瀏覽內容時,看到的大多是平面的、靜態的圖像和文字。但是有時想要在網頁上看到更加生動、立體的圖像,如3D游戲、虛擬現實應用等。這時,就需要用到WebGL。

簡單來說,WebGL(Web Graphics Library)是一種在網頁瀏覽器中運行的技術,它可以用計算機程序在網頁上展示出立體的、動態的圖像。它基于OpenGL(一種專門用于處理圖形的開放標準)。使用WebGL可以在網頁上創建各種各樣的3D場景和動畫。例如可以在網頁上看到一個旋轉的立方體,或者一個飛行的飛機,甚至是一個完整的3D游戲世界,這些都是通過編寫一些特殊的程序代碼來實現的,這些代碼會告訴瀏覽器如何繪制這些圖像,并且如何根據用戶的操作來進行交互。WebGL的一個很大的優勢是,它可以在幾乎所有現代網頁瀏覽器上運行,而且不需要用戶安裝任何額外的插件或軟件。這意味著,無論是用計算機、平板電腦還是手機,只要有一個支持WebGL的瀏覽器,就可以享受到生動的3D圖像。

瀏覽器中的WebGL指紋是一種用于識別和跟蹤用戶的瀏覽器的技術。它是通過獲取瀏覽器在使用WebGL時的硬件和軟件配置信息,如顯卡型號、驅動版本、操作系統等,然后通過這些信息生成一個唯一的標識符來實現的。由于每臺計算機的硬件和軟件配置都不相同,因此生成的WebGL指紋也是唯一的,可以用來識別用戶的設備。

圖4-5是本機在browserleaks網站查看的WebGL指紋信息,可以看出該指紋信息搜集的是WebGL上下文和顯卡相關信息。因此,如果想修改WebGL指紋,只需要對這類硬件信息進行修改即可。

WebGL指紋獲取

本節會編寫一個JavaScript指紋檢測腳本,用來獲取WebGL相關信息,由此得出瀏覽器的WebGL指紋。通過明晰指紋獲取的流程,可以更容易地找到指紋的修改點。以下是獲取瀏覽器WebGL指紋信息的JavaScript代碼:

function getUnmaskedInfo() {var canvas = document.createElement('canvas');var gl;// 獲取WebGL上下文 ???try {gl = canvas.getContext('webgl') ||canvas.getContext('experimental-webgl');} catch (e) {return "WebGL not supported or disabled";}if (!gl) {return "WebGL not supported or disabled";}var unmaskedVendor = "";var unmaskedRenderer = "";var extensions = gl.getSupportedExtensions();if (extensions.indexOf('WEBGL_debug_renderer_info') !== -1) {var debugInfo = gl.getExtension('WEBGL_debug_renderer_info');unmaskedVendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);unmaskedRenderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);} else {return "WEBGL_debug_renderer_info extension not supported";}var info = {"Unmasked Vendor": unmaskedVendor,"Unmasked Renderer": unmaskedRenderer};info.vendor = gl.getParameter(gl.VENDOR);info.renderer = gl.getParameter(gl.RENDERER);info.version = gl.getParameter(gl.VERSION);info.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);info.maxRenderBufferSize = gl.getParameter(gl.MAX_RENDERBUFFER_SIZE);info.maxViewportDims = gl.getParameter(gl.MAX_VIEWPORT_DIMS);info.extensions = gl.getSupportedExtensions();return info;
}
// 調用函數并輸出結果 ???????
var unmaskedInfo = getUnmaskedInfo();
console.log(unmaskedInfo);

將上述代碼運行在瀏覽器之中,即可打印出WebGL相關信息。WebGL指紋是通過搜集如圖4-6所示的信息,經過特殊編碼后生成哈希值,從而得到用戶的瀏覽器指紋信息的。

這段代碼是用來獲取用戶瀏覽器中WebGL相關信息的函數。在這段代碼中,getUnmaskedInfo首先創建一個canvas元素,然后嘗試獲取WebGL上下文。如果獲取成功,則嘗試獲取更多的WebGL相關信息,如廠商、渲染器、版本等,并返回一個包含這些信息的對象。如果獲取不成功,則返回相應的錯誤信息。最后,通過調用getUnmaskedInfo來獲取瀏覽器中的WebGL信息,并將其打印到控制臺中。

利用這些WebGL信息,就可以生成任意編碼的值作為指紋信息,傳遞給網站服務端進行判別。

WebGL指紋修改

由于WebGL相關信息眾多,要想成功修改WebGL指紋,需要對要進行指紋修改的網站進行具體分析,了解其搜集的指紋信息進行對癥下藥,才能順利完成指紋修改。本節將帶領讀者修改WebGL中的Debug Renderer info信息,代碼如下:

unmaskedVendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);unmaskedRenderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);

gl.getParamete是WebGL API中的一個函數,用于獲取特定參數的當前值。它接受一個參數,該參數指定要查詢的信息類型,并返回相應的值。UNMASKED_VENDOR_WEBGL用于獲取WebGL渲染上下文的廠商信息,而UNMASKED_RENDERER_WEBGL用于獲取渲染器信息。通常情況下,修改這兩個值,WebGL相關指紋信息就會發生改變。

關于WebGL指紋信息的代碼文件位于“src\third_party\blink\renderer\modules\webgl”當中,其中的webgl_rendering_context_base.cc文件包含了最基礎的WebGL渲染信息。

先來修改其中的vendor廠商信息,具體代碼如下:

case WebGLDebugRendererInfo::kUnmaskedVendorWebgl:if (ExtensionEnabled(kWebGLDebugRendererInfoName)) {if (IdentifiabilityStudySettings::Get()->ShouldSampleType(blink::IdentifiableSurface::Type::kWebGLParameter)) {RecordIdentifiableGLParameterDigest(pname, IdentifiabilityBenignStringToken(String(ContextGL()->GetString(GL_VENDOR))));}return WebGLAny(script_state,String(ContextGL()->GetString(GL_VENDOR)));}SynthesizeGLError(GL_INVALID_ENUM, "getParameter","invalid parameter name, WEBGL_debug_renderer_info not enabled");return ScriptValue::CreateNull(script_state->GetIsolate());

可以看出,該代碼判斷到條件語句WebGLDebugRendererInfo::kUnmaskedVendorWebgl的時候,會判別kWebGLDebugRendererInfoName擴展是否已經啟用,該拓展可以提供額外的WebGL渲染器信息。

  1. 啟用了擴展:如果啟用,代碼進一步處理獲取顯卡供應商的信息,并記錄這些信息用于標識能力研究。這個擴展提供了一種方式來獲取通常不公開的詳細WebGL渲染器信息。
  2. 未啟用拓展:如果擴展沒有被啟用,代碼則會生成一個錯誤。錯誤指出無法獲取請求的參數,因為相關的調試擴展沒有啟用。隨后,代碼返回一個空值作為函數的結果,表明操作未能成功執行。

要修改此處的WebGL廠商信息,可以選擇在啟用拓展時候修改,如果未啟用就正常返回空值。通過傳遞名為webgl_vendor的命令行參數,即可完成廠商信息的修改。代碼如下:

//ruyiconst base::CommandLine* ruyi_command_line =base::CommandLine::ForCurrentProcess();if (ruyi_command_line->HasSwitch(blink::switches::kRuyi)) {const std::string ruyi_fp = ruyi_command_line->GetSwitchValueASCII(blink::switches::kRuyi);absl::optional<base::Value> json_reader =base::JSONReader::Read(ruyi_fp);std::string webgl_vendor =*(json_reader->GetDict().FindString("webgl_vendor"));return WebGLAny(script_state,String(webgl_vendor));}//ruyi end

接著,再來看看顯卡信息,代碼如下:

case WebGLDebugRendererInfo::kUnmaskedRendererWebgl:if (ExtensionEnabled(kWebGLDebugRendererInfoName)) {if (IdentifiabilityStudySettings::Get()->ShouldSampleType(blink::IdentifiableSurface::Type::kWebGLParameter)) {RecordIdentifiableGLParameterDigest(pname, IdentifiabilityBenignStringToken(String(ContextGL()->GetString(GL_RENDERER))));}return WebGLAny(script_state,String(ContextGL()->GetString(GL_RENDERER)));}SynthesizeGLError(GL_INVALID_ENUM, "getParameter","invalid parameter name, WEBGL_debug_renderer_info not enabled");return ScriptValue::CreateNull(script_state->GetIsolate());

可以看出結構上是和修改廠商信息沒有太大區別的,依然可以在啟用拓展的情況下對其中的顯卡信息返回值進行定制修改。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76846.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76846.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76846.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# foreach 循環中獲取索引的完整方案

一、手動維護索引變量 ?實現方式?&#xff1a; 在循環外部聲明索引變量&#xff0c;每次迭代手動遞增&#xff1a; int index 0; foreach (var item in collection) { Console.WriteLine($"{index}: {item}"); index; } ?特點?&#xff1a; 簡單直接&#…

Android 下拉欄中的禁用攝像頭和麥克風隱藏

Android 下拉欄中的禁用攝像頭和麥克風隱藏 文章目錄 Android 下拉欄中的禁用攝像頭和麥克風隱藏一、前言二、下拉框中的禁用攝像頭和麥克風隱藏實現1、設置支持屬性為false2、修改代碼 三、其他1、下拉欄中的禁用攝像頭和麥克風隱藏小結2、 Android SensorPrivacyService ps&a…

數字后端設計 (四):時鐘樹綜合——讓芯片的「心跳」同步到每個角落

—— 試想全城的人要在同一秒按下開關——如果有的表快、有的表慢&#xff0c;結果會亂套&#xff01;時鐘樹綜合就是給芯片內部裝一套精準的“廣播對時系統”&#xff0c;讓所有電路踩著同一個節拍工作。 1. 為什么時鐘如此重要&#xff1f; 芯片的「心跳」&#xff1a;時鐘信…

華為網路設備學習-19 路由策略

一、 二、 注意&#xff1a; 當該節點匹配模式為permit下時&#xff0c;參考if else 當該節點匹配模式為deny下時&#xff1a; 1、該節點中的apply子語句不會執行。 2、如果滿足所有判斷&#xff08;if-match&#xff09;條件時&#xff0c;拒絕該節點并跳出&#xff08;即不…

機器學習決策樹

一、何為決策樹 決策樹&#xff08;Decision Tree&#xff09;是一種分類和回歸方法&#xff0c;是基于各種情況發生的所需條件構成決策樹&#xff0c;以實現期望最大化的一種圖解法。由于這種決策分支畫成圖形很像一棵樹的枝干&#xff0c;故稱決策樹。它的運行機制非常通俗易…

香港服務器CPU對比:Intel E3與E5系列核心區別與使用場景

香港服務器的 CPU 配置(核心數與主頻)直接決定了其并發處理能力和數據運算效率&#xff0c;例如高頻多核處理器可顯著提升多線程任務響應速度。在實際業務場景中&#xff0c;不同負載需求對 CPU 架構的要求存在顯著差異——以 Intel E3 和 E5 系列為例&#xff0c;由于兩者在性…

【Rust 精進之路之第8篇-工具賦能】深入 Cargo:依賴管理、構建配置與工作空間 (Workspace)

系列: Rust 精進之路:構建可靠、高效軟件的底層邏輯 作者: 碼覺客 發布日期: 2025-04-20 引言:超越構建,Cargo 是 Rust 生態的引擎 在我們的 Rust 學習之旅初期(第二篇),我們已經與 Cargo 有過初步的接觸。我們學會了使用 cargo new 創建項目骨架,用 cargo build 編…

#systemverilog# 進程控制問題#(八)關于#0 問題的使用(三)

今天,我們繼續研究一下上一節討論的問題。其實,還有一個小問題,我們來探討一下。 `timescale 1ns/10psmodule tb_top(); reg clk; reg reset;initial begin reset = 0; #10 reset = 1; #15 reset = 0; #50 $finish; endinitial beginfor(int i = 0; i < 4 ; i++)fork #…

Linux:簡單自定義shell

1.實現原理 考慮下?這個與shell典型的互動&#xff1a; [rootlocalhost epoll]# ls client.cpp readme.md server.cpp utility.h [rootlocalhost epoll]# ps PID TTY TIME CMD 3451 pts/0 00:00:00 bash 3514 pts/0 00:00:00 ps ?下圖的時間軸來表?事件的發?次序。其中時…

PLSQL語法入門--PL/SQL 基礎詳解

PL/SQL 基礎詳解 PL/SQL&#xff08;Procedural Language for SQL&#xff09;是 Oracle 數據庫中的一種過程式語言&#xff0c;它擴展了 SQL 的功能&#xff0c;允許開發者編寫復雜的程序邏輯。 一、匿名塊 解釋 匿名塊是 PL/SQL 的基本執行單位&#xff0c;它是一段獨立的…

Oracle--用戶管理

前言&#xff1a;本博客僅作記錄學習使用&#xff0c;部分圖片出自網絡&#xff0c;如有侵犯您的權益&#xff0c;請聯系刪除 用戶管理在 Oracle 數據庫中至關重要。一個服務器通常只運行一個 Oracle 實例&#xff0c;而一個 Oracle 用戶代表一個用戶群&#xff0c;他們通過該用…

UOS+N 卡 + CUDA 環境下 X86 架構 DeepSeek 基于 vLLM 部署與 Dify 平臺搭建指南

一、文檔說明 本文檔是一份關于 DeepSeek 在X86架構下通vLLM工具部署的操作指南&#xff0c;主要面向需要在UOSN卡CUDA環境中部署DeepSeek的技術人員&#xff0c;旨在指導文檔使用者完成從 Python 環境升級、vLLM 庫安裝、模型部署到 Dify 平臺搭建的全流程操作。 二、安裝Pyt…

操作系統之shell實現(下)

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 種一棵樹最好是十年前&#xff0c;其次是現在&#xff01; &#x1f680; 今天來學習C語言的相關知識。 &#x1f44d; 如果覺得這篇文章有幫助&#xff0c;歡迎您一鍵三連&#xff0c;分享給更…

Spark,流量統計案例

提前創好一個文件夾分為四個類 FlowBean中的代碼內容為&#xff1a;package org.example.flow; import org.apache.hadoop.io.Writable; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; //hadoop 序列化 //三個屬性&#xff1a;手機…

下載油管視頻 - yt-dlp

文章目錄 1. yt-dlp與you-get介紹1.1 主要功能對比1.2 使用場景1.3 安裝 2. 基本命令介紹2.1 默認下載視頻2.2 指定畫質和格式規則2.3 下載播放列表2.4 備注 3. 參考資料 之前只使用you-get下載b站視頻&#xff0c;當時了解you-get也可下載油管視頻&#xff0c;但之前無此需求&…

基于javaweb的SSM+Maven教材管理系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

VS2022+QT環境配置及基本操作

參考文章 2025最新&#xff01;Visual Studio 2022 QT6.7 環境配置全攻略&#xff1a;一鍵搞定安裝與亂碼問題&#xff0c;開發效率翻倍&#xff01;&#xff08;全網最詳細教程&#xff0c;手把手教你搭建完美開發環境&#xff01;&#xff09;_vs2022 qt-CSDN博客 下載QT …

使用percona-toolkit同步mysql表數據

背景 做了主備mysql的配置以后&#xff0c;可能因為切換過程造成不一致的情況&#xff0c;這個時候可以處理的方式是全量導入再導出&#xff0c;這個有個問題就是操作的數據太多了 我們只需要數據補全同步即可 mysql的同步是基于binlog的&#xff0c;如果沒有記錄的部分的數據…

MDG 實現后端主數據變更后快照自動刷新的相關設置

文章目錄 前言實現過程BGRFC期初配置&#xff08;可選&#xff09;設置 MDG快照 BGRFC維護BP出站功能模塊 監控 前言 眾所周知&#xff0c;在MDG變更請求創建的同時&#xff0c;所有reuse模型實體對應的快照snapshot數據都會記錄下來。隨后在CR中&#xff0c;用戶可以修改這些…

重裝系統 之 Dell戴爾服務器 PowerEdge R750xs + window server2012r2 || 2016

因要求需要給新服務器裝個 win server2012或者2016系統 XXX使用U盤制作PE系統U盤安裝系統不行&#xff0c;適合普通win8&#xff0c;win10&#xff0c;win11U盤制作PE系統U盤安裝win10系統教程U盤制作PE系統U盤安裝win10系統教程https://mp.weixin.qq.com/s/t0W8aNJaHPAU8T78nh…