Created
February 7, 2022 15:19
-
-
Save xl7dev/ee421c1a7c4bf3a6a90d3d0e3d2ca991 to your computer and use it in GitHub Desktop.
bypass headless javascript
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// overwrite the `languages` property to use a custom getter | |
Object.defineProperty(navigator, "languages", { | |
get: function() { | |
return ["zh-CN","zh"]; | |
} | |
}); | |
// Overwrite the `plugins` property to use a custom getter. | |
Object.defineProperty(navigator, 'plugins', { | |
// get: () => [1, 2, 3, 4, 5], | |
get: () => new Array(Math.floor(Math.random() * 6) + 1), | |
}); | |
// Pass the Webdriver test | |
Object.defineProperty(navigator, 'webdriver', { | |
get: () => false, | |
}); | |
// Pass the Chrome Test. | |
// We can mock this in as much depth as we need for the test. | |
window.navigator.chrome = { | |
runtime: {}, | |
// etc. | |
}; | |
// Pass the Permissions Test. | |
const originalQuery = window.navigator.permissions.query; | |
window.navigator.permissions.query = (parameters) => ( | |
parameters.name === 'notifications' ? | |
Promise.resolve({ state: Notification.permission }) : | |
originalQuery(parameters) | |
); | |
['height', 'width'].forEach(property => { | |
// store the existing descriptor | |
const imageDescriptor = Object.getOwnPropertyDescriptor(HTMLImageElement.prototype, property); | |
// redefine the property with a patched descriptor | |
Object.defineProperty(HTMLImageElement.prototype, property, { | |
...imageDescriptor, | |
get: function() { | |
// return an arbitrary non-zero dimension if the image failed to load | |
if (this.complete && this.naturalHeight == 0) { | |
return 20; | |
} | |
// otherwise, return the actual dimension | |
return imageDescriptor.get.apply(this); | |
}, | |
}); | |
}); | |
// WebGL Vendor and Renderer | |
const getParameter = WebGLRenderingContext.getParameter; | |
WebGLRenderingContext.prototype.getParameter = function(parameter) { | |
// UNMASKED_VENDOR_WEBGL | |
if (parameter === 37445) { | |
return 'Intel Open Source Technology Center'; | |
} | |
// UNMASKED_RENDERER_WEBGL | |
if (parameter === 37446) { | |
return 'Mesa DRI Intel(R) Ivybridge Mobile '; | |
} | |
return getParameter(parameter); | |
}; | |
// store the existing descriptor | |
const elementDescriptor = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'offsetHeight'); | |
// redefine the property with a patched descriptor | |
Object.defineProperty(HTMLDivElement.prototype, 'offsetHeight', { | |
...elementDescriptor, | |
get: function() { | |
if (this.id === 'modernizr') { | |
return 1; | |
} | |
return elementDescriptor.get.apply(this); | |
}, | |
}); | |
// Bypass canvas based detection | |
var inject = function () { | |
var overwrite = function (name) { | |
const OLD = HTMLCanvasElement.prototype[name]; | |
Object.defineProperty(HTMLCanvasElement.prototype, name, { | |
"value": function () { | |
var shift = { | |
'r': Math.floor(Math.random() * 10) - 5, | |
'g': Math.floor(Math.random() * 10) - 5, | |
'b': Math.floor(Math.random() * 10) - 5, | |
'a': Math.floor(Math.random() * 10) - 5 | |
}; | |
var width = this.width, height = this.height, context = this.getContext("2d"); | |
var imageData = context.getImageData(0, 0, width, height); | |
for (var i = 0; i < height; i++) { | |
for (var j = 0; j < width; j++) { | |
var n = ((i * (width * 4)) + (j * 4)); | |
imageData.data[n + 0] = imageData.data[n + 0] + shift.r; | |
imageData.data[n + 1] = imageData.data[n + 1] + shift.g; | |
imageData.data[n + 2] = imageData.data[n + 2] + shift.b; | |
imageData.data[n + 3] = imageData.data[n + 3] + shift.a; | |
} | |
} | |
context.putImageData(imageData, 0, 0); | |
return OLD.apply(this, arguments); | |
} | |
}); | |
}; | |
overwrite('toBlob'); | |
overwrite('toDataURL'); | |
}; | |
inject(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment