【指纹浏览器系列-绕过cdp检测】
一、cpd检测是什么
开发者工具协议(Chrome DevTools Protocol,就简称CDP)
cdp检测(Chrome DevTools Protocol Detection),是许多网站常用的机器人检测手段之一。通常是利用浏览器开发者工具的进行的功能检测或漏洞探测。
当每次打开F12控制台,或者使用selenium,puppeteer之类的自动化工具打开网页,都会被识别成机器人。这种情况基本就是因为有cpd检测。
二、cdp检测原理
cdp检测的原理一般是利用console.debug()函数来实现,当你打开consle控制台时,console.debug()才会真正的被调用。
一旦console.debug()函数被触发,我们就可以认定你打开了F12控制台。
环境检测网站,https://www.browserscan.net/bot-detection,这是一个检测机器人的网站,检测点很多,可以用来验证自己当前的环境是否正常。
正常打开的状态是这样的,说名环境正常,测试通过
三、代码实现cdp检测
实现方式 1
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0"><title>Chrome DevTools Protocol Detection</title>
</head>
<body><div>devTool:<b id="status"></b></div><script>const el = document.getElementById('status')const hook = new Error()Object.defineProperty(hook, "stack", {get: function () {el.innerText = '打开了'return num;}});function isOpenDevTool() {el.innerText = '未打开'console.debug(hook);}isOpenDevTool()</script>
</body>
</html>
实现方式 2
<!DOCTYPE html>
<html><head><title>Detect Chrome DevTools Protocol</title><script>function genNum(e) {return 1000 * e.Math.random() | 0;}function catchCDP(e) {if (e.chrome) {var rng1 = 0;var rng2 = 1;var acc = rng1;var result = false;try {var errObj = new e.Error();var propertyDesc = {configurable: false,enumerable: false,get: function () {acc += rng2;return '';}};Object.defineProperty(errObj, "stack", propertyDesc);console.debug(errObj);errObj.stack;if (rng1 + rng2 != acc) {result = true;}} catch {}return result;}}function isCDPOn() {if(!window)return;const el = document.querySelector('span#status');if(!el)return;el.innerText = catchCDP(window) ? "yes":"no";}function init() {isCDPOn();setInterval(isCDPOn, 100);}document.addEventListener("DOMContentLoaded", init);</script>
</head><body><p>CDP Detected: <span id="status">-</span></p>
</body></html>
四、修改源码绕过cdp检测
第一篇文章写了如何编译chromium,假设你已经编译成功了。
找到源码:\v8\src\inspector\v8-console.cc
1.找到下面的代码
void V8Console::Debug(const v8::debug::ConsoleCallArguments& info,const v8::debug::ConsoleContext& consoleContext) {TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.inspector"), "V8Console::Debug");ConsoleHelper(info, consoleContext, m_inspector).reportCall(ConsoleAPIType::kDebug);
}
2.替换为
void V8Console::Debug(const v8::debug::ConsoleCallArguments& info,const v8::debug::ConsoleContext& consoleContext) {//TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.inspector"), "V8Console::Debug");//ConsoleHelper(info, consoleContext, m_inspector)// .reportCall(ConsoleAPIType::kDebug);
}
3.编译
ninja -C out/Default chrome
五、在线指纹验证网站:
https://fingerprint.com/products/bot-detection/
https://www.browserscan.net/bot-detection