This script was introduced early June 2022 with version 1.10.7/b78be28
You can fetch the script at this URL: https://newassets.hcaptcha.com/i/{VERSION_HASH?}/e
but it's encrypted, after being fetched it's decrypted inside the WebAssembly and executed.
It collects various device fingerprinting data, most of them are listed below.
Current version 28-10-2022: 1.18.0/bc030dc
Parameters explanation: 1.18.0
(Up to date)
- They seem to be running extra checks depending on the "security" parameter enabled eg. when solving AND/OR failing too many captchas in a row, some extra automation checks (worker, proxy spoofing,automation extensions...) are ran
- Result:
Array
- Value:
[window.screen.width,window.screen.height]
- Hashed: false
- Result:
bool
- Value: Screen dimensions check more info
- Hashed: false
- Result:
Array
- Value: s as window.screen
[s.width,s.height,s.availWidth,s.availHeight,s.colorDepth,s.pixelDepth,navigator.maxTouchPoints,devicePixelRatio]
- Hashed: false
- Result:
Bool
- Value: s as window.screen
!(s.width - s.availWidth || s.height - s.availHeight);
- Hashed: false
- Result:
Array
- Value: Looks like some sort of CSS Fingerprinting (Firefox hash is the not the same as the Chrome one)
- Hashed: true
- Result:
Array
- Value: Don't really know how to explain this one (see script for more info)
- Hashed: false
- Result:
Bool
- Value: Some sort of CSS fingerprinting see; return false on most browsers
- Hashed: false
- Result:
String
- Value: Supported emojis (fingerprinting)
- Hashed: false
- Result:
Bool
- Value: Some sort of CSS fingerprinting see; return false on most browsers
- Hashed: false
- Result:
Array
- Value: CSS Properties list (hash is different accross browsers but shared between devices)
- Hashed: true
- Result:
Object
- Value: Looks like some sort of CSS Fingerprinting (hash is different accross browsers but shared between devices)
- Result:
Array
- Value: Fonts but weird // TODO
- Hashed: false
- Result:
Number
- Value: length of CSS properties
- Hashed: false
- Result:
Array
- Value:
Object.getOwnPropertyNames(window)
- Hashed: true
- Result:
Number
- Value:
Object.getOwnPropertyNames(window).length
- Hashed: false
- Result:
Array
- Value: Supported media sources
- Hashed: true
- Result:
String
- Value: User-Agent
- Hashed: false
- Result:
Array
- Value: n as window.navigator
[n.language,n.languages,n.platform,n.oscpu]
- Hashed: false
- Result:
Array
- Value:
[deviceMemory,hardwareConcurrency]
- Hashed: false
- Result:
Bool
- Value: Firefox only. Purpose: ???
- Hashed: false
- Result:
Array
- Value:
navigator.userAgentData.getHighEntropyValues(["platform","platformVersion","model","bitness","architecture","uaFullVersion"])
- Hashed: false
- Result:
Array
- Value:
navigator.userAgentData.getHighEntropyValues(["platform","platformVersion","model","bitness","architecture"])
- Hashed: false
- Result:
Array
- Value: matchMedia() CSS Properties info
- Hashed: false
- Result:
Array
- Value: Some voices fingerprinting data
- Hashed: true
- Result:
Array
- Value: Enabled voices name
- Hashed: false
- Result:
String
- Value: First enabled voice locale eg. "en-US"
- Hashed: false
- Result:
Array
- Value: Audio Fingerprinting
- Hashed: true
- Result:
Bool
- Value: Detect lie about your audio fingerprint (i guess?)
- Hashed: false
- Result:
String
- Value: Canvas fingerprinting
- Hashed: true
- Result:
Bool
- Value: TBD
- Hashed: false
- Result:
Array
- Value: Sort of CSS fingerprinting (not used?)
- Hashed: true
- Result:
Array
- Value: Fonts installed on the system
- Hashed: false
- Result:
String
- Value: TimeZone
- Hashed: false
- Result:
Array
- Value:
[Timezone,See script,new Date("1/1/1970").getTimezoneOffset(),See script,See script]
- Hashed: false
- Result:
Array
- Value: navigator.mediaDevices.enumerateDevices()
- Hashed: true
- Result:
Bool
- Value: TBD (related to bluetooth?)
- Hashed: false
- Result:
Array
- Value: WebRTC fingerprinting
- Hashed: true
- Result:
Array
- Value: WebRTC fingerprinting
- Hashed: true
- Result:
Array
- Value: Math Fingerprinting, Hash is different across browser types
- Hashed: true
- Result:
Number
- Value: Some error stack inspection function more here
- Hashed: false
- Result:
Array
- Value: Navigator Permissions
- Hashed: true
- Result:
Array
- Value: Notification Permissions
- Hashed: false
- Result:
Array
- Value: Codecs testing (some sort of audio hash?)
- Hashed: true
- Result:
String
- Value:
Worker Check
: Worker User-Agent - Hashed: false
- Result:
Bool
- Value:
Worker Check
: Is worker User-Agent same as Browser - Hashed: false
- Result:
Array
- Value:
Worker Check
: Languages and Locale from Worker + language from browser - Hashed: false
- Result:
Array
- Value:
Worker Check
: Some errors from the Worker - Hashed: false
- Result:
Array
- Value: WebGL properties hash
- Hashed: true
- Result:
Array
- Value: WebGL Vendor & Renderer
- Hashed: false
- Result:
Array
- Value: WebGL2 Vendor & Renderer
- Hashed: false
- Result:
Array
- Value: WebGL Fingerprinting
- Hashed: true
- Result:
Array
- Value:
Worker Check
: Checks for known automation extensions - Hashed: false
- Result:
Array
- Value: [lengthOfSomeFunctions,Object.getOwnPropertyNames(window.chrome || {}),check if it's a process ?]
- Hashed: false
- Result:
Array
- Value: Navigator properties check (brand,mobile,platform)
- Hashed: false
- Result:
String
- Value: if ran in electron get the name of the App
- Hashed: false
- Result:
Array
- Value: Audio Fingerprinting
- Hashed: true
- Result:
Number
- Value: Total length of the properties
- Hashed: false
- Result:
Array
- Value: Checks some properties related to the navigator and Window
- Hashed: false
- Result:
Array
- Value: Checks some properties related to the navigator and Window
- Hashed: false
- Result:
Array
- Value: TBD
- Hashed: false
- Result:
Bool
- Value:
!!navigator.webdriver
- Hashed: false
- Result:
Array
- Value: Checks integrity of all Window functions
- Hashed: true
- Result:
Number
- Value: Length of all window function (not sure lol)
- Hashed: false
- Result:
Array
- Value: TBD (not actived yet)
- Hashed: false
- Result:
Number
- Value:
Math.max(Math.floor(n / 1073741824)
- Hashed: false
- Result:
Number
- Value:
e.sent().quota
?? TBD - Hashed: false