-
在线客服
工作日:9:00-24:00
-
商务合作
15366085265
-
QQ联系方式
1872421339
-
大客户经理
宋经理
对于网站来说,navigator.mediaDevices.enumerateDevices() 与 getUserMedia()
是用于探测摄像头、麦克风、扬声器等真实硬件信息的重要接口。
这些信息本质上属于设备指纹的一部分,包括:
• deviceId(设备唯一 ID)
• groupId(硬件分组标识)
• kind(videoinput / audioinput / audiooutput)
• label(设备名称),用户授权后可见
由于这些字段会随硬件型号、声卡驱动、操作系统版本不同而变化,
它常用于反作弊、设备追踪、自动化脚本识别。
因此,在自动化、隐私或浏览器封装场景中,需要对这些信息进行:
• 伪造
• 隐藏
• 最小化
• 标准化
navigator.mediaDevices 是 Web 平台中访问本地媒体设备的入口。
关键接口如下:
• getUserMedia(constraints) —— 请求摄像头/麦克风权限
• enumerateDevices() —— 获取可用设备列表
媒体设备数据来源不是 JS 自己构造的,而是来自浏览器底层,包括:
• WebRTC
• 媒体子系统
• 系统硬件列表
因此,要修改设备信息,需要在:
• JS 层
• 浏览器层 fake-device flags
• Chromium 源码层
三者之一介入。
通过注入脚本可临时伪造页面看到的设备列表,适用于:
自动化、隐私浏览、浏览器扩展、测试环境。
核心做法:覆盖 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));
};
})();
在一些检测较严格的网站上,仅伪造 enumerateDevices() 不够,需要保证 getUserMedia() 仍然返回一个可用 MediaStream。
下面是组合方案:
navigator.mediaDevices.getUserMedia = async (constraints) => {
console.log("[fake-media] getUserMedia intercepted.");
return new MediaStream();
};
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() 直接成功返回虚拟数据流。
对于定制浏览器 / 内嵌 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 设备枚举。