在线咨询
在线客服

工作日:9:00-24:00

商务合作

15366085265

QQ联系方式

1872421339

大客户经理

宋经理

客户经理
专业客户经理,解答您的疑问

Chromium的 MediaDevice 信息怎么修改

发布日期

一、为什么需要修改 / 伪造 mediaDevices 信息?

对于网站来说,navigator.mediaDevices.enumerateDevices() 与 getUserMedia()
是用于探测摄像头、麦克风、扬声器等真实硬件信息的重要接口。
这些信息本质上属于设备指纹的一部分,包括:
• deviceId(设备唯一 ID)
• groupId(硬件分组标识)
• kind(videoinput / audioinput / audiooutput)
• label(设备名称),用户授权后可见
由于这些字段会随硬件型号、声卡驱动、操作系统版本不同而变化,
它常用于反作弊、设备追踪、自动化脚本识别。
因此,在自动化、隐私或浏览器封装场景中,需要对这些信息进行:
• 伪造
• 隐藏
• 最小化
• 标准化

二、MediaDevices 工作机制简述

navigator.mediaDevices 是 Web 平台中访问本地媒体设备的入口。
关键接口如下:
• getUserMedia(constraints)   —— 请求摄像头/麦克风权限
• enumerateDevices()           —— 获取可用设备列表
媒体设备数据来源不是 JS 自己构造的,而是来自浏览器底层,包括:
• WebRTC
• 媒体子系统
• 系统硬件列表
因此,要修改设备信息,需要在:
• JS 层
• 浏览器层 fake-device flags
• Chromium 源码层
三者之一介入。

三、方法 1:JS Hook 修改 enumerateDevices()(最常见)

通过注入脚本可临时伪造页面看到的设备列表,适用于:
自动化、隐私浏览、浏览器扩展、测试环境。

核心做法:覆盖 navigator.mediaDevices.enumerateDevices()。
示例:

(() => {
  const fakeDevices = [
    { deviceId: "fake-video-1", kind: "videoinput", label: "Fake Webcam 720p", groupId: "grp-1" },
    { deviceId: "fake-audio-1", kind: "audioinput", label: "Fake Mic", groupId: "grp-1" },
    { deviceId: "fake-audio-out-1", kind: "audiooutput", label: "Fake Speaker", groupId: "grp-1" }
  ];

  const media = navigator.mediaDevices;
  const origEnum = media.enumerateDevices.bind(media);

  media.enumerateDevices = async () => {
    return fakeDevices.map(d => Object.assign({}, d));
  };
})();

四、方法 2:注入 Hook + 保持 getUserMedia 工作

在一些检测较严格的网站上,仅伪造 enumerateDevices() 不够,需要保证 getUserMedia() 仍然返回一个可用 MediaStream。
下面是组合方案:

navigator.mediaDevices.getUserMedia = async (constraints) => {
  console.log("[fake-media] getUserMedia intercepted.");
  return new MediaStream();
};

五、方法 3:使用 Chrome Fake-Device Flags(适合自动化)

Chrome 提供内置 fake-device 参数,可直接模拟虚拟摄像头与麦克风:

--use-fake-device-for-media-stream
--use-file-for-fake-video-capture=/path/to/fake.y4m
--use-file-for-fake-audio-capture=/path/to/fake.wav
--use-fake-ui-for-media-stream

浏览器将使用虚拟设备,让 getUserMedia() 直接成功返回虚拟数据流。

六、方法 4:源码级修改(最彻底)

对于定制浏览器 / 内嵌 WebView 产品,可以在 Chromium 源码层直接修改设备枚举逻辑。
路径通常包括:
• media/capture/
• third_party/webrtc/
• devices/*
你可以在设备枚举流程中:
• 修改真实硬件名称
• 删除不需要的设备
• 注入虚拟摄像头/麦克风
• 固定 deviceId / groupId 生成规则
这种方法难以被检测但维护成本较高。

七、风险与检测机制

1. 部分网站会检测原型链、toString()、descriptor,因此 Hook 实现需隐藏修改痕迹。
2. deviceId / label / groupId 若不符合系统规律容易触发反作弊系统。
3. Fake device 文件的分辨率、帧率若与 constraints 不匹配将导致报错。
4. 源码层修改需随 Chromium 升级长期维护。

八、最佳实践总结

• 普通自动化场景:Chrome Fake-Device + 简单 Hook 足够。
• 隐私保护:只暴露一个最小化设备列表(固定唯一设备)。
• 高安全场景:JS Hook + WebRTC 参数控制 + FakeDevice 文件组合。
• 封装浏览器:源码级别直接 patch 设备枚举。