2024-09-19 21:58:37 +03:00
|
|
|
|
import hashlib
|
|
|
|
|
import base64
|
|
|
|
|
import random
|
|
|
|
|
import json
|
|
|
|
|
import time
|
|
|
|
|
import uuid
|
|
|
|
|
|
2024-09-19 22:00:12 +03:00
|
|
|
|
from collections import OrderedDict, defaultdict
|
|
|
|
|
from typing import Any, Callable, Dict, List
|
|
|
|
|
|
2024-09-19 21:58:37 +03:00
|
|
|
|
from datetime import (
|
|
|
|
|
datetime,
|
|
|
|
|
timedelta,
|
|
|
|
|
timezone
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
cores = [16, 24, 32]
|
|
|
|
|
screens = [3000, 4000, 6000]
|
|
|
|
|
maxAttempts = 500000
|
|
|
|
|
|
|
|
|
|
navigator_keys = [
|
|
|
|
|
"registerProtocolHandler−function registerProtocolHandler() { [native code] }",
|
|
|
|
|
"storage−[object StorageManager]",
|
|
|
|
|
"locks−[object LockManager]",
|
|
|
|
|
"appCodeName−Mozilla",
|
|
|
|
|
"permissions−[object Permissions]",
|
|
|
|
|
"appVersion−5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0",
|
|
|
|
|
"share−function share() { [native code] }",
|
|
|
|
|
"webdriver−false",
|
|
|
|
|
"managed−[object NavigatorManagedData]",
|
|
|
|
|
"canShare−function canShare() { [native code] }",
|
|
|
|
|
"vendor−Google Inc.",
|
|
|
|
|
"vendor−Google Inc.",
|
|
|
|
|
"mediaDevices−[object MediaDevices]",
|
|
|
|
|
"vibrate−function vibrate() { [native code] }",
|
|
|
|
|
"storageBuckets−[object StorageBucketManager]",
|
|
|
|
|
"mediaCapabilities−[object MediaCapabilities]",
|
|
|
|
|
"getGamepads−function getGamepads() { [native code] }",
|
|
|
|
|
"bluetooth−[object Bluetooth]",
|
|
|
|
|
"share−function share() { [native code] }",
|
|
|
|
|
"cookieEnabled−true",
|
|
|
|
|
"virtualKeyboard−[object VirtualKeyboard]",
|
|
|
|
|
"product−Gecko",
|
|
|
|
|
"mediaDevices−[object MediaDevices]",
|
|
|
|
|
"canShare−function canShare() { [native code] }",
|
|
|
|
|
"getGamepads−function getGamepads() { [native code] }",
|
|
|
|
|
"product−Gecko",
|
|
|
|
|
"xr−[object XRSystem]",
|
|
|
|
|
"clipboard−[object Clipboard]",
|
|
|
|
|
"storageBuckets−[object StorageBucketManager]",
|
|
|
|
|
"unregisterProtocolHandler−function unregisterProtocolHandler() { [native code] }",
|
|
|
|
|
"productSub−20030107",
|
|
|
|
|
"login−[object NavigatorLogin]",
|
|
|
|
|
"vendorSub−",
|
|
|
|
|
"login−[object NavigatorLogin]",
|
|
|
|
|
"userAgent−Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0",
|
|
|
|
|
"getInstalledRelatedApps−function getInstalledRelatedApps() { [native code] }",
|
|
|
|
|
"userAgent−Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0",
|
|
|
|
|
"mediaDevices−[object MediaDevices]",
|
|
|
|
|
"locks−[object LockManager]",
|
|
|
|
|
"webkitGetUserMedia−function webkitGetUserMedia() { [native code] }",
|
|
|
|
|
"vendor−Google Inc.",
|
|
|
|
|
"xr−[object XRSystem]",
|
|
|
|
|
"mediaDevices−[object MediaDevices]",
|
|
|
|
|
"virtualKeyboard−[object VirtualKeyboard]",
|
|
|
|
|
"userAgent−Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0",
|
|
|
|
|
"virtualKeyboard−[object VirtualKeyboard]",
|
|
|
|
|
"appName−Netscape",
|
|
|
|
|
"storageBuckets−[object StorageBucketManager]",
|
|
|
|
|
"presentation−[object Presentation]",
|
|
|
|
|
"onLine−true",
|
|
|
|
|
"mimeTypes−[object MimeTypeArray]",
|
|
|
|
|
"credentials−[object CredentialsContainer]",
|
|
|
|
|
"presentation−[object Presentation]",
|
|
|
|
|
"getGamepads−function getGamepads() { [native code] }",
|
|
|
|
|
"vendorSub−",
|
|
|
|
|
"virtualKeyboard−[object VirtualKeyboard]",
|
|
|
|
|
"serviceWorker−[object ServiceWorkerContainer]",
|
|
|
|
|
"xr−[object XRSystem]",
|
|
|
|
|
"product−Gecko",
|
|
|
|
|
"keyboard−[object Keyboard]",
|
|
|
|
|
"gpu−[object GPU]",
|
|
|
|
|
"getInstalledRelatedApps−function getInstalledRelatedApps() { [native code] }",
|
|
|
|
|
"webkitPersistentStorage−[object DeprecatedStorageQuota]",
|
|
|
|
|
"doNotTrack",
|
|
|
|
|
"clearAppBadge−function clearAppBadge() { [native code] }",
|
|
|
|
|
"presentation−[object Presentation]",
|
|
|
|
|
"serial−[object Serial]",
|
|
|
|
|
"locks−[object LockManager]",
|
|
|
|
|
"requestMIDIAccess−function requestMIDIAccess() { [native code] }",
|
|
|
|
|
"locks−[object LockManager]",
|
|
|
|
|
"requestMediaKeySystemAccess−function requestMediaKeySystemAccess() { [native code] }",
|
|
|
|
|
"vendor−Google Inc.",
|
|
|
|
|
"pdfViewerEnabled−true",
|
|
|
|
|
"language−zh-CN",
|
|
|
|
|
"setAppBadge−function setAppBadge() { [native code] }",
|
|
|
|
|
"geolocation−[object Geolocation]",
|
|
|
|
|
"userAgentData−[object NavigatorUAData]",
|
|
|
|
|
"mediaCapabilities−[object MediaCapabilities]",
|
|
|
|
|
"requestMIDIAccess−function requestMIDIAccess() { [native code] }",
|
|
|
|
|
"getUserMedia−function getUserMedia() { [native code] }",
|
|
|
|
|
"mediaDevices−[object MediaDevices]",
|
|
|
|
|
"webkitPersistentStorage−[object DeprecatedStorageQuota]",
|
|
|
|
|
"userAgent−Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0",
|
|
|
|
|
"sendBeacon−function sendBeacon() { [native code] }",
|
|
|
|
|
"hardwareConcurrency−32",
|
|
|
|
|
"appVersion−5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0",
|
|
|
|
|
"credentials−[object CredentialsContainer]",
|
|
|
|
|
"storage−[object StorageManager]",
|
|
|
|
|
"cookieEnabled−true",
|
|
|
|
|
"pdfViewerEnabled−true",
|
|
|
|
|
"windowControlsOverlay−[object WindowControlsOverlay]",
|
|
|
|
|
"scheduling−[object Scheduling]",
|
|
|
|
|
"pdfViewerEnabled−true",
|
|
|
|
|
"hardwareConcurrency−32",
|
|
|
|
|
"xr−[object XRSystem]",
|
|
|
|
|
"userAgent−Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0",
|
|
|
|
|
"webdriver−false",
|
|
|
|
|
"getInstalledRelatedApps−function getInstalledRelatedApps() { [native code] }",
|
|
|
|
|
"getInstalledRelatedApps−function getInstalledRelatedApps() { [native code] }",
|
|
|
|
|
"bluetooth−[object Bluetooth]"
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
window_keys = [
|
|
|
|
|
"0",
|
|
|
|
|
"window",
|
|
|
|
|
"self",
|
|
|
|
|
"document",
|
|
|
|
|
"name",
|
|
|
|
|
"location",
|
|
|
|
|
"customElements",
|
|
|
|
|
"history",
|
|
|
|
|
"navigation",
|
|
|
|
|
"locationbar",
|
|
|
|
|
"menubar",
|
|
|
|
|
"personalbar",
|
|
|
|
|
"scrollbars",
|
|
|
|
|
"statusbar",
|
|
|
|
|
"toolbar",
|
|
|
|
|
"status",
|
|
|
|
|
"closed",
|
|
|
|
|
"frames",
|
|
|
|
|
"length",
|
|
|
|
|
"top",
|
|
|
|
|
"opener",
|
|
|
|
|
"parent",
|
|
|
|
|
"frameElement",
|
|
|
|
|
"navigator",
|
|
|
|
|
"origin",
|
|
|
|
|
"external",
|
|
|
|
|
"screen",
|
|
|
|
|
"innerWidth",
|
|
|
|
|
"innerHeight",
|
|
|
|
|
"scrollX",
|
|
|
|
|
"pageXOffset",
|
|
|
|
|
"scrollY",
|
|
|
|
|
"pageYOffset",
|
|
|
|
|
"visualViewport",
|
|
|
|
|
"screenX",
|
|
|
|
|
"screenY",
|
|
|
|
|
"outerWidth",
|
|
|
|
|
"outerHeight",
|
|
|
|
|
"devicePixelRatio",
|
|
|
|
|
"clientInformation",
|
|
|
|
|
"screenLeft",
|
|
|
|
|
"screenTop",
|
|
|
|
|
"styleMedia",
|
|
|
|
|
"onsearch",
|
|
|
|
|
"isSecureContext",
|
|
|
|
|
"trustedTypes",
|
|
|
|
|
"performance",
|
|
|
|
|
"onappinstalled",
|
|
|
|
|
"onbeforeinstallprompt",
|
|
|
|
|
"crypto",
|
|
|
|
|
"indexedDB",
|
|
|
|
|
"sessionStorage",
|
|
|
|
|
"localStorage",
|
|
|
|
|
"onbeforexrselect",
|
|
|
|
|
"onabort",
|
|
|
|
|
"onbeforeinput",
|
|
|
|
|
"onbeforematch",
|
|
|
|
|
"onbeforetoggle",
|
|
|
|
|
"onblur",
|
|
|
|
|
"oncancel",
|
|
|
|
|
"oncanplay",
|
|
|
|
|
"oncanplaythrough",
|
|
|
|
|
"onchange",
|
|
|
|
|
"onclick",
|
|
|
|
|
"onclose",
|
|
|
|
|
"oncontentvisibilityautostatechange",
|
|
|
|
|
"oncontextlost",
|
|
|
|
|
"oncontextmenu",
|
|
|
|
|
"oncontextrestored",
|
|
|
|
|
"oncuechange",
|
|
|
|
|
"ondblclick",
|
|
|
|
|
"ondrag",
|
|
|
|
|
"ondragend",
|
|
|
|
|
"ondragenter",
|
|
|
|
|
"ondragleave",
|
|
|
|
|
"ondragover",
|
|
|
|
|
"ondragstart",
|
|
|
|
|
"ondrop",
|
|
|
|
|
"ondurationchange",
|
|
|
|
|
"onemptied",
|
|
|
|
|
"onended",
|
|
|
|
|
"onerror",
|
|
|
|
|
"onfocus",
|
|
|
|
|
"onformdata",
|
|
|
|
|
"oninput",
|
|
|
|
|
"oninvalid",
|
|
|
|
|
"onkeydown",
|
|
|
|
|
"onkeypress",
|
|
|
|
|
"onkeyup",
|
|
|
|
|
"onload",
|
|
|
|
|
"onloadeddata",
|
|
|
|
|
"onloadedmetadata",
|
|
|
|
|
"onloadstart",
|
|
|
|
|
"onmousedown",
|
|
|
|
|
"onmouseenter",
|
|
|
|
|
"onmouseleave",
|
|
|
|
|
"onmousemove",
|
|
|
|
|
"onmouseout",
|
|
|
|
|
"onmouseover",
|
|
|
|
|
"onmouseup",
|
|
|
|
|
"onmousewheel",
|
|
|
|
|
"onpause",
|
|
|
|
|
"onplay",
|
|
|
|
|
"onplaying",
|
|
|
|
|
"onprogress",
|
|
|
|
|
"onratechange",
|
|
|
|
|
"onreset",
|
|
|
|
|
"onresize",
|
|
|
|
|
"onscroll",
|
|
|
|
|
"onsecuritypolicyviolation",
|
|
|
|
|
"onseeked",
|
|
|
|
|
"onseeking",
|
|
|
|
|
"onselect",
|
|
|
|
|
"onslotchange",
|
|
|
|
|
"onstalled",
|
|
|
|
|
"onsubmit",
|
|
|
|
|
"onsuspend",
|
|
|
|
|
"ontimeupdate",
|
|
|
|
|
"ontoggle",
|
|
|
|
|
"onvolumechange",
|
|
|
|
|
"onwaiting",
|
|
|
|
|
"onwebkitanimationend",
|
|
|
|
|
"onwebkitanimationiteration",
|
|
|
|
|
"onwebkitanimationstart",
|
|
|
|
|
"onwebkittransitionend",
|
|
|
|
|
"onwheel",
|
|
|
|
|
"onauxclick",
|
|
|
|
|
"ongotpointercapture",
|
|
|
|
|
"onlostpointercapture",
|
|
|
|
|
"onpointerdown",
|
|
|
|
|
"onpointermove",
|
|
|
|
|
"onpointerrawupdate",
|
|
|
|
|
"onpointerup",
|
|
|
|
|
"onpointercancel",
|
|
|
|
|
"onpointerover",
|
|
|
|
|
"onpointerout",
|
|
|
|
|
"onpointerenter",
|
|
|
|
|
"onpointerleave",
|
|
|
|
|
"onselectstart",
|
|
|
|
|
"onselectionchange",
|
|
|
|
|
"onanimationend",
|
|
|
|
|
"onanimationiteration",
|
|
|
|
|
"onanimationstart",
|
|
|
|
|
"ontransitionrun",
|
|
|
|
|
"ontransitionstart",
|
|
|
|
|
"ontransitionend",
|
|
|
|
|
"ontransitioncancel",
|
|
|
|
|
"onafterprint",
|
|
|
|
|
"onbeforeprint",
|
|
|
|
|
"onbeforeunload",
|
|
|
|
|
"onhashchange",
|
|
|
|
|
"onlanguagechange",
|
|
|
|
|
"onmessage",
|
|
|
|
|
"onmessageerror",
|
|
|
|
|
"onoffline",
|
|
|
|
|
"ononline",
|
|
|
|
|
"onpagehide",
|
|
|
|
|
"onpageshow",
|
|
|
|
|
"onpopstate",
|
|
|
|
|
"onrejectionhandled",
|
|
|
|
|
"onstorage",
|
|
|
|
|
"onunhandledrejection",
|
|
|
|
|
"onunload",
|
|
|
|
|
"crossOriginIsolated",
|
|
|
|
|
"scheduler",
|
|
|
|
|
"alert",
|
|
|
|
|
"atob",
|
|
|
|
|
"blur",
|
|
|
|
|
"btoa",
|
|
|
|
|
"cancelAnimationFrame",
|
|
|
|
|
"cancelIdleCallback",
|
|
|
|
|
"captureEvents",
|
|
|
|
|
"clearInterval",
|
|
|
|
|
"clearTimeout",
|
|
|
|
|
"close",
|
|
|
|
|
"confirm",
|
|
|
|
|
"createImageBitmap",
|
|
|
|
|
"fetch",
|
|
|
|
|
"find",
|
|
|
|
|
"focus",
|
|
|
|
|
"getComputedStyle",
|
|
|
|
|
"getSelection",
|
|
|
|
|
"matchMedia",
|
|
|
|
|
"moveBy",
|
|
|
|
|
"moveTo",
|
|
|
|
|
"open",
|
|
|
|
|
"postMessage",
|
|
|
|
|
"print",
|
|
|
|
|
"prompt",
|
|
|
|
|
"queueMicrotask",
|
|
|
|
|
"releaseEvents",
|
|
|
|
|
"reportError",
|
|
|
|
|
"requestAnimationFrame",
|
|
|
|
|
"requestIdleCallback",
|
|
|
|
|
"resizeBy",
|
|
|
|
|
"resizeTo",
|
|
|
|
|
"scroll",
|
|
|
|
|
"scrollBy",
|
|
|
|
|
"scrollTo",
|
|
|
|
|
"setInterval",
|
|
|
|
|
"setTimeout",
|
|
|
|
|
"stop",
|
|
|
|
|
"structuredClone",
|
|
|
|
|
"webkitCancelAnimationFrame",
|
|
|
|
|
"webkitRequestAnimationFrame",
|
|
|
|
|
"chrome",
|
|
|
|
|
"g_opr",
|
|
|
|
|
"opr",
|
|
|
|
|
"ethereum",
|
|
|
|
|
"caches",
|
|
|
|
|
"cookieStore",
|
|
|
|
|
"ondevicemotion",
|
|
|
|
|
"ondeviceorientation",
|
|
|
|
|
"ondeviceorientationabsolute",
|
|
|
|
|
"launchQueue",
|
|
|
|
|
"documentPictureInPicture",
|
|
|
|
|
"getScreenDetails",
|
|
|
|
|
"queryLocalFonts",
|
|
|
|
|
"showDirectoryPicker",
|
|
|
|
|
"showOpenFilePicker",
|
|
|
|
|
"showSaveFilePicker",
|
|
|
|
|
"originAgentCluster",
|
|
|
|
|
"credentialless",
|
|
|
|
|
"speechSynthesis",
|
|
|
|
|
"onscrollend",
|
|
|
|
|
"webkitRequestFileSystem",
|
|
|
|
|
"webkitResolveLocalFileSystemURL",
|
|
|
|
|
"__remixContext",
|
|
|
|
|
"__oai_SSR_TTI",
|
|
|
|
|
"__remixManifest",
|
|
|
|
|
"__reactRouterVersion",
|
|
|
|
|
"DD_RUM",
|
|
|
|
|
"__REACT_INTL_CONTEXT__",
|
|
|
|
|
"filterCSS",
|
|
|
|
|
"filterXSS",
|
|
|
|
|
"__SEGMENT_INSPECTOR__",
|
|
|
|
|
"DD_LOGS",
|
|
|
|
|
"regeneratorRuntime",
|
|
|
|
|
"_g",
|
|
|
|
|
"__remixRouteModules",
|
|
|
|
|
"__remixRouter",
|
|
|
|
|
"__STATSIG_SDK__",
|
|
|
|
|
"__STATSIG_JS_SDK__",
|
|
|
|
|
"__STATSIG_RERENDER_OVERRIDE__",
|
|
|
|
|
"_oaiHandleSessionExpired"
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
def get_parse_time():
|
|
|
|
|
now = datetime.now(timezone(timedelta(hours=-5)))
|
|
|
|
|
return now.strftime("%a %b %d %Y %H:%M:%S") + " GMT+0200 (Central European Summer Time)"
|
|
|
|
|
|
|
|
|
|
def get_config(user_agent):
|
|
|
|
|
|
|
|
|
|
core = random.choice(cores)
|
|
|
|
|
screen = random.choice(screens)
|
|
|
|
|
|
|
|
|
|
# partially hardcoded config
|
|
|
|
|
config = [
|
|
|
|
|
core + screen,
|
|
|
|
|
get_parse_time(),
|
|
|
|
|
4294705152,
|
|
|
|
|
random.random(),
|
|
|
|
|
user_agent,
|
|
|
|
|
None,
|
|
|
|
|
"remix-prod-15f1ec0f78ad898b9606a88d384ef76345b82b82", #document.documentElement.getAttribute("data-build"),
|
|
|
|
|
"en-US",
|
|
|
|
|
"en-US,es-US,en,es",
|
|
|
|
|
0,
|
|
|
|
|
random.choice(navigator_keys),
|
|
|
|
|
'location',
|
|
|
|
|
random.choice(window_keys),
|
|
|
|
|
time.perf_counter(),
|
|
|
|
|
str(uuid.uuid4()),
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
return config
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_answer_token(seed, diff, config):
|
|
|
|
|
answer, solved = generate_answer(seed, diff, config)
|
|
|
|
|
|
|
|
|
|
if solved:
|
|
|
|
|
return "gAAAAAB" + answer
|
|
|
|
|
else:
|
|
|
|
|
raise Exception("Failed to solve 'gAAAAAB' challenge")
|
|
|
|
|
|
|
|
|
|
def generate_answer(seed, diff, config):
|
|
|
|
|
diff_len = len(diff)
|
|
|
|
|
seed_encoded = seed.encode()
|
|
|
|
|
p1 = (json.dumps(config[:3], separators=(',', ':'), ensure_ascii=False)[:-1] + ',').encode()
|
|
|
|
|
p2 = (',' + json.dumps(config[4:9], separators=(',', ':'), ensure_ascii=False)[1:-1] + ',').encode()
|
|
|
|
|
p3 = (',' + json.dumps(config[10:], separators=(',', ':'), ensure_ascii=False)[1:]).encode()
|
|
|
|
|
|
|
|
|
|
target_diff = bytes.fromhex(diff)
|
|
|
|
|
|
|
|
|
|
for i in range(maxAttempts):
|
|
|
|
|
d1 = str(i).encode()
|
|
|
|
|
d2 = str(i >> 1).encode()
|
|
|
|
|
|
|
|
|
|
string = (
|
|
|
|
|
p1
|
|
|
|
|
+ d1
|
|
|
|
|
+ p2
|
|
|
|
|
+ d2
|
|
|
|
|
+ p3
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
base_encode = base64.b64encode(string)
|
|
|
|
|
hash_value = hashlib.new("sha3_512", seed_encoded + base_encode).digest()
|
|
|
|
|
|
|
|
|
|
if hash_value[:diff_len] <= target_diff:
|
|
|
|
|
return base_encode.decode(), True
|
|
|
|
|
|
|
|
|
|
return 'wQ8Lk5FbGpA2NcR9dShT6gYjU7VxZ4D' + base64.b64encode(f'"{seed}"'.encode()).decode(), False
|
|
|
|
|
|
|
|
|
|
def get_requirements_token(config):
|
|
|
|
|
require, solved = generate_answer(format(random.random()), "0fffff", config)
|
|
|
|
|
|
|
|
|
|
if solved:
|
|
|
|
|
return 'gAAAAAC' + require
|
|
|
|
|
else:
|
|
|
|
|
raise Exception("Failed to solve 'gAAAAAC' challenge")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### processing turnstile token
|
|
|
|
|
|
|
|
|
|
class OrderedMap:
|
|
|
|
|
def __init__(self):
|
|
|
|
|
self.map = OrderedDict()
|
|
|
|
|
|
|
|
|
|
def add(self, key: str, value: Any):
|
|
|
|
|
self.map[key] = value
|
|
|
|
|
|
|
|
|
|
def to_json(self):
|
|
|
|
|
return json.dumps(self.map)
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return self.to_json()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TurnTokenList = List[List[Any]]
|
|
|
|
|
FloatMap = Dict[float, Any]
|
|
|
|
|
StringMap = Dict[str, Any]
|
|
|
|
|
FuncType = Callable[..., Any]
|
|
|
|
|
|
|
|
|
|
start_time = time.time()
|
|
|
|
|
|
|
|
|
|
def get_turnstile_token(dx: str, p: str) -> str:
|
|
|
|
|
decoded_bytes = base64.b64decode(dx)
|
|
|
|
|
# print(decoded_bytes.decode())
|
|
|
|
|
return process_turnstile_token(decoded_bytes.decode(), p)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def process_turnstile_token(dx: str, p: str) -> str:
|
|
|
|
|
result = []
|
|
|
|
|
p_length = len(p)
|
|
|
|
|
if p_length != 0:
|
|
|
|
|
for i, r in enumerate(dx):
|
|
|
|
|
result.append(chr(ord(r) ^ ord(p[i % p_length])))
|
|
|
|
|
else:
|
|
|
|
|
result = list(dx)
|
|
|
|
|
return "".join(result)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def is_slice(input_val: Any) -> bool:
|
|
|
|
|
return isinstance(input_val, (list, tuple))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def is_float(input_val: Any) -> bool:
|
|
|
|
|
return isinstance(input_val, float)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def is_string(input_val: Any) -> bool:
|
|
|
|
|
return isinstance(input_val, str)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def to_str(input_val: Any) -> str:
|
|
|
|
|
if input_val is None:
|
|
|
|
|
return "undefined"
|
|
|
|
|
elif is_float(input_val):
|
|
|
|
|
return f"{input_val:.16g}"
|
|
|
|
|
elif is_string(input_val):
|
|
|
|
|
special_cases = {
|
|
|
|
|
"window.Math": "[object Math]",
|
|
|
|
|
"window.Reflect": "[object Reflect]",
|
|
|
|
|
"window.performance": "[object Performance]",
|
|
|
|
|
"window.localStorage": "[object Storage]",
|
|
|
|
|
"window.Object": "function Object() { [native code] }",
|
|
|
|
|
"window.Reflect.set": "function set() { [native code] }",
|
|
|
|
|
"window.performance.now": "function () { [native code] }",
|
|
|
|
|
"window.Object.create": "function create() { [native code] }",
|
|
|
|
|
"window.Object.keys": "function keys() { [native code] }",
|
|
|
|
|
"window.Math.random": "function random() { [native code] }",
|
|
|
|
|
}
|
|
|
|
|
return special_cases.get(input_val, input_val)
|
|
|
|
|
elif isinstance(input_val, list) and all(
|
|
|
|
|
isinstance(item, str) for item in input_val
|
|
|
|
|
):
|
|
|
|
|
return ",".join(input_val)
|
|
|
|
|
else:
|
|
|
|
|
# print(f"Type of input is: {type(input_val)}")
|
|
|
|
|
return str(input_val)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_func_map() -> FloatMap:
|
|
|
|
|
process_map: FloatMap = defaultdict(lambda: None)
|
|
|
|
|
|
|
|
|
|
def func_1(e: float, t: float):
|
|
|
|
|
e_str = to_str(process_map[e])
|
|
|
|
|
t_str = to_str(process_map[t])
|
|
|
|
|
if e_str is not None and t_str is not None:
|
|
|
|
|
res = process_turnstile_token(e_str, t_str)
|
|
|
|
|
process_map[e] = res
|
|
|
|
|
else:
|
|
|
|
|
pass
|
|
|
|
|
# print(f"Warning: Unable to process func_1 for e={e}, t={t}")
|
|
|
|
|
|
|
|
|
|
def func_2(e: float, t: Any):
|
|
|
|
|
process_map[e] = t
|
|
|
|
|
|
|
|
|
|
def func_5(e: float, t: float):
|
|
|
|
|
n = process_map[e]
|
|
|
|
|
tres = process_map[t]
|
|
|
|
|
if n is None:
|
|
|
|
|
process_map[e] = tres
|
|
|
|
|
elif is_slice(n):
|
|
|
|
|
nt = n + [tres] if tres is not None else n
|
|
|
|
|
process_map[e] = nt
|
|
|
|
|
else:
|
|
|
|
|
if is_string(n) or is_string(tres):
|
|
|
|
|
res = to_str(n) + to_str(tres)
|
|
|
|
|
elif is_float(n) and is_float(tres):
|
|
|
|
|
res = n + tres
|
|
|
|
|
else:
|
|
|
|
|
res = "NaN"
|
|
|
|
|
process_map[e] = res
|
|
|
|
|
|
|
|
|
|
def func_6(e: float, t: float, n: float):
|
|
|
|
|
tv = process_map[t]
|
|
|
|
|
nv = process_map[n]
|
|
|
|
|
if is_string(tv) and is_string(nv):
|
|
|
|
|
res = f"{tv}.{nv}"
|
|
|
|
|
if res == "window.document.location":
|
|
|
|
|
process_map[e] = "https://chatgpt.com/"
|
|
|
|
|
else:
|
|
|
|
|
process_map[e] = res
|
|
|
|
|
else:
|
|
|
|
|
pass
|
|
|
|
|
# print("func type 6 error")
|
|
|
|
|
|
|
|
|
|
def func_24(e: float, t: float, n: float):
|
|
|
|
|
tv = process_map[t]
|
|
|
|
|
nv = process_map[n]
|
|
|
|
|
if is_string(tv) and is_string(nv):
|
|
|
|
|
process_map[e] = f"{tv}.{nv}"
|
|
|
|
|
else:
|
|
|
|
|
pass
|
|
|
|
|
# print("func type 24 error")
|
|
|
|
|
|
|
|
|
|
def func_7(e: float, *args):
|
|
|
|
|
n = [process_map[arg] for arg in args]
|
|
|
|
|
ev = process_map[e]
|
|
|
|
|
if isinstance(ev, str):
|
|
|
|
|
if ev == "window.Reflect.set":
|
|
|
|
|
obj = n[0]
|
|
|
|
|
key_str = str(n[1])
|
|
|
|
|
val = n[2]
|
|
|
|
|
obj.add(key_str, val)
|
|
|
|
|
elif callable(ev):
|
|
|
|
|
ev(*n)
|
|
|
|
|
|
|
|
|
|
def func_17(e: float, t: float, *args):
|
|
|
|
|
i = [process_map[arg] for arg in args]
|
|
|
|
|
tv = process_map[t]
|
|
|
|
|
res = None
|
|
|
|
|
if isinstance(tv, str):
|
|
|
|
|
if tv == "window.performance.now":
|
|
|
|
|
current_time = time.time_ns()
|
|
|
|
|
elapsed_ns = current_time - int(start_time * 1e9)
|
|
|
|
|
res = (elapsed_ns + random.random()) / 1e6
|
|
|
|
|
elif tv == "window.Object.create":
|
|
|
|
|
res = OrderedMap()
|
|
|
|
|
elif tv == "window.Object.keys":
|
|
|
|
|
if isinstance(i[0], str) and i[0] == "window.localStorage":
|
|
|
|
|
res = [
|
|
|
|
|
"STATSIG_LOCAL_STORAGE_INTERNAL_STORE_V4",
|
|
|
|
|
"STATSIG_LOCAL_STORAGE_STABLE_ID",
|
|
|
|
|
"client-correlated-secret",
|
|
|
|
|
"oai/apps/capExpiresAt",
|
|
|
|
|
"oai-did",
|
|
|
|
|
"STATSIG_LOCAL_STORAGE_LOGGING_REQUEST",
|
|
|
|
|
"UiState.isNavigationCollapsed.1",
|
|
|
|
|
]
|
|
|
|
|
elif tv == "window.Math.random":
|
|
|
|
|
res = random.random()
|
|
|
|
|
elif callable(tv):
|
|
|
|
|
res = tv(*i)
|
|
|
|
|
process_map[e] = res
|
|
|
|
|
|
|
|
|
|
def func_8(e: float, t: float):
|
|
|
|
|
process_map[e] = process_map[t]
|
|
|
|
|
|
|
|
|
|
def func_14(e: float, t: float):
|
|
|
|
|
tv = process_map[t]
|
|
|
|
|
if is_string(tv):
|
|
|
|
|
try:
|
|
|
|
|
token_list = json.loads(tv)
|
|
|
|
|
process_map[e] = token_list
|
|
|
|
|
except json.JSONDecodeError:
|
|
|
|
|
# print(f"Warning: Unable to parse JSON for key {t}")
|
|
|
|
|
process_map[e] = None
|
|
|
|
|
else:
|
|
|
|
|
# print(f"Warning: Value for key {t} is not a string")
|
|
|
|
|
process_map[e] = None
|
|
|
|
|
|
|
|
|
|
def func_15(e: float, t: float):
|
|
|
|
|
tv = process_map[t]
|
|
|
|
|
process_map[e] = json.dumps(tv)
|
|
|
|
|
|
|
|
|
|
def func_18(e: float):
|
|
|
|
|
ev = process_map[e]
|
|
|
|
|
e_str = to_str(ev)
|
|
|
|
|
decoded = base64.b64decode(e_str).decode()
|
|
|
|
|
process_map[e] = decoded
|
|
|
|
|
|
|
|
|
|
def func_19(e: float):
|
|
|
|
|
ev = process_map[e]
|
|
|
|
|
e_str = to_str(ev)
|
|
|
|
|
encoded = base64.b64encode(e_str.encode()).decode()
|
|
|
|
|
process_map[e] = encoded
|
|
|
|
|
|
|
|
|
|
def func_20(e: float, t: float, n: float, *args):
|
|
|
|
|
o = [process_map[arg] for arg in args]
|
|
|
|
|
ev = process_map[e]
|
|
|
|
|
tv = process_map[t]
|
|
|
|
|
if ev == tv:
|
|
|
|
|
nv = process_map[n]
|
|
|
|
|
if callable(nv):
|
|
|
|
|
nv(*o)
|
|
|
|
|
else:
|
|
|
|
|
pass
|
|
|
|
|
# print("func type 20 error")
|
|
|
|
|
|
|
|
|
|
def func_21(*args):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def func_23(e: float, t: float, *args):
|
|
|
|
|
i = list(args)
|
|
|
|
|
ev = process_map[e]
|
|
|
|
|
tv = process_map[t]
|
|
|
|
|
if ev is not None and callable(tv):
|
|
|
|
|
tv(*i)
|
|
|
|
|
|
|
|
|
|
process_map.update(
|
|
|
|
|
{
|
|
|
|
|
1: func_1,
|
|
|
|
|
2: func_2,
|
|
|
|
|
5: func_5,
|
|
|
|
|
6: func_6,
|
|
|
|
|
7: func_7,
|
|
|
|
|
8: func_8,
|
|
|
|
|
10: "window",
|
|
|
|
|
14: func_14,
|
|
|
|
|
15: func_15,
|
|
|
|
|
17: func_17,
|
|
|
|
|
18: func_18,
|
|
|
|
|
19: func_19,
|
|
|
|
|
20: func_20,
|
|
|
|
|
21: func_21,
|
|
|
|
|
23: func_23,
|
|
|
|
|
24: func_24,
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
return process_map
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def process_turnstile(dx: str, p: str) -> str:
|
|
|
|
|
tokens = get_turnstile_token(dx, p)
|
|
|
|
|
res = ""
|
|
|
|
|
token_list = json.loads(tokens)
|
|
|
|
|
process_map = get_func_map()
|
|
|
|
|
|
|
|
|
|
def func_3(e: str):
|
|
|
|
|
nonlocal res
|
|
|
|
|
res = base64.b64encode(e.encode()).decode()
|
|
|
|
|
|
|
|
|
|
process_map[3] = func_3
|
|
|
|
|
process_map[9] = token_list
|
|
|
|
|
process_map[16] = p
|
|
|
|
|
|
|
|
|
|
for token in token_list:
|
|
|
|
|
try:
|
|
|
|
|
e = token[0]
|
|
|
|
|
t = token[1:]
|
|
|
|
|
f = process_map.get(e)
|
|
|
|
|
if callable(f):
|
|
|
|
|
f(*t)
|
|
|
|
|
else:
|
|
|
|
|
pass
|
|
|
|
|
# print(f"Warning: No function found for key {e}")
|
|
|
|
|
except Exception as exc:
|
|
|
|
|
raise Exception(f"Error processing token {token}: {exc}")
|
|
|
|
|
# print(f"Error processing token {token}: {exc}")
|
|
|
|
|
|
|
|
|
|
return res
|