├── manual.py ├── images ├── image.png ├── image-1.png ├── image-2.png ├── image-3.png └── image-4.png ├── wrapper ├── __pycache__ │ ├── sex.cpython-312.pyc │ ├── vm.cpython-312.pyc │ ├── logger.cpython-312.pyc │ ├── motion.cpython-312.pyc │ ├── parse.cpython-312.pyc │ ├── parser.cpython-312.pyc │ ├── solve.cpython-312.pyc │ ├── solver.cpython-312.pyc │ ├── w_data.cpython-312.pyc │ ├── __init__.cpython-312.pyc │ ├── aa_value.cpython-312.pyc │ ├── chatgpt.cpython-312.pyc │ ├── cryptor.cpython-312.pyc │ ├── encrypt.cpython-312.pyc │ ├── headers.cpython-312.pyc │ ├── ip_info.cpython-312.pyc │ ├── runtime.cpython-312.pyc │ ├── solve_cf.cpython-312.pyc │ ├── tt_value.cpython-312.pyc │ ├── challenge.cpython-312.pyc │ ├── challenges.cpython-312.pyc │ ├── encryptor.cpython-312.pyc │ ├── parse_xor.cpython-312.pyc │ ├── solve_audio.cpython-312.pyc │ └── solve_challenge.cpython-312.pyc ├── reverse │ ├── __pycache__ │ │ ├── vm.cpython-312.pyc │ │ ├── parse.cpython-312.pyc │ │ ├── challenges.cpython-312.pyc │ │ └── decompiler.cpython-312.pyc │ ├── challenges.py │ ├── vm.py │ ├── parse.py │ └── decompiler.py ├── IP_Info │ ├── __pycache__ │ │ ├── headers.cpython-312.pyc │ │ └── ip_info.cpython-312.pyc │ ├── ip_info.py │ └── headers.py ├── __init__.py ├── runtime.py ├── logger.py └── chatgpt.py ├── api_server.py ├── readme.md └── decompiled.js /manual.py: -------------------------------------------------------------------------------- 1 | from wrapper import ChatGPT 2 | 3 | print(ChatGPT().ask_question("Test")) -------------------------------------------------------------------------------- /images/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/images/image.png -------------------------------------------------------------------------------- /images/image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/images/image-1.png -------------------------------------------------------------------------------- /images/image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/images/image-2.png -------------------------------------------------------------------------------- /images/image-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/images/image-3.png -------------------------------------------------------------------------------- /images/image-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/images/image-4.png -------------------------------------------------------------------------------- /wrapper/__pycache__/sex.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/sex.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/vm.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/vm.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/logger.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/logger.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/motion.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/motion.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/parse.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/parse.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/parser.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/parser.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/solve.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/solve.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/solver.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/solver.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/w_data.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/w_data.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/__init__.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/__init__.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/aa_value.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/aa_value.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/chatgpt.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/chatgpt.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/cryptor.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/cryptor.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/encrypt.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/encrypt.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/headers.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/headers.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/ip_info.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/ip_info.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/runtime.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/runtime.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/solve_cf.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/solve_cf.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/tt_value.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/tt_value.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/challenge.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/challenge.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/challenges.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/challenges.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/encryptor.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/encryptor.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/parse_xor.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/parse_xor.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/solve_audio.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/solve_audio.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/reverse/__pycache__/vm.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/reverse/__pycache__/vm.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/reverse/__pycache__/parse.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/reverse/__pycache__/parse.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/IP_Info/__pycache__/headers.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/IP_Info/__pycache__/headers.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/IP_Info/__pycache__/ip_info.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/IP_Info/__pycache__/ip_info.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__pycache__/solve_challenge.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/__pycache__/solve_challenge.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/reverse/__pycache__/challenges.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/reverse/__pycache__/challenges.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/reverse/__pycache__/decompiler.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realasfngl/ChatGPT/HEAD/wrapper/reverse/__pycache__/decompiler.cpython-312.pyc -------------------------------------------------------------------------------- /wrapper/__init__.py: -------------------------------------------------------------------------------- 1 | from .logger import Log 2 | from .runtime import Run, Utils 3 | from .IP_Info.headers import Headers 4 | from .reverse.challenges import Challenges 5 | from .reverse.parse import Parser 6 | from .reverse.vm import VM 7 | from .IP_Info.ip_info import IP_Info 8 | from .chatgpt import ChatGPT -------------------------------------------------------------------------------- /wrapper/IP_Info/ip_info.py: -------------------------------------------------------------------------------- 1 | from curl_cffi import requests 2 | from ..logger import Log 3 | from ..runtime import Utils 4 | 5 | 6 | class IP_Info: 7 | 8 | @staticmethod 9 | def fetch_info(session: requests.session.Session) -> str: 10 | 11 | ip_infos: list = [] 12 | 13 | info_request: requests.models.Response = session.get('https://iplocation.com/') 14 | 15 | ip_infos.append(Utils.between(info_request.text, '
Hello world
", { url: "https://chatgpt.com/" }); 3 | const window = dom.window; 4 | var mem = {}; 5 | function XOR_STR(e, t) { 6 | e = String(e); 7 | t = String(t); 8 | let n = ""; 9 | for (let r = 0; r < e.length; r++) 10 | n += String.fromCharCode(e.charCodeAt(r) ^ t.charCodeAt(r % t.length)); 11 | return n; 12 | } 13 | 14 | var var_10 = window; 15 | var var_94_65 = 65.82; 16 | var var_10_27 = "set"; 17 | var var_10_27 = window["Reflect"]["set"]; 18 | var var_17_41 = "create"; 19 | var var_17_41 = window["Object"]["create"]; 20 | var var_94_65 = XOR_STR(var_94_65, var_94_65); 21 | var var_94_65 = btoa("" + var_94_65); 22 | var var_86_99 = 86.06; 23 | var var_36_48 = "localStorage"; 24 | var var_36_48 = window["localStorage"]; 25 | var var_61_37 = 2000; 26 | var var_94_65 = XOR_STR(var_94_65, var_86_99); 27 | var var_94_65 = btoa("" + var_94_65); 28 | var var_33_97 = "now"; 29 | var var_33_97 = window["performance"]["now"].bind(window["performance"]); 30 | var var_86_99 = 36.56; 31 | var var_43_93 = var_33_97(); 32 | var var_52_53 = null; 33 | var var_82_53 = var_17_41(var_52_53); 34 | var var_86_99 = 50.43; 35 | var var_88_1 = "navigator"; 36 | var var_67_47 = 29.45; 37 | var var_88_1 = window["navigator"]; 38 | var var_20_04 = "aWIbBRYADwIRAAQXFwgUEgEbHwkLZAIRYwAKAAYJHhkWAxYHCgIRAAAXGwJlHhl1AwwcCRkdGAsNAAcNHhkXARYBCnMdGGkIFh8NAxUOCQocDB0dGAcMAAcLbxUOagsHFx0CFBIMGh8OARUOCQocDB1sZQ=="; 39 | var var_86_99 = 69.58; 40 | var var_20_87 = 0.1; 41 | var var_47_28 = 0.6000000000000001; 42 | var var_55_63 = 48.51; 43 | var var_78_68 = 19.33; 44 | var var_20_87 = Array.isArray(var_20_87) ? (var_20_87.push(var_47_28), var_20_87) : var_20_87 + var_47_28; 45 | var var_20_87 = XOR_STR(var_20_87, var_55_63); 46 | var var_20_87 = btoa("" + var_20_87); 47 | var_82_53[var_78_68] = var_20_87; 48 | var var_33_8 = []; 49 | var var_82_7 = "vendor"; 50 | try { mem[var_82_7] = var_88_1[var_82_7]; } catch(r) { var_33_8 = "" + r; } 51 | var var_33_8 = Array.isArray(var_33_8) ? (var_33_8.push(var_82_7), var_33_8) : var_33_8 + var_82_7; 52 | var var_34_13 = "platform"; 53 | try { mem[var_34_13] = var_88_1[var_34_13]; } catch(r) { var_33_8 = "" + r; } 54 | var var_33_8 = Array.isArray(var_33_8) ? (var_33_8.push(var_34_13), var_33_8) : var_33_8 + var_34_13; 55 | var var_2_52 = "deviceMemory"; 56 | var var_94_65 = 5.37; 57 | try { mem[var_2_52] = var_88_1[var_2_52]; } catch(r) { var_33_8 = "" + r; } 58 | var var_33_8 = Array.isArray(var_33_8) ? (var_33_8.push(var_2_52), var_33_8) : var_33_8 + var_2_52; 59 | var var_50_72 = "maxTouchPoints"; 60 | try { mem[var_50_72] = var_88_1[var_50_72]; } catch(r) { var_33_8 = "" + r; } 61 | var var_33_8 = Array.isArray(var_33_8) ? (var_33_8.push(var_50_72), var_33_8) : var_33_8 + var_50_72; 62 | var var_33_8 = JSON.stringify(var_33_8); 63 | var var_33_8 = XOR_STR(var_33_8, var_55_63); 64 | var var_94_65 = XOR_STR(var_94_65, var_94_65); 65 | var var_94_65 = btoa("" + var_94_65); 66 | var var_33_8 = btoa("" + var_33_8); 67 | var var_57_57 = 56.04; 68 | var_82_53[var_57_57] = var_33_8; 69 | var var_55_63 = 48.51; 70 | var var_95_86 = 14.85; 71 | var var_5_35 = "createElement"; 72 | var var_5_35 = window["document"]["createElement"].bind(window["document"]); 73 | var var_12_62 = "div"; 74 | var var_12_62 = var_5_35(var_12_62); 75 | var var_89_53 = "style"; 76 | var var_89_53 = var_12_62["style"]; 77 | var var_70_3 = "hidden"; 78 | var var_63_32 = "visibility"; 79 | var_89_53[var_63_32] = var_70_3; 80 | var var_94_65 = 7.04; 81 | var var_46_21 = "ariaHidden"; 82 | var var_94_65 = XOR_STR(var_94_65, var_94_65); 83 | var var_94_65 = btoa("" + var_94_65); 84 | var var_52_83 = "True"; 85 | var_12_62[var_46_21] = var_52_83; 86 | var var_42_87 = "position"; 87 | var var_41_49 = "fixed"; 88 | var var_86_99 = 61.16; 89 | var_89_53[var_42_87] = var_41_49; 90 | var var_36_61 = "Impact"; 91 | var var_22_22 = "fontFamily"; 92 | var_89_53[var_22_22] = var_36_61; 93 | var var_65_3 = "10px"; 94 | var var_2_62 = "fontSize"; 95 | var var_77_52 = 43.91; 96 | var var_86_99 = btoa("" + var_86_99); 97 | var_82_53[var_77_52] = var_86_99; 98 | var_89_53[var_2_62] = var_65_3; 99 | var var_34_26 = "q̡̨̩̂̎ś̜̑̈G̦̭̟"; 100 | var var_96_27 = "innerText"; 101 | var_12_62[var_96_27] = var_34_26; 102 | var var_71_49 = "appendChild"; 103 | var var_71_49 = window["document"]["body"]["appendChild"].bind(window["document"]["body"]); 104 | var var_86_99 = 93.87; 105 | var_71_49(var_12_62); 106 | var var_14_87 = "getBoundingClientRect"; 107 | var var_94_65 = 90.6; 108 | var var_14_87 = var_12_62["getBoundingClientRect"].bind(var_12_62); 109 | var var_98_31 = var_14_87(); 110 | var var_98_31 = JSON.stringify(var_98_31); 111 | var var_98_31 = XOR_STR(var_98_31, var_55_63); 112 | var var_98_31 = btoa("" + var_98_31); 113 | var_82_53[var_95_86] = var_98_31; 114 | var var_94_99 = "removeChild"; 115 | var var_94_99 = window["document"]["body"]["removeChild"].bind(window["document"]["body"]); 116 | var_94_99(var_12_62); 117 | var var_4_41 = 31.17; 118 | var var_44_93 = "keys"; 119 | var var_44_93 = window["Object"]["keys"]; 120 | var var_86_99 = 76.2; 121 | var var_30_99 = var_44_93(var_36_48); 122 | var var_30_99 = XOR_STR(var_30_99, var_55_63); 123 | var var_30_99 = btoa("" + var_30_99); 124 | var_82_53[var_4_41] = var_30_99; 125 | var var_89_68 = "length"; 126 | var var_89_68 = window["history"]["length"]; 127 | var var_89_68 = XOR_STR(var_89_68, var_55_63); 128 | var var_89_68 = btoa("" + var_89_68); 129 | var var_87_58 = var_33_97(); 130 | Math.abs(var_43_93 - var_87_58) > var_61_37 ? var_7_75 = var_20_04 : null; 131 | var var_7_75 = var_7_75 !== void 0 ? (mem["99.65"] = "42.93", var_7_75) : var_7_75; 132 | var var_7_75 = var_7_75 !== void 0 ? (var_10_27(var_10_27, mem["82.53"], var_99_65, var_87_58) || var_7_75) : var_7_75; 133 | var var_7_75 = var_7_75 !== void 0 ? (atob("" + var_7_75) || var_7_75) : var_7_75; 134 | var var_7_75 = var_7_75 !== void 0 ? (XOR_STR(var_7_75, mem["42.48"]) || var_7_75) : var_7_75; 135 | var var_7_75 = var_7_75 !== void 0 ? (JSON.parse(var_7_75) || var_7_75) : var_7_75; 136 | var var_31_65 = 7.1; 137 | var_82_53[var_31_65] = var_89_68; 138 | var var_67_47 = 47.64; 139 | var var_12_84 = []; 140 | var var_71_99 = "__reactRouterContext"; 141 | var var_71_99 = window[var_71_99]; 142 | var var_20_46 = "state"; 143 | try { mem[var_20_46] = var_71_99[var_20_46]; } catch(r) { var_12_84 = "" + r; } 144 | var var_76_26 = "loaderData"; 145 | var var_67_47 = XOR_STR(var_67_47, var_67_47); 146 | var var_67_47 = btoa("" + var_67_47); 147 | try { mem[var_76_26] = var_20_46[var_76_26]; } catch(r) { var_12_84 = "" + r; } 148 | var var_57_61 = "root"; 149 | try { mem[var_57_61] = var_76_26[var_57_61]; } catch(r) { var_12_84 = "" + r; } 150 | var var_96_5 = "clientBootstrap"; 151 | try { mem[var_96_5] = var_57_61[var_96_5]; } catch(r) { var_12_84 = "" + r; } 152 | var var_88_19 = "cfConnectingIp"; 153 | try { mem[var_88_19] = var_96_5[var_88_19]; } catch(r) { var_12_84 = "" + r; } 154 | var var_67_47 = XOR_STR(var_67_47, var_67_47); 155 | var var_67_47 = btoa("" + var_67_47); 156 | var var_12_84 = Array.isArray(var_12_84) ? (var_12_84.push(var_88_19), var_12_84) : var_12_84 + var_88_19; 157 | var var_2_75 = "cfIpCity"; 158 | try { mem[var_2_75] = var_96_5[var_2_75]; } catch(r) { var_12_84 = "" + r; } 159 | var var_21_21 = 97.61; 160 | var var_67_47 = btoa("" + var_67_47); 161 | var_82_53[var_21_21] = var_67_47; 162 | var var_87_58 = var_33_97(); 163 | Math.abs(var_43_93 - var_87_58) > var_61_37 ? var_7_75 = var_20_04 : null; 164 | var var_7_75 = var_7_75 !== void 0 ? (mem["99.65"] = "81.04", var_7_75) : var_7_75; 165 | var var_7_75 = var_7_75 !== void 0 ? (var_10_27(var_10_27, mem["82.53"], var_99_65, var_87_58) || var_7_75) : var_7_75; 166 | var var_7_75 = var_7_75 !== void 0 ? (atob("" + var_7_75) || var_7_75) : var_7_75; 167 | var var_7_75 = var_7_75 !== void 0 ? (XOR_STR(var_7_75, mem["42.48"]) || var_7_75) : var_7_75; 168 | var var_7_75 = var_7_75 !== void 0 ? (JSON.parse(var_7_75) || var_7_75) : var_7_75; 169 | var var_12_84 = Array.isArray(var_12_84) ? (var_12_84.push(var_2_75), var_12_84) : var_12_84 + var_2_75; 170 | var var_67_47 = 40.24; 171 | var var_5_5 = "userRegion"; 172 | try { mem[var_5_5] = var_96_5[var_5_5]; } catch(r) { var_12_84 = "" + r; } 173 | var var_12_84 = Array.isArray(var_12_84) ? (var_12_84.push(var_5_5), var_12_84) : var_12_84 + var_5_5; 174 | var var_60_65 = "cfIpLatitude"; 175 | try { mem[var_60_65] = var_96_5[var_60_65]; } catch(r) { var_12_84 = "" + r; } 176 | var var_12_84 = Array.isArray(var_12_84) ? (var_12_84.push(var_60_65), var_12_84) : var_12_84 + var_60_65; 177 | var var_67_47 = 25.65; 178 | var var_98_73 = "cfIpLongitude"; 179 | var var_21_21 = 97.61; 180 | var var_67_47 = btoa("" + var_67_47); 181 | var_82_53[var_21_21] = var_67_47; 182 | try { mem[var_98_73] = var_96_5[var_98_73]; } catch(r) { var_12_84 = "" + r; } 183 | var var_87_58 = var_33_97(); 184 | Math.abs(var_43_93 - var_87_58) > var_61_37 ? var_7_75 = var_20_04 : null; 185 | var var_7_75 = var_7_75 !== void 0 ? (mem["99.65"] = "37.84", var_7_75) : var_7_75; 186 | var var_7_75 = var_7_75 !== void 0 ? (var_10_27(var_10_27, mem["82.53"], var_99_65, var_87_58) || var_7_75) : var_7_75; 187 | var var_7_75 = var_7_75 !== void 0 ? (atob("" + var_7_75) || var_7_75) : var_7_75; 188 | var var_7_75 = var_7_75 !== void 0 ? (XOR_STR(var_7_75, mem["42.48"]) || var_7_75) : var_7_75; 189 | var var_7_75 = var_7_75 !== void 0 ? (JSON.parse(var_7_75) || var_7_75) : var_7_75; 190 | var var_12_84 = Array.isArray(var_12_84) ? (var_12_84.push(var_98_73), var_12_84) : var_12_84 + var_98_73; 191 | var var_86_99 = 98.45; 192 | var var_12_84 = JSON.stringify(var_12_84); 193 | var var_12_84 = XOR_STR(var_12_84, var_55_63); 194 | var var_12_84 = btoa("" + var_12_84); 195 | var var_67_47 = 50.24; 196 | var var_30_69 = 75.89; 197 | var_82_53[var_30_69] = var_12_84; 198 | var var_87_58 = var_33_97(); 199 | Math.abs(var_43_93 - var_87_58) > var_61_37 ? var_7_75 = var_20_04 : null; 200 | var var_7_75 = var_7_75 !== void 0 ? (mem["99.65"] = "36.65", var_7_75) : var_7_75; 201 | var var_7_75 = var_7_75 !== void 0 ? (var_10_27(var_10_27, mem["82.53"], var_99_65, var_87_58) || var_7_75) : var_7_75; 202 | var var_7_75 = var_7_75 !== void 0 ? (atob("" + var_7_75) || var_7_75) : var_7_75; 203 | var var_7_75 = var_7_75 !== void 0 ? (XOR_STR(var_7_75, mem["42.48"]) || var_7_75) : var_7_75; 204 | var var_7_75 = var_7_75 !== void 0 ? (JSON.parse(var_7_75) || var_7_75) : var_7_75; 205 | var var_20_41 = "location"; 206 | var var_20_41 = window["document"]["location"]; 207 | var var_19_37 = ""; 208 | var var_19_37 = Array.isArray(var_19_37) ? (var_19_37.push(var_20_41), var_19_37) : var_19_37 + var_20_41; 209 | var var_94_65 = 36.78; 210 | var var_87_58 = var_33_97(); 211 | Math.abs(var_43_93 - var_87_58) > var_61_37 ? var_7_75 = var_20_04 : null; 212 | var var_7_75 = var_7_75 !== void 0 ? (mem["99.65"] = "26.42", var_7_75) : var_7_75; 213 | var var_7_75 = var_7_75 !== void 0 ? (var_10_27(var_10_27, mem["82.53"], var_99_65, var_87_58) || var_7_75) : var_7_75; 214 | var var_7_75 = var_7_75 !== void 0 ? (atob("" + var_7_75) || var_7_75) : var_7_75; 215 | var var_7_75 = var_7_75 !== void 0 ? (XOR_STR(var_7_75, mem["42.48"]) || var_7_75) : var_7_75; 216 | var var_7_75 = var_7_75 !== void 0 ? (JSON.parse(var_7_75) || var_7_75) : var_7_75; 217 | var var_19_37 = XOR_STR(var_19_37, var_55_63); 218 | var var_19_37 = btoa("" + var_19_37); 219 | var var_67_72 = 84.91; 220 | var_82_53[var_67_72] = var_19_37; 221 | var var_2_63 = 30.7; 222 | var var_10_03 = 27.36; 223 | var var_50_45 = "random"; 224 | var var_50_45 = window["Math"]["random"]; 225 | var var_90_49 = var_50_45(); 226 | var var_90_49 = XOR_STR(var_90_49, var_90_49); 227 | var var_86_99 = 94.12; 228 | var var_87_58 = var_33_97(); 229 | Math.abs(var_43_93 - var_87_58) > var_61_37 ? var_7_75 = var_20_04 : null; 230 | var var_7_75 = var_7_75 !== void 0 ? (mem["99.65"] = "16.1", var_7_75) : var_7_75; 231 | var var_7_75 = var_7_75 !== void 0 ? (var_10_27(var_10_27, mem["82.53"], var_99_65, var_87_58) || var_7_75) : var_7_75; 232 | var var_7_75 = var_7_75 !== void 0 ? (atob("" + var_7_75) || var_7_75) : var_7_75; 233 | var var_7_75 = var_7_75 !== void 0 ? (XOR_STR(var_7_75, mem["42.48"]) || var_7_75) : var_7_75; 234 | var var_7_75 = var_7_75 !== void 0 ? (JSON.parse(var_7_75) || var_7_75) : var_7_75; 235 | var var_90_49 = btoa("" + var_90_49); 236 | var_82_53[var_2_63] = var_90_49; 237 | var var_87_58 = var_33_97(); 238 | Math.abs(var_43_93 - var_87_58) > var_61_37 ? var_7_75 = var_20_04 : null; 239 | var var_7_75 = var_7_75 !== void 0 ? (mem["99.65"] = "33.47", var_7_75) : var_7_75; 240 | var var_7_75 = var_7_75 !== void 0 ? (var_10_27(var_10_27, mem["82.53"], var_99_65, var_87_58) || var_7_75) : var_7_75; 241 | var var_7_75 = var_7_75 !== void 0 ? (atob("" + var_7_75) || var_7_75) : var_7_75; 242 | var var_7_75 = var_7_75 !== void 0 ? (XOR_STR(var_7_75, mem["42.48"]) || var_7_75) : var_7_75; 243 | var var_7_75 = var_7_75 !== void 0 ? (JSON.parse(var_7_75) || var_7_75) : var_7_75; 244 | var var_90_49 = var_50_45(); 245 | var_82_53[var_10_03] = var_90_49; 246 | var var_44_95 = "setItem"; 247 | var var_44_95 = window["localStorage"]["setItem"].bind(window["localStorage"]); 248 | var var_19_53 = "a757407bfe6f217d"; 249 | var var_94_65 = 9.28; 250 | var var_3_39 = 4; 251 | var var_66_06 = 73.37; 252 | var var_94_65 = btoa("" + var_94_65); 253 | var_82_53[var_66_06] = var_94_65; 254 | var_44_95(var_19_53, var_3_39); 255 | var var_20_04 = var_20_04 !== void 0 ? (mem["42.48"] = "29.18", var_20_04) : var_20_04; 256 | var var_20_04 = var_20_04 !== void 0 ? (atob("" + var_20_04) || var_20_04) : var_20_04; 257 | var var_20_04 = var_20_04 !== void 0 ? (XOR_STR(var_20_04, mem["42.48"]) || var_20_04) : var_20_04; 258 | var var_20_04 = var_20_04 !== void 0 ? (JSON.parse(var_20_04) || var_20_04) : var_20_04; 259 | var var_86_99 = 85.19; 260 | var var_82_53 = JSON.stringify(var_82_53); 261 | var var_94_65 = 90.33; 262 | var var_82_53 = XOR_STR(var_82_53, var_55_63); 263 | console.log(btoa("" + var_82_53)); 264 | -------------------------------------------------------------------------------- /wrapper/reverse/parse.py: -------------------------------------------------------------------------------- 1 | import esprima 2 | import re 3 | 4 | class Parser: 5 | 6 | @staticmethod 7 | def find_var_definition(var_name, start_line, code): 8 | code_lines = code.splitlines() 9 | 10 | relevant_code = '\n'.join(code_lines[:start_line - 1]) 11 | 12 | sub_ast = esprima.parseScript(relevant_code, {'loc': True, 'range': True, 'tolerant': True}) 13 | 14 | var_defs = {} 15 | 16 | def collect_var_defs(node, var_defs): 17 | if (node.type == 'VariableDeclarator' and 18 | hasattr(node, 'id') and node.id and 19 | hasattr(node, 'init') and node.init and 20 | hasattr(node, 'loc') and node.loc): 21 | id_name = node.id.name if hasattr(node.id, 'name') else None 22 | if not id_name: 23 | return 24 | abs_line = node.loc.start.line if hasattr(node.loc.start, 'line') else None 25 | if abs_line is None or abs_line >= start_line: 26 | return 27 | if hasattr(node.init, 'range'): 28 | value = relevant_code[node.init.range[0]:node.init.range[1]].strip() 29 | else: 30 | value = str(node.init).strip() if node.init else '' 31 | if id_name not in var_defs: 32 | var_defs[id_name] = [] 33 | var_defs[id_name].append({'line': abs_line, 'value': value}) 34 | 35 | def iterative_traverse(ast, visitor): 36 | if not ast: 37 | return 38 | stack = [ast] 39 | visited = set() 40 | max_stack_size = 10000 41 | 42 | while stack: 43 | if len(stack) > max_stack_size: 44 | break 45 | node = stack.pop() 46 | node_id = id(node) 47 | if node_id in visited: 48 | continue 49 | visited.add(node_id) 50 | 51 | visitor(node) 52 | for key in reversed(node.__dict__.keys()): 53 | value = getattr(node, key, None) 54 | if isinstance(value, list): 55 | for item in reversed(value): 56 | if isinstance(item, esprima.nodes.Node) and id(item) not in visited: 57 | item._parent = node 58 | stack.append(item) 59 | elif isinstance(value, esprima.nodes.Node) and id(value) not in visited: 60 | value._parent = node 61 | stack.append(value) 62 | 63 | iterative_traverse(sub_ast, lambda n: collect_var_defs(n, var_defs)) 64 | 65 | last_resolved = None 66 | def_line = None 67 | 68 | if var_name in var_defs: 69 | var_defs[var_name].sort(key=lambda x: x['line'], reverse=True) 70 | 71 | for defn in var_defs[var_name]: 72 | if 'btoa' not in defn['value'] and 'XOR_STR' not in defn['value'] and \ 73 | 'doubleXOR' not in defn['value'] and 'singlebtoa' not in defn['value']: 74 | last_resolved = defn['value'] 75 | def_line = defn['line'] 76 | break 77 | 78 | if last_resolved: 79 | resolved_vars_cache = {} 80 | 81 | def resolve_var_recursive(expr, var_line): 82 | try: 83 | expr_ast = esprima.parseScript(expr, {'loc': True, 'range': True, 'tolerant': True}) 84 | except Exception: 85 | return expr 86 | 87 | vars_set = set() 88 | 89 | def collect_identifiers(node): 90 | if (hasattr(node, 'type') and node.type == 'Identifier' and 91 | hasattr(node, 'name')): 92 | parent = getattr(node, '_parent', None) 93 | if parent: 94 | parent_type = parent.type if hasattr(parent, 'type') else None 95 | if ((parent_type == 'MemberExpression' and 96 | hasattr(parent, 'property') and parent.property == node and 97 | not (hasattr(parent, 'computed') and parent.computed)) or 98 | (parent_type == 'ObjectProperty' and 99 | hasattr(parent, 'key') and parent.key == node and 100 | not (hasattr(parent, 'computed') and parent.computed)) or 101 | (parent_type == 'VariableDeclarator' and 102 | hasattr(parent, 'id') and parent.id == node) or 103 | (parent_type == 'FunctionDeclaration' and 104 | hasattr(parent, 'id') and parent.id == node) or 105 | (parent_type == 'FunctionExpression' and 106 | hasattr(parent, 'id') and parent.id == node) or 107 | node.name == 'window'): 108 | return 109 | vars_set.add(node.name) 110 | 111 | def iterative_traverse_safe(ast, visitor): 112 | if not ast: 113 | return 114 | stack = [ast] 115 | visited = set() 116 | while stack: 117 | node = stack.pop() 118 | node_id = id(node) 119 | if node_id in visited: 120 | continue 121 | visited.add(node_id) 122 | visitor(node) 123 | for key in reversed(node.__dict__.keys()): 124 | value = getattr(node, key, None) 125 | if isinstance(value, list): 126 | for item in reversed(value): 127 | if isinstance(item, esprima.nodes.Node) and id(item) not in visited: 128 | item._parent = node 129 | stack.append(item) 130 | elif isinstance(value, esprima.nodes.Node) and id(value) not in visited: 131 | value._parent = node 132 | stack.append(value) 133 | 134 | iterative_traverse_safe(expr_ast, collect_identifiers) 135 | 136 | if not vars_set: 137 | return expr 138 | 139 | for v in vars_set: 140 | if v in resolved_vars_cache: 141 | continue 142 | 143 | def_value = v 144 | if v in var_defs: 145 | for defn in sorted(var_defs[v], key=lambda x: x['line'], reverse=True): 146 | if defn['line'] < var_line and \ 147 | 'btoa' not in defn['value'] and 'XOR_STR' not in defn['value'] and \ 148 | 'doubleXOR' not in defn['value'] and 'singlebtoa' not in defn['value']: 149 | def_value = defn['value'] 150 | break 151 | 152 | resolved_vars_cache[v] = def_value 153 | resolved_vars_cache[v] = resolve_var_recursive(def_value, var_line) 154 | 155 | final_expr = expr 156 | for k, v in resolved_vars_cache.items(): 157 | final_expr = re.sub(r'\b' + re.escape(k) + r'\b', str(v), final_expr) 158 | 159 | return final_expr 160 | 161 | last_resolved = resolve_var_recursive(last_resolved, def_line) 162 | 163 | if last_resolved: 164 | escaped_var_name = re.escape(var_name) 165 | 166 | double_xor_pattern = re.compile(rf'XOR_STR\s*\(\s*{escaped_var_name}\s*,\s*{escaped_var_name}\s*\)') 167 | xor_matches = double_xor_pattern.findall(code) 168 | 169 | if xor_matches and len(xor_matches) >= 2: 170 | last_resolved = f'doublexor({last_resolved})' 171 | else: 172 | 173 | usage_line_index = start_line - 1 174 | search_start = max(0, usage_line_index - 10) 175 | relevant_lines = '\n'.join(code_lines[search_start:usage_line_index + 1]) 176 | 177 | btoa_pattern = re.compile(rf'btoa\s*\(\s*""\s*\+\s*{escaped_var_name}\s*\)') 178 | xor_var_pattern = re.compile(rf'XOR_STR\s*\(\s*{escaped_var_name}\s*,') 179 | 180 | btoa_matches = btoa_pattern.findall(relevant_lines) 181 | has_xor_var = bool(xor_var_pattern.search(relevant_lines)) 182 | 183 | if btoa_matches and len(btoa_matches) == 1 and not has_xor_var: 184 | last_resolved = f'singlebtoa({last_resolved})' 185 | 186 | return last_resolved 187 | 188 | @staticmethod 189 | def parse_assigments(code): 190 | 191 | ast = esprima.parseScript(code, loc=True, jsx=True) 192 | 193 | stringify_calls = [] 194 | 195 | def traverse_node(node): 196 | if isinstance(node, dict): 197 | if node.get('type') == 'CallExpression': 198 | callee = node.get('callee', {}) 199 | if (callee.get('type') == 'MemberExpression' and 200 | callee.get('object', {}).get('name') == 'JSON' and 201 | callee.get('property', {}).get('name') == 'stringify' and 202 | node.get('arguments') and 203 | node['arguments'][0]['type'] == 'Identifier'): 204 | stringify_calls.append(node['arguments'][0]['name']) 205 | for v in node.values(): 206 | traverse_node(v) 207 | elif isinstance(node, list): 208 | for item in node: 209 | traverse_node(item) 210 | 211 | traverse_node(ast.toDict()) 212 | 213 | last_stringify_arg = stringify_calls[-1] if stringify_calls else None 214 | 215 | if not last_stringify_arg: 216 | return {} 217 | 218 | var_values = {} 219 | 220 | def traverse_vars(node): 221 | if isinstance(node, dict): 222 | if node.get('type') == 'VariableDeclarator': 223 | id_node = node.get('id', {}) 224 | init_node = node.get('init', {}) 225 | if (id_node.get('type') == 'Identifier' and 226 | init_node and init_node.get('type') in ('Literal', 'NumericLiteral', 'StringLiteral')): 227 | var_values[id_node['name']] = init_node.get('value') 228 | for v in node.values(): 229 | traverse_vars(v) 230 | elif isinstance(node, list): 231 | for item in node: 232 | traverse_vars(item) 233 | 234 | traverse_vars(ast.toDict()) 235 | 236 | assignments = {} 237 | 238 | def traverse_assignments(node): 239 | if isinstance(node, dict): 240 | if node.get('type') == 'AssignmentExpression': 241 | left = node.get('left', {}) 242 | right = node.get('right', {}) 243 | if (left.get('type') == 'MemberExpression' and 244 | left.get('object', {}).get('type') == 'Identifier' and 245 | left.get('object', {}).get('name') == last_stringify_arg and 246 | left.get('property', {}).get('type') == 'Identifier' and 247 | right.get('type') == 'Identifier' and 248 | node.get('loc')): 249 | key_var = left['property']['name'] 250 | value = right['name'] 251 | key = var_values.get(key_var, key_var) 252 | resolved_value = Parser.find_var_definition(value, node['loc']['start']['line'], code) or value 253 | assignments[key] = resolved_value 254 | for v in node.values(): 255 | traverse_assignments(v) 256 | elif isinstance(node, list): 257 | for item in node: 258 | traverse_assignments(item) 259 | 260 | traverse_assignments(ast.toDict()) 261 | 262 | return assignments 263 | @staticmethod 264 | def get_xor_key(js_code: str): 265 | 266 | parsed = esprima.parseScript(js_code, tolerant=True) 267 | 268 | last_xor_call = None 269 | second_arg_node = None 270 | 271 | for node in parsed.body: 272 | if node.type == 'VariableDeclaration': 273 | for decl in node.declarations: 274 | if decl.init and decl.init.type == 'CallExpression': 275 | call = decl.init 276 | if call.callee.type == 'Identifier' and call.callee.name == 'XOR_STR': 277 | last_xor_call = call 278 | second_arg_node = call.arguments[1] 279 | 280 | if not last_xor_call: 281 | return None 282 | 283 | if second_arg_node.type == 'Identifier': 284 | var_name = second_arg_node.name 285 | elif second_arg_node.type == 'Literal': 286 | return second_arg_node.value 287 | else: 288 | return None 289 | 290 | def find_value(nodes, name): 291 | for node in nodes: 292 | if node.type == 'VariableDeclaration': 293 | for decl in node.declarations: 294 | if decl.id.name == name and decl.init.type == 'Literal': 295 | return decl.init.value 296 | elif node.type == 'ExpressionStatement' and node.expression.type == 'AssignmentExpression': 297 | expr = node.expression 298 | if expr.left.type == 'Identifier' and expr.left.name == name and expr.right.type == 'Literal': 299 | return expr.right.value 300 | return None 301 | 302 | return find_value(parsed.body, var_name) 303 | 304 | @staticmethod 305 | def parse_keys(decompiled_code: str) -> tuple[str, dict]: 306 | 307 | assignments: dict = Parser.parse_assigments(decompiled_code) 308 | xor_key: str = Parser.get_xor_key(decompiled_code) 309 | 310 | parsed_keys: dict = {} 311 | randomindex = 1 312 | for key, value in assignments.items(): 313 | key = str(key) 314 | if value.startswith("Array") and "location" not in value: 315 | numbers = value.split(') : ')[1].split(" + ") 316 | num1 = float(numbers[0]) 317 | num2 = float(numbers[1]) 318 | parsed_keys[key] = str(float(num1 + num2)) 319 | elif "location" in value: 320 | parsed_keys[key] = "location" 321 | elif "cfIpLongitude" in value: 322 | parsed_keys[key] = "ipinfo" 323 | elif "maxTouchPoints" in value: 324 | parsed_keys[key] = "vendor" 325 | elif "history" in value: 326 | parsed_keys[key] = "history" 327 | elif 'window["Object"]["keys"]' in value: 328 | parsed_keys[key] = "localstorage" 329 | elif 'createElement' in value: 330 | parsed_keys[key] = "element" 331 | elif value.isdigit(): 332 | parsed_keys[key] = value 333 | elif "random" in value: 334 | parsed_keys[key] = "random_" + str(randomindex) 335 | randomindex += 1 336 | elif "doublexor" in value: 337 | parsed_keys[key] = value 338 | elif "singlebtoa" in value: 339 | parsed_keys[key] = value 340 | 341 | return xor_key, parsed_keys 342 | 343 | # NOTE dont mind this please i converted my babel parser from JS to py using AI i know its shit but i didnt wanna exec js code or smt -------------------------------------------------------------------------------- /wrapper/reverse/decompiler.py: -------------------------------------------------------------------------------- 1 | import re 2 | import json 3 | import base64 4 | 5 | 6 | class Decompiler: 7 | 8 | 9 | mapping: dict = { 10 | "1": "XOR_STR", 11 | "2": "SET_VALUE", 12 | "3": "BTOA", 13 | "4": "BTOA_2", 14 | "5": "ADD_OR_PUSH", 15 | "6": "ARRAY_ACCESS", 16 | "7": "CALL", 17 | "8": "COPY", 18 | "10": "window", 19 | "11": "GET_SCRIPT_SRC", 20 | "12": "GET_MAP", 21 | "13": "TRY_CALL", 22 | "14": "JSON_PARSE", 23 | "15": "JSON_STRINGIFY", 24 | "17": "CALL_AND_SET", 25 | "18": "ATOB", 26 | "19": "BTOA_3", 27 | "20": "IF_EQUAL_CALL", 28 | "21": "IF_DIFF_CALL", 29 | "22": "TEMP_STACK_CALL", 30 | "23": "IF_DEFINED_CALL", 31 | "24": "BIND_METHOD", 32 | "27": "REMOVE_OR_SUBTRACT", 33 | "28": "undefined", 34 | "25": "undefined", 35 | "26": "undefined", 36 | "29": "LESS_THAN", 37 | "31": "INCREMENT", 38 | "32": "DECREMENT_AND_EXEC", 39 | "33": "MULTIPLY", 40 | "34": "MOVE" 41 | } 42 | 43 | functions: dict = { 44 | "XOR_STR": """function XOR_STR(e, t) { 45 | e = String(e); 46 | t = String(t); 47 | let n = ""; 48 | for (let r = 0; r < e.length; r++) 49 | n += String.fromCharCode(e.charCodeAt(r) ^ t.charCodeAt(r % t.length)); 50 | return n; 51 | } 52 | """ 53 | } 54 | 55 | @staticmethod 56 | def start(): 57 | Decompiler.xorkey = "" 58 | Decompiler.xorkey2 = "" 59 | Decompiler.decompiled = "var mem = {};\n" 60 | Decompiler.array_dict = {} 61 | Decompiler.vg = 0 62 | Decompiler.round1 = 0 63 | Decompiler.found = False 64 | Decompiler.potential = [] 65 | 66 | @staticmethod 67 | def xS(e, t): 68 | n = "" 69 | for r in range(len(e)): 70 | n += chr(ord(e[r]) ^ ord(t[r % len(t)])) 71 | return n 72 | 73 | @staticmethod 74 | def handle_operation(operation, args): 75 | if operation == "COPY": 76 | Decompiler.mapping[args[0]] = Decompiler.mapping[args[1]] 77 | if Decompiler.mapping[args[1]] != "window": 78 | if Decompiler.mapping[args[1]] in Decompiler.functions and f"function {Decompiler.mapping[args[1]]}" not in Decompiler.decompiled: 79 | Decompiler.decompiled += Decompiler.functions[Decompiler.mapping[args[1]]] + "\n" 80 | else: 81 | var_name = str(args[1]).replace(".", "_") 82 | Decompiler.decompiled += f"var var_{var_name} = window;\n" 83 | Decompiler.array_dict[args[1]] = "window" 84 | 85 | elif operation == "SET_VALUE": 86 | var_name = str(args[0]).replace(".", "_") 87 | value = args[1] 88 | try: 89 | num = float(value) 90 | if num.is_integer(): 91 | Decompiler.decompiled += f"var var_{var_name} = {int(num)};\n" 92 | Decompiler.array_dict[args[0]] = str(int(num)) 93 | else: 94 | Decompiler.decompiled += f"var var_{var_name} = {num};\n" 95 | Decompiler.array_dict[args[0]] = str(num) 96 | except (ValueError, TypeError): 97 | if isinstance(value, str): 98 | if value == "[]": 99 | Decompiler.decompiled += f"var var_{var_name} = [];\n" 100 | Decompiler.array_dict[args[0]] = [] 101 | 102 | elif value == "None": 103 | Decompiler.decompiled += f"var var_{var_name} = null;\n" 104 | Decompiler.array_dict[args[0]] = "null" 105 | 106 | else: 107 | Decompiler.decompiled += f"var var_{var_name} = \"{value}\";\n" 108 | Decompiler.array_dict[args[0]] = f"\"{value}\"" 109 | elif isinstance(value, list): 110 | Decompiler.decompiled += f"var var_{var_name} = [];\n" 111 | Decompiler.array_dict[args[0]] = [] 112 | elif value is None: 113 | Decompiler.decompiled += f"var var_{var_name} = null;\n" 114 | Decompiler.array_dict[args[0]] = "null" 115 | else: 116 | Decompiler.decompiled += f"var var_{var_name} = {value};\n" 117 | Decompiler.array_dict[args[0]] = str(value) 118 | 119 | elif operation == "ARRAY_ACCESS": 120 | Decompiler.handle_array_access(args) 121 | 122 | elif operation == "BIND_METHOD": 123 | Decompiler.handle_bind_method(args) 124 | 125 | elif operation == "XOR_STR": 126 | if Decompiler.round1 == 1 and len(Decompiler.potential) < 2: 127 | Decompiler.potential.append({"var": args[0], "key": args[1]}) 128 | var_name = str(args[0]).replace(".", "_") 129 | key_name = str(args[1]).replace(".", "_") 130 | Decompiler.decompiled += f"var var_{var_name} = XOR_STR(var_{var_name}, var_{key_name});\n" 131 | 132 | elif operation == "BTOA_3": 133 | var_name = str(args[0]).replace(".", "_") 134 | Decompiler.decompiled += f"var var_{var_name} = btoa(\"\" + var_{var_name});\n" 135 | 136 | elif operation == "CALL_AND_SET": 137 | var_name = str(args[0]).replace(".", "_") 138 | func_name = str(args[1]).replace(".", "_") 139 | args_str = ", ".join(f"var_{arg.replace('.', '_')}" for arg in args[2:]) 140 | Decompiler.decompiled += f"var var_{var_name} = var_{func_name}({args_str});\n" 141 | 142 | elif operation == "IF_DEFINED_CALL": 143 | Decompiler.handle_if_defined_call(args) 144 | 145 | elif operation == "CALL": 146 | Decompiler.handle_call_operation(args) 147 | 148 | elif operation == "ADD_OR_PUSH": 149 | var_name = str(args[0]).replace(".", "_") 150 | arg_name = str(args[1]).replace(".", "_") 151 | Decompiler.decompiled += ( 152 | f"var var_{var_name} = Array.isArray(var_{var_name}) ? " 153 | f"(var_{var_name}.push(var_{arg_name}), var_{var_name}) : var_{var_name} + var_{arg_name};\n" 154 | ) 155 | 156 | elif operation == "IF_DIFF_CALL": 157 | var_0 = str(args[0]).replace(".", "_") 158 | var_1 = str(args[1]).replace(".", "_") 159 | var_2 = str(args[2]).replace(".", "_") 160 | if Decompiler.mapping.get(args[3]) == "COPY": 161 | var_4 = str(args[4]).replace(".", "_") 162 | var_5 = str(args[5]).replace(".", "_") 163 | Decompiler.decompiled += ( 164 | f"Math.abs(var_{var_0} - var_{var_1}) > var_{var_2} ? var_{var_4} = var_{var_5} : null;\n" 165 | ) 166 | else: 167 | args_str = ", ".join(f"var_{arg.replace('.', '_')}" for arg in args[4:]) 168 | Decompiler.decompiled += ( 169 | f"Math.abs(var_{var_0} - var_{var_1}) > var_{var_2} ? {Decompiler.mapping[args[3]]}({args_str}) : null;\n" 170 | ) 171 | 172 | elif operation == "TRY_CALL": 173 | Decompiler.handle_try_call(args) 174 | 175 | elif operation == "JSON_STRINGIFY": 176 | var_name = str(args[0]).replace(".", "_") 177 | Decompiler.decompiled += f"var var_{var_name} = JSON.stringify(var_{var_name});\n" 178 | 179 | elif operation == "MOVE": 180 | Decompiler.decompiled += f"MOVE {args}" # not even used lmfao 181 | 182 | else: 183 | mapped = [Decompiler.mapping[key] for key in args[1:] if key in Decompiler.mapping] 184 | unlabeled = [str(key) for key in args[1:] if key not in Decompiler.mapping] 185 | all_values = " ".join(mapped + unlabeled) 186 | Decompiler.decompiled += f"// UNKNOWN: {operation} -> {args[0]} {all_values};\n" 187 | 188 | @staticmethod 189 | def handle_try_call(args): 190 | target_var = f"var_{str(args[0]).replace('.', '_')}" 191 | fn = Decompiler.mapping.get(args[1], "") 192 | rest_args = [f"var_{str(a).replace('.', '_')}" for a in args[2:]] 193 | if fn == "ARRAY_ACCESS": 194 | Decompiler.decompiled += ( 195 | f"try {{ mem[{rest_args[0]}] = {rest_args[1]}[{rest_args[0]}]; }} catch(r) {{ {target_var} = \"\" + r; }}\n" 196 | ) 197 | else: 198 | args_str = ", ".join(rest_args) 199 | Decompiler.decompiled += ( 200 | f"try {{ {fn}({args_str}); }} catch(r) {{ {target_var} = \"\" + r; }}\n" 201 | ) 202 | 203 | @staticmethod 204 | def handle_array_access(args): 205 | var_0 = str(args[0]).replace(".", "_") 206 | var_1 = str(args[1]).replace(".", "_") 207 | var_2 = str(args[2]).replace(".", "_") 208 | if f"var var_{var_1} =" in Decompiler.decompiled: 209 | if args[1] in Decompiler.array_dict or args[2] in Decompiler.array_dict: 210 | if args[2] in Decompiler.array_dict and args[1] not in Decompiler.array_dict: 211 | Decompiler.decompiled += f"var var_{var_0} = var_{var_1}[{Decompiler.array_dict[args[2]]}];\n" 212 | elif args[1] in Decompiler.array_dict and args[2] not in Decompiler.array_dict: 213 | Decompiler.decompiled += f"var var_{var_0} = {Decompiler.array_dict[args[1]]}[var_{var_2}];\n" 214 | else: 215 | if re.search(rf"var\s+var_{var_1}\s*=\s*\w+\([^)]*\)", Decompiler.decompiled): 216 | Decompiler.decompiled += f"var var_{var_0} = var_{var_1}[{Decompiler.array_dict[args[2]]}];\n" 217 | Decompiler.array_dict[args[0]] = f"var_{var_1}[{Decompiler.array_dict[args[2]]}]" 218 | else: 219 | Decompiler.decompiled += f"var var_{var_0} = {Decompiler.array_dict[args[1]]}[{Decompiler.array_dict[args[2]]}];\n" 220 | Decompiler.array_dict[args[0]] = f"{Decompiler.array_dict[args[1]]}[{Decompiler.array_dict[args[2]]}]" 221 | else: 222 | Decompiler.decompiled += f"var var_{var_0} = var_{var_1}[var_{var_2}];\n" 223 | else: 224 | Decompiler.decompiled += f"var var_{var_0} = window[var_{var_2}];\n" 225 | 226 | @staticmethod 227 | def handle_bind_method(args): 228 | var_0 = str(args[0]).replace(".", "_") 229 | var_1 = str(args[1]).replace(".", "_") 230 | var_2 = str(args[2]).replace(".", "_") 231 | if f"var var_{var_1} =" in Decompiler.decompiled: 232 | if args[1] in Decompiler.array_dict or args[2] in Decompiler.array_dict: 233 | if args[1] in Decompiler.array_dict and args[2] not in Decompiler.array_dict: 234 | Decompiler.decompiled += ( 235 | f"var var_{var_0} = {Decompiler.array_dict[args[1]]}[var_{var_2}].bind({Decompiler.array_dict[args[1]]});\n" 236 | ) 237 | else: 238 | if re.search(rf"var\s+var_{var_1}\s*=\s*\w+\([^)]*\)", Decompiler.decompiled): 239 | Decompiler.decompiled += ( 240 | f"var var_{var_0} = var_{var_1}[{Decompiler.array_dict[args[2]]}].bind(var_{var_1});\n" 241 | ) 242 | Decompiler.array_dict[args[0]] = f"var_{var_1}[{Decompiler.array_dict[args[2]]}]" 243 | else: 244 | Decompiler.decompiled += ( 245 | f"var var_{var_0} = {Decompiler.array_dict[args[1]]}[{Decompiler.array_dict[args[2]]}].bind({Decompiler.array_dict[args[1]]});\n" 246 | ) 247 | Decompiler.array_dict[args[0]] = f"{Decompiler.array_dict[args[1]]}[{Decompiler.array_dict[args[2]]}]" 248 | else: 249 | Decompiler.decompiled += ( 250 | f"var var_{var_0} = var_{var_1}[var_{var_2}].bind(var_{var_1});\n" 251 | ) 252 | else: 253 | Decompiler.decompiled += ( 254 | f"var var_{var_0} = window[var_{var_2}].bind(var_{var_1});\n" 255 | ) 256 | 257 | @staticmethod 258 | def handle_if_defined_call(args): 259 | result = [] 260 | for item in args: 261 | if item in Decompiler.mapping: 262 | keys = [k for k, v in Decompiler.mapping.items() if v == Decompiler.mapping[item] and k != item] 263 | result.append(keys[0] if keys else None) 264 | else: 265 | result.append(None) 266 | result = [ 267 | None if key is None else ([k for k, v in Decompiler.mapping.items() if v == Decompiler.mapping[key] and k != key] or [None])[0] 268 | for key in result 269 | ] 270 | 271 | if len(args) == 4: 272 | target = str(args[3]).replace(".", "_") 273 | count = len(re.findall(target, Decompiler.decompiled)) 274 | if count <= 1 and f"var var_{str(args[2]).replace('.', '_')}" not in Decompiler.decompiled: 275 | if not Decompiler.xorkey: 276 | Decompiler.xorkey = str(args[3]) 277 | var_0 = str(args[0]).replace(".", "_") 278 | arg_2 = str(args[2]).replace(".", "_") 279 | arg_3 = str(args[3]).replace(".", "_") 280 | if Decompiler.mapping.get(result[1]) == "SET_VALUE": 281 | Decompiler.decompiled += ( 282 | f"var var_{var_0} = var_{var_0} !== void 0 ? (mem[\"{args[2]}\"] = \"{args[3]}\", var_{var_0}) : var_{var_0};\n" 283 | ) 284 | else: 285 | Decompiler.decompiled += ( 286 | f"var var_{var_0} = var_{var_0} !== void 0 ? ({Decompiler.mapping[result[1]]}(\"{args[2]}\", \"{args[3]}\") || var_{var_0}) : var_{var_0};\n" 287 | ) 288 | elif count <= 3: 289 | var_0 = str(args[0]).replace(".", "_") 290 | arg_2 = str(args[2]).replace(".", "_") 291 | arg_3 = str(args[3]).replace(".", "_") 292 | if Decompiler.mapping.get(result[1]) == "SET_VALUE": 293 | Decompiler.decompiled += ( 294 | f"var var_{var_0} = var_{var_0} !== void 0 ? ((mem[\"{args[2]}\"] = \"{args[3]}\") || var_{var_0}) : var_{var_0};\n" 295 | ) 296 | else: 297 | Decompiler.decompiled += ( 298 | f"var var_{var_0} = var_{var_0} !== void 0 ? ({Decompiler.mapping[result[1]]}(var_{arg_2}, mem[\"{args[3]}\"]) || var_{var_0}) : var_{var_0};\n" 299 | ) 300 | elif Decompiler.mapping.get(result[1]) == "JSON_PARSE": 301 | var_0 = str(args[0]).replace(".", "_") 302 | arg_3 = str(args[3]).replace(".", "_") 303 | Decompiler.decompiled += ( 304 | f"var var_{var_0} = var_{var_0} !== void 0 ? (JSON.parse(var_{arg_3}) || var_{var_0}) : var_{var_0};\n" 305 | ) 306 | else: 307 | var_0 = str(args[0]).replace(".", "_") 308 | args_str = ", ".join(f"var_{arg.replace('.', '_')}" for arg in args[2:]) 309 | Decompiler.decompiled += ( 310 | f"var var_{var_0} = var_{var_0} !== void 0 ? ({Decompiler.mapping[result[1]]}({args_str}) || var_{var_0}) : var_{var_0};\n" 311 | ) 312 | else: 313 | var_0 = str(args[0]).replace(".", "_") 314 | if len(args) > 4 and f"mem[\"{args[4]}\"] =" in Decompiler.decompiled: 315 | args_str = ", ".join( 316 | f"mem[\"{arg}\"]" if i + 2 == 3 else f"var_{str(arg).replace('.', '_')}" 317 | for i, arg in enumerate(args[2:]) 318 | ) 319 | if Decompiler.mapping.get(result[1]) == "CALL": 320 | Decompiler.decompiled += ( 321 | f"var var_{var_0} = var_{var_0} !== void 0 ? (var_{str(args[2]).replace('.', '_')}({args_str}) || var_{var_0}) : var_{var_0};\n" 322 | ) 323 | else: 324 | Decompiler.decompiled += ( 325 | f"var var_{var_0} = var_{var_0} !== void 0 ? ({Decompiler.mapping[result[1]]}({args_str}) || var_{var_0}) : var_{var_0};\n" 326 | ) 327 | else: 328 | args_str = ", ".join(f"var_{arg.replace('.', '_')}" for arg in args[2:]) 329 | if Decompiler.mapping.get(result[1]) == "ATOB": 330 | arg_2 = str(args[2]).replace(".", "_") 331 | Decompiler.decompiled += ( 332 | f"var var_{var_0} = var_{var_0} !== void 0 ? (atob(\"\" + var_{arg_2}) || var_{var_0}) : var_{var_0};\n" 333 | ) 334 | elif len(args) >= 3 and result[1] in Decompiler.mapping: 335 | Decompiler.decompiled += ( 336 | f"var var_{var_0} = var_{var_0} !== void 0 ? ({Decompiler.mapping[result[1]]}({args_str}) || var_{var_0}) : var_{var_0};\n" 337 | ) 338 | else: 339 | Decompiler.decompiled += f"// ERROR: Invalid IF_DEFINED_CALL with args {args};\n" 340 | 341 | @staticmethod 342 | def handle_call_operation(args): 343 | if args[0] in Decompiler.mapping: 344 | if Decompiler.mapping[args[0]] == "BTOA": 345 | arg_1 = str(args[1]).replace(".", "_") 346 | Decompiler.decompiled += f"console.log(btoa(\"\" + var_{arg_1}));\n" 347 | else: 348 | args_str = ", ".join(f"var_{arg.replace('.', '_')}" for arg in args) 349 | Decompiler.decompiled += f"{Decompiler.mapping[args[0]]}({args_str});\n" 350 | else: 351 | if f"var var_{str(args[0]).replace('.', '_')} = \"set\";" in Decompiler.decompiled: 352 | arg_1 = str(args[1]).replace(".", "_") 353 | arg_2 = str(args[2]).replace(".", "_") 354 | arg_3 = str(args[3]).replace(".", "_") 355 | Decompiler.decompiled += f"var_{arg_1}[var_{arg_2}] = var_{arg_3};\n" 356 | else: 357 | args_str = ", ".join(f"var_{arg.replace('.', '_')}" for arg in args[1:]) 358 | Decompiler.decompiled += f"var_{str(args[0]).replace('.', '_')}({args_str});\n" 359 | 360 | @staticmethod 361 | def remove_unused_variables(): 362 | lines = Decompiler.decompiled.split("\n") 363 | used_vars = set() 364 | var_decl_lines = [] 365 | 366 | for i, line in enumerate(lines): 367 | match = re.match(r"^var\s+var_([\w_]+)\s*=", line) 368 | if match: 369 | var_decl_lines.append({"name": match.group(1), "index": i}) 370 | 371 | for var in var_decl_lines: 372 | name = var["name"] 373 | is_used = any(name in line and not line.startswith(f"var var_{name} =") for line in lines) 374 | if is_used: 375 | used_vars.add(name) 376 | 377 | Decompiler.decompiled = "\n".join( 378 | line for line in lines 379 | if not re.match(r"^var\s+var_([\w_]+)\s*=", line) or re.match(r"^var\s+var_([\w_]+)\s*=", line).group(1) in used_vars 380 | ) 381 | 382 | @staticmethod 383 | def decompile(bytecode): 384 | while len(bytecode) > 0: 385 | e = str(bytecode[0][0]) 386 | t = [str(item) for item in bytecode[0][1:]] 387 | bytecode.pop(0) 388 | Decompiler.vg += 1 389 | 390 | if e in Decompiler.mapping: 391 | Decompiler.handle_operation(Decompiler.mapping[e], t) 392 | else: 393 | Decompiler.decompiled += f"// UNKNOWN_OPCODE {e} -> {', '.join(t)};\n" 394 | 395 | if Decompiler.mapping.get(e) == "CALL" and not Decompiler.found: 396 | for entry in Decompiler.potential: 397 | if len(t) > 3 and entry["var"] == t[3]: 398 | key_str = str(entry["key"]).replace(".", "_") 399 | regex = rf"var var_{key_str} = (.*);" 400 | match = re.search(regex, Decompiler.decompiled) 401 | if match: 402 | Decompiler.xorkey2 = match.group(1).replace(";", "") 403 | Decompiler.found = True 404 | break 405 | 406 | if Decompiler.round1 == 0: 407 | Decompiler.round1 += 1 408 | Decompiler.decompile_2() 409 | 410 | @staticmethod 411 | def decompile_2(): 412 | matches = [m.group(2) for m in re.finditer(r"var\s+\w+\s*=\s*(['\"`])([\s\S]*?)\1", Decompiler.decompiled)] 413 | bytecode = max(matches, key=len, default="") 414 | if bytecode: 415 | decoded = json.loads(Decompiler.xS(base64.b64decode(bytecode).decode(), str(Decompiler.xorkey))) 416 | Decompiler.decompile(decoded) 417 | 418 | if Decompiler.round1 == 1: 419 | Decompiler.round1 += 1 420 | Decompiler.decompile_3() 421 | 422 | @staticmethod 423 | def decompile_3(): 424 | matches = [m.group(2) for m in re.finditer(r"var\s+\w+\s*=\s*(['\"`])([\s\S]*?)\1", Decompiler.decompiled)] 425 | bytecode = next((s for s in matches if 60 <= len(s) <= 200), "") 426 | if bytecode: 427 | decoded = json.loads(Decompiler.xS(base64.b64decode(bytecode).decode(), str(Decompiler.xorkey))) 428 | Decompiler.decompile(decoded) 429 | Decompiler.remove_unused_variables() 430 | 431 | @staticmethod 432 | def decompile_vm(turnstile, token): 433 | Decompiler.start() 434 | Decompiler.decompiled = ( 435 | "const { JSDOM } = require(\"jsdom\");\n" 436 | "const dom = new JSDOM(\"Hello world
\", { url: \"https://chatgpt.com/\" });\n" 437 | "const window = dom.window;\n" 438 | "var mem = {};\n" 439 | ) 440 | Decompiler.decompile(json.loads(Decompiler.xS(base64.b64decode(turnstile).decode(), str(token)))) 441 | return Decompiler.decompiled 442 | 443 | # NOTE dont mind this please i converted my JS decompiler to py using AI dont judge this please -------------------------------------------------------------------------------- /wrapper/chatgpt.py: -------------------------------------------------------------------------------- 1 | from wrapper import Log, Utils, Headers, Challenges, VM, IP_Info 2 | from random import randint, random, choice 3 | from zoneinfo import ZoneInfo 4 | from curl_cffi import requests 5 | from datetime import datetime 6 | from uuid import uuid4 7 | from json import loads 8 | from time import time 9 | from typing import Any 10 | from base64 import b64decode 11 | from PIL import Image 12 | from io import BytesIO 13 | 14 | 15 | class ChatGPT: 16 | 17 | 18 | def __init__(self, proxy: str=None, cookies: dict = None) -> Any: 19 | self.session: requests.session.Session = requests.Session(impersonate="chrome133a") 20 | self.session.headers = Headers.DEFAULT 21 | self.data: dict = {} 22 | 23 | if proxy: 24 | 25 | self.session.proxies = { 26 | "all": proxy # format http://user:pass@ip:port 27 | } 28 | 29 | self.ip_info: list = IP_Info.fetch_info(self.session) 30 | self.timezone_offset: int = int(datetime.now(ZoneInfo(self.ip_info[5])).utcoffset().total_seconds() / 60) 31 | self.reacts: list = [ 32 | "location", 33 | "__reactContainer$" + self._generate_react(), 34 | "_reactListening" + self._generate_react(), 35 | ] 36 | self.window_keys: list = [ 37 | "0", 38 | "window", 39 | "self", 40 | "document", 41 | "name", 42 | "location", 43 | "customElements", 44 | "history", 45 | "navigation", 46 | "locationbar", 47 | "menubar", 48 | "personalbar", 49 | "scrollbars", 50 | "statusbar", 51 | "toolbar", 52 | "status", 53 | "closed", 54 | "frames", 55 | "length", 56 | "top", 57 | "opener", 58 | "parent", 59 | "frameElement", 60 | "navigator", 61 | "origin", 62 | "external", 63 | "screen", 64 | "innerWidth", 65 | "innerHeight", 66 | "scrollX", 67 | "pageXOffset", 68 | "scrollY", 69 | "pageYOffset", 70 | "visualViewport", 71 | "screenX", 72 | "screenY", 73 | "outerWidth", 74 | "outerHeight", 75 | "devicePixelRatio", 76 | "event", 77 | "clientInformation", 78 | "screenLeft", 79 | "screenTop", 80 | "styleMedia", 81 | "onsearch", 82 | "trustedTypes", 83 | "performance", 84 | "onappinstalled", 85 | "onbeforeinstallprompt", 86 | "crypto", 87 | "indexedDB", 88 | "sessionStorage", 89 | "localStorage", 90 | "onbeforexrselect", 91 | "onabort", 92 | "onbeforeinput", 93 | "onbeforematch", 94 | "onbeforetoggle", 95 | "onblur", 96 | "oncancel", 97 | "oncanplay", 98 | "oncanplaythrough", 99 | "onchange", 100 | "onclick", 101 | "onclose", 102 | "oncontentvisibilityautostatechange", 103 | "oncontextlost", 104 | "oncontextmenu", 105 | "oncontextrestored", 106 | "oncuechange", 107 | "ondblclick", 108 | "ondrag", 109 | "ondragend", 110 | "ondragenter", 111 | "ondragleave", 112 | "ondragover", 113 | "ondragstart", 114 | "ondrop", 115 | "ondurationchange", 116 | "onemptied", 117 | "onended", 118 | "onerror", 119 | "onfocus", 120 | "onformdata", 121 | "oninput", 122 | "oninvalid", 123 | "onkeydown", 124 | "onkeypress", 125 | "onkeyup", 126 | "onload", 127 | "onloadeddata", 128 | "onloadedmetadata", 129 | "onloadstart", 130 | "onmousedown", 131 | "onmouseenter", 132 | "onmouseleave", 133 | "onmousemove", 134 | "onmouseout", 135 | "onmouseover", 136 | "onmouseup", 137 | "onmousewheel", 138 | "onpause", 139 | "onplay", 140 | "onplaying", 141 | "onprogress", 142 | "onratechange", 143 | "onreset", 144 | "onresize", 145 | "onscroll", 146 | "onsecuritypolicyviolation", 147 | "onseeked", 148 | "onseeking", 149 | "onselect", 150 | "onslotchange", 151 | "onstalled", 152 | "onsubmit", 153 | "onsuspend", 154 | "ontimeupdate", 155 | "ontoggle", 156 | "onvolumechange", 157 | "onwaiting", 158 | "onwebkitanimationend", 159 | "onwebkitanimationiteration", 160 | "onwebkitanimationstart", 161 | "onwebkittransitionend", 162 | "onwheel", 163 | "onauxclick", 164 | "ongotpointercapture", 165 | "onlostpointercapture", 166 | "onpointerdown", 167 | "onpointermove", 168 | "onpointerrawupdate", 169 | "onpointerup", 170 | "onpointercancel", 171 | "onpointerover", 172 | "onpointerout", 173 | "onpointerenter", 174 | "onpointerleave", 175 | "onselectstart", 176 | "onselectionchange", 177 | "onanimationend", 178 | "onanimationiteration", 179 | "onanimationstart", 180 | "ontransitionrun", 181 | "ontransitionstart", 182 | "ontransitionend", 183 | "ontransitioncancel", 184 | "onafterprint", 185 | "onbeforeprint", 186 | "onbeforeunload", 187 | "onhashchange", 188 | "onlanguagechange", 189 | "onmessage", 190 | "onmessageerror", 191 | "onoffline", 192 | "ononline", 193 | "onpagehide", 194 | "onpageshow", 195 | "onpopstate", 196 | "onrejectionhandled", 197 | "onstorage", 198 | "onunhandledrejection", 199 | "onunload", 200 | "isSecureContext", 201 | "crossOriginIsolated", 202 | "scheduler", 203 | "alert", 204 | "atob", 205 | "blur", 206 | "btoa", 207 | "cancelAnimationFrame", 208 | "cancelIdleCallback", 209 | "captureEvents", 210 | "clearInterval", 211 | "clearTimeout", 212 | "close", 213 | "confirm", 214 | "createImageBitmap", 215 | "fetch", 216 | "find", 217 | "focus", 218 | "getComputedStyle", 219 | "getSelection", 220 | "matchMedia", 221 | "moveBy", 222 | "moveTo", 223 | "open", 224 | "postMessage", 225 | "print", 226 | "prompt", 227 | "queueMicrotask", 228 | "releaseEvents", 229 | "reportError", 230 | "requestAnimationFrame", 231 | "requestIdleCallback", 232 | "resizeBy", 233 | "resizeTo", 234 | "scroll", 235 | "scrollBy", 236 | "scrollTo", 237 | "setInterval", 238 | "setTimeout", 239 | "stop", 240 | "structuredClone", 241 | "webkitCancelAnimationFrame", 242 | "webkitRequestAnimationFrame", 243 | "chrome", 244 | "caches", 245 | "cookieStore", 246 | "ondevicemotion", 247 | "ondeviceorientation", 248 | "ondeviceorientationabsolute", 249 | "sharedStorage", 250 | "documentPictureInPicture", 251 | "fetchLater", 252 | "getScreenDetails", 253 | "queryLocalFonts", 254 | "showDirectoryPicker", 255 | "showOpenFilePicker", 256 | "showSaveFilePicker", 257 | "originAgentCluster", 258 | "viewport", 259 | "onpageswap", 260 | "onpagereveal", 261 | "credentialless", 262 | "fence", 263 | "launchQueue", 264 | "speechSynthesis", 265 | "oncommand", 266 | "onscrollend", 267 | "onscrollsnapchange", 268 | "onscrollsnapchanging", 269 | "webkitRequestFileSystem", 270 | "webkitResolveLocalFileSystemURL", 271 | "define", 272 | "ethereum", 273 | "__oai_SSR_HTML", 274 | "__reactRouterContext", 275 | "$RC", 276 | "__oai_SSR_TTI", 277 | "__reactRouterManifest", 278 | "__reactRouterVersion", 279 | "DD_RUM", 280 | "__REACT_INTL_CONTEXT__", 281 | "regeneratorRuntime", 282 | "DD_LOGS", 283 | "__STATSIG__", 284 | "__mobxInstanceCount", 285 | "__mobxGlobals", 286 | "_g", 287 | "__reactRouterRouteModules", 288 | "__SEGMENT_INSPECTOR__", 289 | "__reactRouterDataRouter", 290 | "MotionIsMounted", 291 | "_oaiHandleSessionExpired" 292 | ] 293 | 294 | if not cookies: 295 | self._fetch_cookies() 296 | else: 297 | self.session.cookies.update(cookies) 298 | 299 | def _generate_react(self) -> str: 300 | n = random() 301 | base36 = '' 302 | chars = '0123456789abcdefghijklmnopqrstuvwxyz' 303 | x = int(n * 36**10) 304 | for _ in range(10): 305 | x, r = divmod(x, 36) 306 | base36 = chars[r] + base36 307 | return base36 308 | 309 | def _parse_event_stream(self, stream_data: str) -> str: 310 | result: list = [] 311 | lines: list = stream_data.strip().split('\n') 312 | 313 | for line in lines: 314 | if line.startswith('data:'): 315 | 316 | data_str: str = line[5:].strip() 317 | 318 | if data_str == '[DONE]': 319 | break 320 | 321 | data: dict = loads(data_str) 322 | 323 | if isinstance(data, dict): 324 | 325 | if data.get('o') == 'append' and data.get('p') == '/message/content/parts/0': 326 | 327 | result.append(data.get('v')) 328 | 329 | elif data.get('o') == 'patch' and isinstance(data.get('v'), list): 330 | 331 | for op in data.get('v'): 332 | 333 | if op.get('o') == 'append' and op.get('p') == '/message/content/parts/0': 334 | 335 | result.append(op.get('v')) 336 | 337 | elif 'v' in data and isinstance(data['v'], str): 338 | result.append(data['v']) 339 | 340 | return (''.join(result)).replace("\n", "") 341 | 342 | def _fetch_cookies(self) -> None: 343 | 344 | load_site: requests.models.Response = self.session.get("https://chatgpt.com") 345 | self.session.cookies.update(load_site.cookies) 346 | 347 | self.data["prod"] = load_site.text.split('data-build="')[1].split('"')[0] 348 | self.data["device-id"] = self.session.cookies.get("oai-did") 349 | 350 | self.start_time: int = int(time() * 1000) 351 | self.sid: str = str(uuid4()) 352 | 353 | self.data["config"] = [ 354 | 4880, 355 | datetime.now(ZoneInfo(self.ip_info[5])).strftime(f"%a %b %d %Y %H:%M:%S GMT%z ({datetime.now(ZoneInfo(self.ip_info[5])).tzname()})"), 356 | 4294705152, 357 | random(), 358 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36", 359 | None, 360 | self.data["prod"], 361 | "de-DE", 362 | "de-DE,de,en-US,en", 363 | random(), 364 | "webkitGetUserMedia−function webkitGetUserMedia() { [native code] }", 365 | choice(self.reacts), 366 | choice(self.window_keys), 367 | randint(800, 1400) + random(), 368 | self.sid, 369 | "", 370 | 20, 371 | self.start_time 372 | ] 373 | 374 | def _get_tokens(self, process_time: int=randint(1400, 2000)) -> None: 375 | 376 | self.session.headers = Headers.REQUIREMENTS 377 | self.session.headers.update({ 378 | 'oai-client-version': self.data["prod"], 379 | 'oai-device-id': self.data["device-id"], 380 | }) 381 | 382 | p_value: str = Challenges.generate_token(self.data["config"]) 383 | self.data["vm_token"] = p_value 384 | 385 | self.data["config"] = [ 386 | 4880, 387 | datetime.now(ZoneInfo(self.ip_info[5])).strftime(f"%a %b %d %Y %H:%M:%S GMT%z ({datetime.now(ZoneInfo(self.ip_info[5])).tzname()})"), 388 | 4294705152, 389 | random(), 390 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36", 391 | None, 392 | self.data["prod"], 393 | "de-DE", 394 | "de-DE,de,en-US,en", 395 | random(), 396 | "webkitGetUserMedia−function webkitGetUserMedia() { [native code] }", 397 | choice(self.reacts), 398 | choice(self.window_keys), 399 | process_time + random(), 400 | self.sid, 401 | "", 402 | 20, 403 | self.start_time 404 | ] 405 | 406 | requirements_data: dict = { 407 | 'p': p_value, 408 | } 409 | 410 | requirements_request: requests.models.Response = self.session.post('https://chatgpt.com/backend-anon/sentinel/chat-requirements', json=requirements_data) 411 | 412 | if requirements_request.status_code == 200: 413 | self.data["token"] = requirements_request.json().get("token") 414 | self.data["proofofwork"] = requirements_request.json().get("proofofwork") 415 | self.data["bytecode"] = requirements_request.json().get("turnstile").get("dx") 416 | 417 | else: 418 | Log.Error("Something went wrong while fetching chat requirements") 419 | 420 | def get_conduit(self, next: bool = False) -> str: 421 | self.session.headers = Headers.CONDUIT 422 | self.session.headers.update({ 423 | 'oai-client-version': self.data["prod"], 424 | 'oai-device-id': self.data["device-id"], 425 | }) 426 | 427 | if not next: 428 | post_data: dict = { 429 | 'action': 'next', 430 | 'fork_from_shared_post': False, 431 | 'parent_message_id': 'client-created-root', 432 | 'model': 'auto', 433 | 'timezone_offset_min': self.timezone_offset, 434 | 'timezone': self.ip_info[5], 435 | 'history_and_training_disabled': True, 436 | 'conversation_mode': { 437 | 'kind': 'primary_assistant', 438 | }, 439 | 'system_hints': [], 440 | 'supports_buffering': True, 441 | 'supported_encodings': [ 442 | 'v1', 443 | ], 444 | } 445 | 446 | else: 447 | post_data: dict = { 448 | 'action': 'next', 449 | 'fork_from_shared_post': False, 450 | 'conversation_id': self.data["conversation_id"], 451 | 'parent_message_id': self.data["parent_message_id"], 452 | 'model': 'auto', 453 | 'timezone_offset_min': self.timezone_offset, 454 | 'timezone': self.ip_info[5], 455 | 'history_and_training_disabled': True, 456 | 'conversation_mode': { 457 | 'kind': 'primary_assistant', 458 | }, 459 | 'system_hints': [], 460 | 'supports_buffering': True, 461 | 'supported_encodings': [ 462 | 'v1', 463 | ], 464 | } 465 | 466 | conduit_request: requests.models.Response = self.session.post('https://chatgpt.com/backend-anon/f/conversation/prepare', json=post_data) 467 | 468 | if '"status":"ok"' in conduit_request.text: 469 | return conduit_request.json().get("conduit_token") 470 | 471 | else: 472 | Log.Error("Something went wrong while fetching conduit token: ") 473 | Log.Error(conduit_request.text) 474 | return None 475 | 476 | def start_conversation(self, message: str) -> None: 477 | 478 | self._get_tokens() 479 | conduit_token: str = self.get_conduit() 480 | 481 | time_1: int = randint(6000, 9000) 482 | proof_token: str = Challenges.solve_pow(self.data["proofofwork"]["seed"], self.data["proofofwork"]["difficulty"], self.data["config"]) 483 | Log.Success(f"Solved POW: {proof_token}") 484 | turnstile_token: str = VM.get_turnstile(self.data["bytecode"], self.data["vm_token"], str(self.ip_info[:-1])) 485 | 486 | self.session.headers = Headers.CONVERSATION 487 | self.session.headers.update({ 488 | 'oai-client-version': self.data["prod"], 489 | 'oai-device-id': self.data["device-id"], 490 | 'oai-echo-logs': f'0,{time_1},1,{time_1 + randint(1000, 1200)}', 491 | 'openai-sentinel-chat-requirements-token': self.data["token"], 492 | 'openai-sentinel-proof-token': proof_token, 493 | 'openai-sentinel-turnstile-token': turnstile_token, 494 | 'x-conduit-token': conduit_token, 495 | }) 496 | 497 | conversation_data: dict = { 498 | 'action': 'next', 499 | 'messages': [ 500 | { 501 | 'id': str(uuid4()), 502 | 'author': { 503 | 'role': 'user', 504 | }, 505 | 'create_time': round(time(), 3), 506 | 'content': { 507 | 'content_type': 'text', 508 | 'parts': [ 509 | message, 510 | ], 511 | }, 512 | 'metadata': { 513 | 'selected_github_repos': [], 514 | 'selected_all_github_repos': False, 515 | 'serialization_metadata': { 516 | 'custom_symbol_offsets': [], 517 | }, 518 | }, 519 | }, 520 | ], 521 | 'parent_message_id': 'client-created-root', 522 | 'model': 'auto', 523 | 'timezone_offset_min': self.timezone_offset, 524 | 'timezone': self.ip_info[5], 525 | 'history_and_training_disabled': True, 526 | 'conversation_mode': { 527 | 'kind': 'primary_assistant', 528 | }, 529 | 'enable_message_followups': True, 530 | 'system_hints': [], 531 | 'supports_buffering': True, 532 | 'supported_encodings': [ 533 | 'v1', 534 | ], 535 | 'client_contextual_info': { 536 | 'is_dark_mode': True, 537 | 'time_since_loaded': randint(3, 6), 538 | 'page_height': 1219, 539 | 'page_width': 3440, 540 | 'pixel_ratio': 1, 541 | 'screen_height': 1440, 542 | 'screen_width': 3440, 543 | }, 544 | 'paragen_cot_summary_display_override': 'allow', 545 | 'force_parallel_switch': 'auto', 546 | } 547 | 548 | conversation_request: requests.models.Response = self.session.post('https://chatgpt.com/backend-anon/f/conversation', json=conversation_data) 549 | self.session.cookies.update(conversation_request.cookies) 550 | 551 | if 'Unusual activity' in conversation_request.text: 552 | Log.Error("Your IP got flagged by chatgpt, retry with a new IP") 553 | exit(conversation_request.status_code) 554 | 555 | self.data["conversation_id"] = Utils.between(conversation_request.text, '"conversation_id": "', '"') 556 | self.data["parent_message_id"] = Utils.between(conversation_request.text, '"message_id": "', '"') 557 | self.response = self._parse_event_stream(conversation_request.text) 558 | 559 | def upload_image(self, image: str) -> None: 560 | 561 | self.session.headers = Headers.REQUIREMENTS 562 | self.session.headers.update({ 563 | 'oai-client-version': self.data["prod"], 564 | 'oai-device-id': self.data["device-id"], 565 | }) 566 | 567 | self.file_name: str = str(uuid4()) 568 | 569 | if image.startswith("data:image"): 570 | image = image.split(",")[1] 571 | 572 | self.file_size: int = len(b64decode(image)) 573 | self.width, self.height = Image.open(BytesIO(b64decode(image))).size 574 | 575 | image_data: dict = { 576 | 'file_name': f'{self.file_name}.png', 577 | 'file_size': self.file_size, 578 | 'use_case': 'multimodal', 579 | 'timezone_offset_min': self.timezone_offset, 580 | 'reset_rate_limits': False, 581 | } 582 | file_request: requests.models.Response = self.session.post('https://chatgpt.com/backend-anon/files', json=image_data) 583 | 584 | self.data["file_id"] = file_request.json().get("file_id") 585 | upload_url: str = file_request.json().get("upload_url") 586 | 587 | self.session.headers = Headers.FILE 588 | upload_request: requests.models.Response = self.session.put(upload_url, data=b64decode(image)) 589 | 590 | self.session.headers = Headers.REQUIREMENTS 591 | self.session.headers.update({ 592 | 'oai-client-version': self.data["prod"], 593 | 'oai-device-id': self.data["device-id"], 594 | }) 595 | 596 | process_data: dict = { 597 | 'file_id': self.data["file_id"], 598 | 'use_case': 'multimodal', 599 | 'index_for_retrieval': False, 600 | 'file_name': f'{self.file_name}.png', 601 | } 602 | 603 | process_request: requests.models.Response = self.session.post('https://chatgpt.com/backend-anon/files/process_upload_stream', json=process_data) 604 | 605 | if "Succeeded processing " in process_request.text: 606 | return 607 | else: 608 | Log.Error("Something went wrong while uploading image") 609 | 610 | 611 | 612 | def start_with_image(self, message: str, image: str) -> None: 613 | 614 | self._get_tokens() 615 | conduit_token: str = self.get_conduit() 616 | self.upload_image(image) 617 | 618 | time_1: int = randint(6000, 9000) 619 | proof_token: str = Challenges.solve_pow(self.data["proofofwork"]["seed"], self.data["proofofwork"]["difficulty"], self.data["config"]) 620 | 621 | turnstile_token: str = VM.get_turnstile(self.data["bytecode"], self.data["vm_token"], str(self.ip_info[:-1])) 622 | 623 | self.session.headers = Headers.CONVERSATION 624 | self.session.headers.update({ 625 | 'oai-client-version': self.data["prod"], 626 | 'oai-device-id': self.data["device-id"], 627 | 'oai-echo-logs': f'0,{time_1},1,{time_1 + randint(1000, 1200)}', 628 | 'openai-sentinel-chat-requirements-token': self.data["token"], 629 | 'openai-sentinel-proof-token': proof_token, 630 | 'openai-sentinel-turnstile-token': turnstile_token, 631 | 'x-conduit-token': conduit_token, 632 | }) 633 | 634 | conversation_data: dict = { 635 | 'action': 'next', 636 | 'messages': [ 637 | { 638 | 'id': str(uuid4()), 639 | 'author': { 640 | 'role': 'user', 641 | }, 642 | 'create_time': round(time(), 3), 643 | 'content': { 644 | 'content_type': 'multimodal_text', 645 | 'parts': [ 646 | { 647 | 'content_type': 'image_asset_pointer', 648 | 'asset_pointer': f'file-service://{self.data["file_id"]}', 649 | 'size_bytes': self.file_size, 650 | 'width': self.width, 651 | 'height': self.height, 652 | }, 653 | message, 654 | ], 655 | }, 656 | 'metadata': { 657 | 'attachments': [ 658 | { 659 | 'id': self.data["file_id"], 660 | 'size': self.file_size, 661 | 'name': f'{self.file_name}.png', 662 | 'mime_type': 'image/png', 663 | 'width': self.width, 664 | 'height': self.height, 665 | 'source': 'local', 666 | }, 667 | ], 668 | 'selected_github_repos': [], 669 | 'selected_all_github_repos': False, 670 | 'serialization_metadata': { 671 | 'custom_symbol_offsets': [], 672 | }, 673 | }, 674 | }, 675 | ], 676 | 'parent_message_id': 'client-created-root', 677 | 'model': 'auto', 678 | 'timezone_offset_min': self.timezone_offset, 679 | 'timezone': self.ip_info[5], 680 | 'history_and_training_disabled': True, 681 | 'conversation_mode': { 682 | 'kind': 'primary_assistant', 683 | }, 684 | 'enable_message_followups': True, 685 | 'system_hints': [], 686 | 'supports_buffering': True, 687 | 'supported_encodings': [ 688 | 'v1', 689 | ], 690 | 'client_contextual_info': { 691 | 'is_dark_mode': True, 692 | 'time_since_loaded': randint(3, 6), 693 | 'page_height': 1219, 694 | 'page_width': 3440, 695 | 'pixel_ratio': 1, 696 | 'screen_height': 1440, 697 | 'screen_width': 3440, 698 | }, 699 | 'paragen_cot_summary_display_override': 'allow', 700 | 'force_parallel_switch': 'auto', 701 | } 702 | 703 | conversation_request: requests.models.Response = self.session.post('https://chatgpt.com/backend-anon/f/conversation', json=conversation_data) 704 | self.session.cookies.update(conversation_request.cookies) 705 | 706 | if 'Unusual activity' in conversation_request.text: 707 | Log.Error("Your IP got flagged by chatgpt, retry with a new IP") 708 | exit(conversation_request.status_code) 709 | 710 | self.data["conversation_id"] = Utils.between(conversation_request.text, '"conversation_id": "', '"') 711 | self.data["parent_message_id"] = Utils.between(conversation_request.text, '"message_id": "', '"') 712 | self.response = self._parse_event_stream(conversation_request.text) 713 | 714 | def hold_conversation(self, message: str, new: bool = True) -> None: 715 | self.index = 2000 716 | 717 | if new: 718 | self.start_conversation(message) 719 | 720 | conduit_token: str = self.get_conduit(next=True) 721 | 722 | self._get_tokens(randint(self.index, self.index + 1000)) 723 | self.index += 3000 724 | 725 | time_1: int = randint(self.index, self.index + 3000) 726 | proof_token: str = Challenges.solve_pow(self.data["proofofwork"]["seed"], self.data["proofofwork"]["difficulty"], self.data["config"]) 727 | 728 | turnstile_token: str = VM.get_turnstile(self.data["bytecode"], self.data["vm_token"], str(self.ip_info[:-1])) 729 | 730 | 731 | self.session.headers = Headers.CONVERSATION 732 | self.session.headers.update({ 733 | 'oai-client-version': self.data["prod"], 734 | 'oai-device-id': self.data["device-id"], 735 | 'oai-echo-logs': f'0,{time_1},1,{time_1 + randint(1000, 1200)}', 736 | 'openai-sentinel-chat-requirements-token': self.data["token"], 737 | 'openai-sentinel-proof-token': proof_token, 738 | 'openai-sentinel-turnstile-token': turnstile_token, 739 | 'x-conduit-token': conduit_token, 740 | }) 741 | 742 | if new: 743 | new_message: str = input("Prompt: ") 744 | else: 745 | new_message: str = message 746 | 747 | conversation_data: dict = { 748 | 'action': 'next', 749 | 'messages': [ 750 | { 751 | 'id': str(uuid4()), 752 | 'author': { 753 | 'role': 'user', 754 | }, 755 | 'create_time': round(time(), 3), 756 | 'content': { 757 | 'content_type': 'text', 758 | 'parts': [ 759 | new_message, 760 | ], 761 | }, 762 | 'metadata': { 763 | 'selected_github_repos': [], 764 | 'selected_all_github_repos': False, 765 | 'serialization_metadata': { 766 | 'custom_symbol_offsets': [], 767 | }, 768 | }, 769 | }, 770 | ], 771 | 'conversation_id': self.data["conversation_id"], 772 | 'parent_message_id': self.data["parent_message_id"], 773 | 'model': 'auto', 774 | 'timezone_offset_min': self.timezone_offset, 775 | 'timezone': self.ip_info[5], 776 | 'history_and_training_disabled': True, 777 | 'conversation_mode': { 778 | 'kind': 'primary_assistant', 779 | }, 780 | 'enable_message_followups': True, 781 | 'system_hints': [], 782 | 'supports_buffering': True, 783 | 'supported_encodings': [ 784 | 'v1', 785 | ], 786 | 'client_contextual_info': { 787 | 'is_dark_mode': True, 788 | 'time_since_loaded': 17, 789 | 'page_height': 1219, 790 | 'page_width': 3440, 791 | 'pixel_ratio': 1, 792 | 'screen_height': 1440, 793 | 'screen_width': 3440, 794 | }, 795 | 'paragen_cot_summary_display_override': 'allow', 796 | 'force_parallel_switch': 'auto', 797 | } 798 | 799 | conversation_request: requests.models.Response = self.session.post('https://chatgpt.com/backend-anon/f/conversation', json=conversation_data) 800 | self.session.cookies.update(conversation_request.cookies) 801 | 802 | if 'Unusual activity' in conversation_request.text: 803 | Log.Error("Your IP got flagged by chatgpt, retry with a new IP") 804 | exit(conversation_request.status_code) 805 | 806 | self.data["conversation_id"] = Utils.between(conversation_request.text, '"conversation_id": "', '"') 807 | self.data["parent_message_id"] = Utils.between(conversation_request.text, '"message_id": "', '"') 808 | 809 | self.response = self._parse_event_stream(conversation_request.text) 810 | 811 | def ask_question(self, message: str, image: str = None) -> str: 812 | 813 | if not image: 814 | self.start_conversation(message) 815 | else: 816 | self.start_with_image(message, image) 817 | 818 | return self.response --------------------------------------------------------------------------------