本文将介绍固定指纹的概念以及为什么要固定指纹,以plugins指纹作为示例重新修改代码,希望给你一些启发。
什么是固定指纹?
所谓固定指纹,就是为浏览器设定一套专属且唯一的环境参数组合,关键在于这套参数组合不会因浏览器的多次启动或重复访问而发生改变。
为什么要固定指纹?
我们的目标是:启动浏览器时加入参数 --fingerprints="xxxxxxx",让参数变化带动指纹变化,且网页打开后的后续访问中指纹保持稳定。这在诸多电商平台中有着广泛应用。
什么是plugins指纹?
所谓 “Plugins 指纹”(browser plugin fingerprinting),是一种在线追踪手段。其原理是依据用户已安装的插件信息,经汇总后构建出一个独特的标识。但这种指纹的唯一性不算强,往往要和其他类型的指纹结合起来发挥作用。
如何重新修改源码?
打开源码 third_party/blink/renderer/modules/plugins/dom_plugin.cc
首先在头部加上:
c
#include <random>
#include <string>
#include "base/command_line.h"
其次,找到下面代码
c
String DOMPlugin::description() const {
return plugin_info_->Description();
}
替换原有代码:
c
String DOMPlugin::description() const {
//return plugin_info_->Description();
base::CommandLine* base_command_line = base::CommandLine::ForCurrentProcess();
std::string tmp;
if (base_command_line->HasSwitch("fingerprints")) {
tmp = base_command_line->GetSwitchValueASCII("fingerprints");
}else{
tmp = base_command_line->GetSwitchValueASCII("type");
}
// LOG(ERROR) << "tmp:('" << tmp << "') tmp";
String res = plugin_info_->Description();
return res + String(tmp);
}
该代码的原理为,把通过 --fingerprints 参数得到的字符串,添加到每个插件的 description 的末尾部分。
最后,编译如下:
ninja -C out/Default chrome
render进程如何追加参数?
打开资源管理器就能看到,chromium 默认使用多进程方式运行,它仅有一条主进程,那些带有 --type 参数的进程都属于子进程。由于启动浏览器的参数默认只能传递给主进程,因此我们还需要改进进程创建程序,让参数能够传递给子进程。
打开源码,找到下面的代码:
c
command_line->AppendSwitchASCII(switches::kProcessType,
switches::kRendererProcess);
替换为:
c
command_line->AppendSwitchASCII(switches::kProcessType,
switches::kRendererProcess);
//追加
const base::CommandLine* base_command_line = base::CommandLine::ForCurrentProcess();
if (base_command_line->HasSwitch("fingerprints")) {
const std::string tmp = base_command_line->GetSwitchValueASCII("fingerprints");
command_line->AppendSwitchASCII("fingerprints", tmp);
}
编译结果:
ninja -C out/Default chrome
如何验证?
复制 navigator.plugins 到 F12 控制台后,能看到 description 中已成功加上我们的参数,plugins 指纹固定工作顺利完成。