Tuxler "detection", can be easily spoofed by changing the extension ID(formerly used to actually ping the tuxler websocket)
['MSCSSMatrix', 'msSetImmediate', 'msIndexedDB'].filter(key => key in window).length + ['msMaxTouchPoints', 'msPointerEnabled'].filter(key => key in navigator).length
['msWriteProfilerMark', 'MSStream', 'msLaunchUri'].filter(key => key in window).length + (['msSaveBlob'].filter(key => key in navigator).length)
Checks if ur using internet explorer, or pre-chromium microsoft edge
['safari', 'ongestureend', 'TouchEvent', 'orientation'].filter(key => key in window).length + (HTMLElement && !('autocapitalize' in HTMLElement.prototype)) + (Document && 'pointerLockElement' in Document.prototype)
iOS check or something
/^function\s.*?\{\s*\[native code]\s*}$/.test(String(window.print))
Sees if the printing method is not overwritten, idk whats this for
(String(window.browser) === '[object WebPageNamespace]') + ('MicrodataExtractor' in window)
Old firefox check
['onmozfullscreenchange', 'mozInnerScreenX', 'CSSMozDocumentRule', 'CanvasCaptureMediaStream'].filter(key => key in window).length + ('buildID' in navigator) + ('MozAppearance' in (document.documentElement?.style ?? {}))
Firefox check
('DOMRectList' in window) + ('RTCPeerConnectionIceEvent' in window) + ('SVGGeometryElement' in window) + ('ontransitioncancel' in window)
Modern browser check or something
localStorage.getItem('css_tokens')
Gets the css_tokens field from local storage, usually is used as an easiest ip swap/ban evasion check.
(() => { const getComplexCanvasFingerprint = () => { const asciiString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ !\"#$%&'()*+,-./0123456789:;<=>?@[\]^_`{|}~"; let canvas = null; let ctx = null; let base64Data = null; try { canvas = document.createElement('canvas'); ctx = canvas.getContext('2d'); ctx.textBaseline = "top"; ctx.font = "17px Arial"; ctx.textBaseline = "alphabetic"; ctx.fillStyle = "#f60"; ctx.fillRect(150, 1, 550, 25); ctx.fillStyle = "#069"; ctx.fillText(asciiString, 2, 15); ctx.fillStyle = "rgba(102, 204, 0, 0.7)"; ctx.fillText(asciiString, 4, 17); ctx.font = "17px Helvetica"; ctx.strokeStyle = 'red'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 10, 50); ctx.font = "17px Times New Roman"; ctx.strokeStyle = 'rgba(102, 204, 0, 0.7)'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 12, 55); ctx.font = "17px Times"; ctx.strokeStyle = '#069'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 14, 60); ctx.font = "17px Georgia"; ctx.strokeStyle = '#FF7F00'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 16, 65); ctx.font = "17px Palatino"; ctx.strokeStyle = '#9400D3'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 18, 70); ctx.font = "17px Garamond"; ctx.strokeStyle = '#4B0082'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 20, 75); ctx.font = "17px Bookman"; ctx.strokeStyle = '#0000FF'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 22, 80); ctx.font = "17px Comic Sans MS"; ctx.strokeStyle = '#00FF00'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 24, 85); ctx.font = "17px Trebuchet MS"; ctx.strokeStyle = '#FFFF00'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 26, 90); ctx.font = "17px Arial Black"; ctx.strokeStyle = '#FF7F00'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 28, 95) ctx.font = "17px Impact"; ctx.strokeStyle = '#FF0000'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 30, 100) ctx.font = "17px Anurati"; ctx.strokeStyle = '#9400D3'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 28, 105); ctx.font = "17px Verdana"; ctx.strokeStyle = '#4B0082'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 26, 110); ctx.font = "17px Courier New"; ctx.strokeStyle = '#0000FF'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 24, 115); ctx.font = "17px Baskerville"; ctx.strokeStyle = '#00FF00'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 22, 120); ctx.font = "17px Century Gothic"; ctx.strokeStyle = '#FFFF00'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 20, 125); ctx.font = "17px Tahoma"; ctx.strokeStyle = '#FF7F00'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 18, 130); ctx.font = "17px Arial Narrow"; ctx.strokeStyle = '#FF0000'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 16, 135); ctx.font = "17px Trebuchet MS"; ctx.strokeStyle = '#9400D3';ctx.lineWidth = 2; ctx.strokeText(asciiString, 14, 140); ctx.font = "17px Lucida Sans Typewriter"; ctx.strokeStyle = '#4B0082'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 12, 145); ctx.font = "17px Consolas"; ctx.strokeStyle = '#0000FF'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 10, 150); ctx.font = "17px cursive"; ctx.strokeStyle = '#00FF00'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 14, 155); ctx.font = "17px fantasy"; ctx.strokeStyle = '#FFFF00'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 16, 160); ctx.font = "17px monospace"; ctx.strokeStyle = '#FF7F00'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 18, 165); ctx.font = "17px sans-serif"; ctx.strokeStyle = '#FF0000'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 20, 170); ctx.font = "17px serif"; ctx.strokeStyle = '#9400D3'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 22, 175); ctx.font = "17px .Mondulkiri U GR 1.5"; ctx.strokeStyle = '#4B0082'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 24, 180); ctx.font = "17px BPG Classic 99U"; ctx.strokeStyle = '#0000FF'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 26, 185); ctx.font = "17px Bauhaus 93"; ctx.strokeStyle = '#00FF00'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 28, 190); ctx.font = "17px Bookshelf Symbol 7"; ctx.strokeStyle = '#FFFF00'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 30, 195); ctx.font = "17px Ming(for ISO10646)"; ctx.strokeStyle = '#FF7F00'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 32, 200); ctx.font = "17px Modern No. 20"; ctx.strokeStyle = '#FF0000'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 34, 205); ctx.font = "17px OCR-B 10 BT"; ctx.strokeStyle = '#9400D3'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 36, 210); ctx.font = "17px Proxy 1"; ctx.strokeStyle = '#4B0082'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 38, 215); ctx.font = "17px Proxy 9"; ctx.strokeStyle = '#0000FF'; ctx.lineWidth = 2; ctx.strokeText(asciiString, 40, 220); const grd = ctx.createLinearGradient(0, 0, 200, 0.2); grd.addColorStop(0, "rgba(102, 204, 0, 0.1)"); grd.addColorStop(1, "#FF0000"); ctx.fillStyle = grd; ctx.fillRect(10, 10, 150, 80); base64Data = canvas.toDataURL(); canvas.remove(); return base64Data; } catch (err) { if (canvas) { canvas.remove(); } return "blocked"; } } const canvasFingerprint = getComplexCanvasFingerprint(); if (canvasFingerprint != getComplexCanvasFingerprint()) { return "blocked"; } else { return canvasFingerprint; } })();
The part everyones been waiting for: THE CANVAS FINGERPRINT, which by the way partially generates the css_tokens field mentioned above.
navigator.serviceWorker === undefined
Sees if service worker API is there
navigator.languages.join()
Gets your prefered languages or something
(new Intl['DateTimeFormat']).resolvedOptions()['locale']
Your locale for formatting dates and times
window.gl ? window.gl.getExtension('WEBGL_debug_renderer_info') ? window.gl.getParameter(window.gl.getExtension('WEBGL_debug_renderer_info').UNMASKED_RENDERER_WEBGL) : null : null
Sees what GPU youre using
window.location.href
Sees what url you are on, most likely
https://www.soyjak.st/SOMETHING/
localStorage.stylesheet ? localStorage.stylesheet : null
Sees if you are using the default stylesheet or not i think