Want to continue the fun of planet.soyjak.st? Use SoyPlace, it will be online for as long as Gold can pay his server bills. Faggot (talk) 19:41, 25 September 2025 (UTC)


EFFECTIVE IMMEDIATELY: All unofficial revivals of the shemmy will be treated as hostile communities without prior approval by jannies, this is because they all seem to be run by Discord pedophiles. Faggot (talk) 11:41, 26 September 2025 (UTC)

Sharty datamining: Difference between revisions

From SNCApedia, the shit nobody cares about encyclopedia
Jump to navigationJump to search
updated https://soyjak.forum/threads/the-sharty-is-a-remote-access-trojan.5213/
Tag: Reverted
Undo revision 3688 by SwinnyGOD (talk) Quote confirmed this is wrong
Tag: Undo
 
Line 1: Line 1:
{{Outdated}}
The Sharty datamines you a lot lol, you can get past a lot of the datamining while still being able to post by using <s>[https://mullvad.net/en/browser Mullvad browser] (allow canvas access)</s> you will get autobanned for ban evasion, which is basically the Tor browser but doesnt connect to Tor.
The Sharty datamines you a lot lol, you can get past a lot of the datamining while still being able to post by using <s>[https://mullvad.net/en/browser Mullvad browser] (allow canvas access)</s> you will get autobanned for ban evasion, which is basically the Tor browser but doesnt connect to Tor.


Line 7: Line 9:
NOTE THAT INTEGRITY IS ONLY INSTALLED IN POST FORMS, RULE LISTS, HOME PAGE, BANNED.PHP AND SIMILAR STATIC CONTENT DOES NOT HAVE INTEGRITY IN IT.
NOTE THAT INTEGRITY IS ONLY INSTALLED IN POST FORMS, RULE LISTS, HOME PAGE, BANNED.PHP AND SIMILAR STATIC CONTENT DOES NOT HAVE INTEGRITY IN IT.


Integrity.wasm/Integrity.js are sharty modules used to fingerprint your device and call the Tuxler API to check if you're using Tuxler or not. The client-side module, integrity.wasm, is an obfuscated virtual machine compiled in WebAssembly whose sole function is to run commands sent from a remote server. The strongest command, CMD_EVAL, instructs the client to run JavaScript code. Below is a technical breakdown.
=== Integrity.js ===
 
Integrity.js contains the javascript that datamines/fingerprints you. Contrarily to popular belief, Integrity.wasm doesnt do any datamining, as wasm cant do that, instead it obfuscates the code that integrity.js runs. Integrity.wasm is kind useless though, as you can just log all the stuff intregrity.js runs. The only use integrity.wasm has is obfuscating how all the fingerprinting values are combined into a single integrity hash, so its slightly harder to spoof. Anyways heres all the stuff it runs that """secretly""" datamines you (from May 15 2025 as im too lazy to check it again). Note that i used LLMs to help me explain some of the code because I dont know a lot of javascript.
The entire architecture is made up of three components:
 
    A persistent WebSocket connection for real-time server-client correspondence.
    The WebAssembly module (Integrity.wasm) which is the actual agent that conducts commands.
    The Javascript module (Integrity.js) which provides the bridge for the WASM module to execute and interact with JavaScript.
 
Upon initialization, Integrity.wasm uses a bridged function call to open a persistent WebSocket connection to the main integrity server. Unlike a standard HTTP request, it remains open, allowing for the server to push commands at any time without waiting for a new request. This makes the script an active listener.
 
Moving onto the details of the WebAssembly module itself, it's structured around a central processing loop. Said loop's function is to:
 
    Listen for incoming messages on the WebSocket.
    Parse the message to identify a command ID (an opcode, or integer).
    Jump to the specific routine designed to handle that command.
 
While there are likely handlers for various tasks (like the previously mentioned calls for the Tuxler API) that I haven't had time to thoroughly document, the most important handler is for CMD_EVAL.
 
Onto Integrity.js, it serves a very important purpose as the WASM module in and of itself can't access the browser's Document Object Model (DOM) or execute JavaScript as it operates as a sandboxed memory space. In order to perform such actions, it must call imported functions provided by the host environment.
 
I've done some analysis of the mapping of the imported functions.
 
var wasmImports={
      &nbsp; &nbsp; //...
      &nbsp; &nbsp; b:_emscripten_run_script,
      &nbsp; &nbsp; a:_emscripten_run_script_int,
      &nbsp; &nbsp; c:_emscripten_run_script_string,
      &nbsp; &nbsp; //...
};
 
These functions provided by Emscripten (a compiler toolchain that compiles C/C++ to WebAssembly) act as a bridge. When the WASM module calls its imported function "a", it is actually calling _emscripten_run_script_int in the JavaScript environment. These functions operate as follows:
 
    They take one argument: an integer that points to a memory address within the sandboxed memory of the WebAssembly module.
    The JavaScript code reads the null-terminated string starting at that memory address.
    It then executes this string as JavaScript using the browser's eval() function.
    Depending on which version is called (_int, _string, or the standard), it will return nothing, a number, or a string to the WebAssembly module.
 
Below is the end-to-end execution flow of CMD_EVAL:
 
    The integrity server sends a message through the open WebSocket connection. The payload is a structured message, likely in binary or JSON format. It contains at least two parts: the command opcode for CMD_EVAL and the JavaScript code to be executed as a string.
    The onmessage event for the WebSocket occurs inside the WASM module. Its main loop reads the payload, detects the opcode 5 (hypothetically CMD_EVAL), and recognizes the accompanying string.
    The WASM module writes the JavaScript string to a specific spot in its linear memory.
    The CMD_EVAL handler within the WASM module makes an import call. If it expects a string back, it calls the function linked to _emscripten_run_script_string (imported as "c"). It passes the memory address (pointer) of the string it just wrote as the only argument to this function
    The call is sent to the integrity.js glue code. At the specified pointer address, it retrieves the null-terminated string from the memory of the WASM module. The eval() function in the browser is then used to execute this string.
    The eval() call yields a result back, such as "8|1920". The bridge function provided by Emscripten takes this result and writes it back to the WASM module memory, and the bridge function returns a pointer to the new string.
 
The entire process end-to-end happens silently in a fraction of a second. This data is packaged into a new WebSocket message and is exfiltrated back into the server for logging and analysis. The server now has the fingerprinting data it requested, and this cycle can repeat with the possibility of new commands being able to be pushed at any time.
 
Onto the implications:
 
This provides a multitude of problems that allow for remote code execution by the server, providing capabilities associated with Remote Access Trojans (RATS) with insane privileges such as:
 
Being able to read all cookies (including authorization tokens)
 
    Access localStorage/sessionStorage
    Monitor form inputs before submission
    Inject UI elements onto webpages (such as fake login forms)
    The ability to add event listeners allowing for keylogging and other behavioral listening
    Read clipboard contents
    Make requests to other origins
    Hijack the CPU to mine cryptocurrency
    Exfiltrate data to third-party servers
    Pretty much fingerprint everything about your hardware, including WebGL capabilities, browser info, GPU info, canvas fingerprints, media devices, network info, etc.
 
I'm guessing there's a few reasons Quote could've done this, it's more flexible in regards to being able to update new fingerprinting techniques instantly without deploying new client files, but I'm not really sure. I really don't want to assume malice, but there's no reason to have this convoluted and complex of an architecture just for what it's supposedly used for.
 
Regardless, Quote is from the UK, which raises legal questions:
 
Computer Misuse Act 1990:
 
Does executing arbitrary code without consent constitute "unauthorized access"?
 
UK GDPR / Data Protection Act 2018:
 
Fingerprinting = personal data collection
No transparent disclosure = potential violation
No lawful basis (consent, legitimate interest)
 
PECR (ePrivacy):


Device fingerprinting = terminal equipment access
'''ANYWAYS HERE I GO'''
Requires consent under Regulation 6
<syntaxhighlight lang="javascript">Boolean(window._phantom||window.callPhantom||window.__phantomas||window.Buffer||window.emit||window.spawn||window.webdriver||window.domAutomation||window.domAutomationController||window.document.documentElement.getAttribute('webdriver'));</syntaxhighlight>
Checks if youre using a webdriver (automated browser) to stop bots, though just use a good one like https://github.com/ultrafunkamsterdam/nodriver
<syntaxhighlight lang="javascript">
['webkitPersistentStorage', 'webkitTemporaryStorage', 'webkitResolveLocalFileSystemURL'].filter(key => key '''in''' navigator).length + (navigator.vendor.indexOf('Google') === 0) + ['BatteryManager', 'webkitMediaStream', 'webkitSpeechGrammar'].filter(key => key '''in''' window).length</syntaxhighlight>
Checks if certain Webkit (Safari) APIs are accessible, also checks if your browser vendor is a Google one.


Is this stated anywhere on the Sharty? It's not, or atleast not where I've looked. Quote seems more willing to hide the architecture's abilities by heavily obfuscating it.
<syntaxhighlight lang="javascript">(() => { const f = new Float32Array(1); const u8 = new Uint8Array(f.buffer); f[0] = Infinity; f[0] = f[0] - f[0]; return u8[3];})();</syntaxhighlight>Sees how floating-point values are represented in memory<syntaxhighlight lang="javascript">
window.screen.colorDepth
</syntaxhighlight>I shouldnt have to explain this one<syntaxhighlight lang="javascript">
parseFloat(navigator.deviceMemory)
</syntaxhighlight>Checks how much RAM you have<syntaxhighlight lang="javascript">
navigator.hardwareConcurrency
</syntaxhighlight>Checks how many logical cpu cores you have<syntaxhighlight lang="javascript">
window.outerWidth
window.outerHeight
</syntaxhighlight>Checks the window size<syntaxhighlight lang="javascript">
new Date().getTimezoneOffset()
</syntaxhighlight>Gets your timezone<syntaxhighlight lang="javascript">
(typeof chrome !== 'undefined' && typeof chrome.runtime !== 'undefined' && typeof chrome.runtime.sendMessage !== 'undefined') ? chrome.runtime.sendMessage('jpgljfpmoofbmlieejglhonfofmahini', {action: 'check_installed'}, response => chrome.runtime.lastError || response.is_installed !== 'yes' ? 0 : 1) : 0
</syntaxhighlight>Tuxler "detection", can be easily spoofed by changing the extension ID(formerly used to actually ping the tuxler websocket)


That's it, @Quote if you want to refute or discuss anything I said here you're welcome to
<syntaxhighlight lang="javascript">['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)</syntaxhighlight>Checks if ur using internet explorer, or pre-chromium microsoft edge<syntaxhighlight lang="javascript">['safari', 'ongestureend', 'TouchEvent', 'orientation'].filter(key => key in window).length + (HTMLElement && !('autocapitalize' in HTMLElement.prototype)) + (Document && 'pointerLockElement' in Document.prototype)</syntaxhighlight>iOS check or something<syntaxhighlight lang="javascript">/^function\s.*?\{\s*\[native code]\s*}$/.test(String(window.print))</syntaxhighlight>Sees if the printing method is not overwritten, idk whats this for<syntaxhighlight lang="javascript">(String(window.browser) === '[object WebPageNamespace]') + ('MicrodataExtractor' in window)</syntaxhighlight>Old firefox check<syntaxhighlight lang="javascript">['onmozfullscreenchange', 'mozInnerScreenX', 'CSSMozDocumentRule', 'CanvasCaptureMediaStream'].filter(key => key in window).length + ('buildID' in navigator) + ('MozAppearance' in (document.documentElement?.style ?? {}))</syntaxhighlight>Firefox check<syntaxhighlight lang="javascript">('DOMRectList' in window) + ('RTCPeerConnectionIceEvent' in window) + ('SVGGeometryElement' in window) + ('ontransitioncancel' in window)</syntaxhighlight>Modern browser check or something<syntaxhighlight lang="javascript">
localStorage.getItem('css_tokens')
</syntaxhighlight>Gets the css_tokens field from local storage, usually is used as an easiest ip swap/ban evasion check.<syntaxhighlight lang="javascript">
(() => { 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; } })();
</syntaxhighlight>The part everyones been waiting for: THE CANVAS FINGERPRINT, which by the way partially generates the css_tokens field mentioned above.<syntaxhighlight lang="javascript">navigator.serviceWorker === undefined</syntaxhighlight>Sees if service worker API is there<syntaxhighlight lang="javascript">navigator.languages.join()</syntaxhighlight>Gets your prefered languages or something<syntaxhighlight lang="javascript">(new Intl['DateTimeFormat']).resolvedOptions()['locale']</syntaxhighlight>Your locale for formatting dates and times<syntaxhighlight lang="javascript">
window.gl ? window.gl.getExtension('WEBGL_debug_renderer_info') ? window.gl.getParameter(window.gl.getExtension('WEBGL_debug_renderer_info').UNMASKED_RENDERER_WEBGL) : null : null
</syntaxhighlight>Sees what GPU youre using<syntaxhighlight lang="javascript">
window.location.href
</syntaxhighlight>Sees what url you are on, most likely https://www.soyjak.st/SOMETHING/<syntaxhighlight lang="javascript">localStorage.stylesheet ? localStorage.stylesheet : null</syntaxhighlight>Sees if you are using the default stylesheet or not i think

Latest revision as of 20:36, 29 September 2025

This page or section may contain outdated information!
(You) VVILL help by adding updates and correcting obsolete information.

The Sharty datamines you a lot lol, you can get past a lot of the datamining while still being able to post by using Mullvad browser (allow canvas access) you will get autobanned for ban evasion, which is basically the Tor browser but doesnt connect to Tor.

>inb4 quote blocks mullvad browser again

yup, he did

NOTE THAT INTEGRITY IS ONLY INSTALLED IN POST FORMS, RULE LISTS, HOME PAGE, BANNED.PHP AND SIMILAR STATIC CONTENT DOES NOT HAVE INTEGRITY IN IT.

Integrity.js

[edit | edit source]

Integrity.js contains the javascript that datamines/fingerprints you. Contrarily to popular belief, Integrity.wasm doesnt do any datamining, as wasm cant do that, instead it obfuscates the code that integrity.js runs. Integrity.wasm is kind useless though, as you can just log all the stuff intregrity.js runs. The only use integrity.wasm has is obfuscating how all the fingerprinting values are combined into a single integrity hash, so its slightly harder to spoof. Anyways heres all the stuff it runs that """secretly""" datamines you (from May 15 2025 as im too lazy to check it again). Note that i used LLMs to help me explain some of the code because I dont know a lot of javascript.

ANYWAYS HERE I GO

Boolean(window._phantom||window.callPhantom||window.__phantomas||window.Buffer||window.emit||window.spawn||window.webdriver||window.domAutomation||window.domAutomationController||window.document.documentElement.getAttribute('webdriver'));

Checks if youre using a webdriver (automated browser) to stop bots, though just use a good one like https://github.com/ultrafunkamsterdam/nodriver

 ['webkitPersistentStorage', 'webkitTemporaryStorage', 'webkitResolveLocalFileSystemURL'].filter(key => key '''in''' navigator).length + (navigator.vendor.indexOf('Google') === 0) + ['BatteryManager', 'webkitMediaStream', 'webkitSpeechGrammar'].filter(key => key '''in''' window).length

Checks if certain Webkit (Safari) APIs are accessible, also checks if your browser vendor is a Google one.

(() => { const f = new Float32Array(1); const u8 = new Uint8Array(f.buffer); f[0] = Infinity; f[0] = f[0] - f[0]; return u8[3];})();

Sees how floating-point values are represented in memory

window.screen.colorDepth

I shouldnt have to explain this one

parseFloat(navigator.deviceMemory)

Checks how much RAM you have

navigator.hardwareConcurrency

Checks how many logical cpu cores you have

window.outerWidth
window.outerHeight

Checks the window size

new Date().getTimezoneOffset()

Gets your timezone

(typeof chrome !== 'undefined' && typeof chrome.runtime !== 'undefined' && typeof chrome.runtime.sendMessage !== 'undefined') ? chrome.runtime.sendMessage('jpgljfpmoofbmlieejglhonfofmahini', {action: 'check_installed'}, response => chrome.runtime.lastError || response.is_installed !== 'yes' ? 0 : 1) : 0

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