├── .github ├── FUNDING.yml └── workflows │ └── release.yml ├── .gitignore ├── Libs ├── constants.py ├── device.py ├── device_gen.py ├── signature.py ├── ttencrypt.py └── xgorgon.py ├── README.md ├── TiktokStreamKeyGenerator.py └── requirements.txt /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: Loukious 2 | buy_me_a_coffee: loukious -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | version: 7 | description: "The new version number (e.g., 1.1)" 8 | required: true 9 | changelog: 10 | description: "The changelog for this version" 11 | required: true 12 | 13 | env: 14 | FORCE_COLOR: true 15 | 16 | jobs: 17 | create-tag: 18 | runs-on: ubuntu-22.04 19 | steps: 20 | - name: Checkout Repository 21 | uses: actions/checkout@v4 22 | - name: Create Git Tag 23 | run: | 24 | git config user.name "github-actions[bot]" 25 | git config user.email "github-actions[bot]@users.noreply.github.com" 26 | git tag "v${{ github.event.inputs.version }}" || echo "Tag creation failed (possibly already exists)." 27 | git push origin "v${{ github.event.inputs.version }}" || echo "Tag push failed (possibly already exists)." 28 | 29 | build_windows: 30 | runs-on: windows-latest 31 | needs: create-tag 32 | strategy: 33 | matrix: 34 | build_type: [Release, Debug] 35 | 36 | steps: 37 | - uses: actions/checkout@v3 38 | 39 | - name: Set Release variable 40 | run: | 41 | echo "RELEASE=${{ matrix.build_type }}" >> $env:GITHUB_ENV 42 | 43 | - name: Set up Python 3.10 44 | uses: actions/setup-python@v3 45 | with: 46 | python-version: "3.10" 47 | 48 | - name: Install dependencies 49 | run: | 50 | python -m pip install --upgrade pip 51 | pip install Nuitka clang 52 | if (Test-Path requirements.txt) { 53 | pip install -r requirements.txt 54 | } 55 | 56 | - name: Build Executable 57 | run: | 58 | Write-Host "Release variable is set to: $env:Release" 59 | if ($env:Release -eq 'Release') { 60 | nuitka ` 61 | --assume-yes-for-downloads ` 62 | --show-scons ` 63 | --clang ` 64 | --lto=no ` 65 | --jobs=4 ` 66 | --static-libpython=no ` 67 | --standalone ` 68 | --enable-plugin=anti-bloat ` 69 | --enable-plugin=tk-inter ` 70 | --show-modules ` 71 | --show-anti-bloat-changes ` 72 | --follow-stdlib ` 73 | --follow-imports ` 74 | --nofollow-import-to="*.tests" ` 75 | --nofollow-import-to="unittest" ` 76 | --nofollow-import-to="pydoc" ` 77 | --nofollow-import-to="test" ` 78 | --prefer-source-code ` 79 | --windows-console-mode=disable ` 80 | TiktokStreamKeyGenerator.py 81 | } else { 82 | nuitka ` 83 | --assume-yes-for-downloads ` 84 | --show-scons ` 85 | --clang ` 86 | --lto=no ` 87 | --jobs=4 ` 88 | --static-libpython=no ` 89 | --standalone ` 90 | --enable-plugin=anti-bloat ` 91 | --enable-plugin=tk-inter ` 92 | --show-modules ` 93 | --show-anti-bloat-changes ` 94 | --follow-stdlib ` 95 | --follow-imports ` 96 | --nofollow-import-to="*.tests" ` 97 | --nofollow-import-to="unittest" ` 98 | --nofollow-import-to="pydoc" ` 99 | --nofollow-import-to="test" ` 100 | --prefer-source-code ` 101 | TiktokStreamKeyGenerator.py 102 | } 103 | 104 | - name: Compress Executable 105 | run: Compress-Archive -Path TiktokStreamKeyGenerator.dist\* -DestinationPath TiktokStreamKeyGenerator${{ matrix.build_type }}-win.zip 106 | 107 | - name: Upload artifacts 108 | uses: actions/upload-artifact@v4 109 | with: 110 | name: windows-${{ matrix.build_type }} 111 | path: | 112 | ./TiktokStreamKeyGenerator${{ matrix.build_type }}-win.zip 113 | 114 | build_macos: 115 | runs-on: macos-latest 116 | needs: create-tag 117 | strategy: 118 | matrix: 119 | architecture: [x86_64, arm64] 120 | build_type: [Release] 121 | 122 | steps: 123 | - uses: actions/checkout@v3 124 | 125 | - name: Set up Python 3.10 126 | uses: actions/setup-python@v3 127 | with: 128 | python-version: "3.10" 129 | 130 | - name: Install dependencies 131 | run: | 132 | python -m pip install --upgrade pip 133 | pip install -U Nuitka clang certifi 134 | if [ -f requirements.txt ]; then pip install -r requirements.txt; fi 135 | 136 | - name: Build Executable 137 | run: | 138 | arch -${{ matrix.architecture }} nuitka \ 139 | --assume-yes-for-downloads \ 140 | --show-scons \ 141 | --clang \ 142 | --lto=no \ 143 | --jobs=4 \ 144 | --static-libpython=no \ 145 | --standalone \ 146 | --enable-plugin=anti-bloat \ 147 | --show-modules \ 148 | --show-anti-bloat-changes \ 149 | --follow-stdlib \ 150 | --follow-imports \ 151 | --enable-plugin=tk-inter \ 152 | --include-package=undetected_chromedriver \ 153 | --include-package=certifi \ 154 | --nofollow-import-to="*.tests" \ 155 | --nofollow-import-to="unittest" \ 156 | --nofollow-import-to="pydoc" \ 157 | --nofollow-import-to="test" \ 158 | --prefer-source-code \ 159 | --macos-target-arch=${{ matrix.architecture }} \ 160 | TiktokStreamKeyGenerator.py 161 | 162 | - name: Compress Executable 163 | run: | 164 | zip -r TiktokStreamKeyGenerator-${{ matrix.architecture }}-macos.zip TiktokStreamKeyGenerator.dist/* 165 | 166 | - name: Upload artifacts 167 | uses: actions/upload-artifact@v4 168 | with: 169 | name: macos-${{ matrix.architecture }} 170 | path: | 171 | TiktokStreamKeyGenerator-${{ matrix.architecture }}-macos.zip 172 | 173 | build_linux: 174 | runs-on: ubuntu-22.04 175 | needs: create-tag 176 | strategy: 177 | matrix: 178 | build_type: [Release] 179 | 180 | steps: 181 | - uses: actions/checkout@v3 182 | 183 | - name: Install dependencies 184 | run: | 185 | sudo apt-get update 186 | sudo apt-get install -y ccache python3-pip python3-tk zip python3-distutils 187 | python3 -m pip install --upgrade pip 188 | pip3 install -U Nuitka clang certifi 189 | if [ -f requirements.txt ]; then pip3 install -r requirements.txt; fi 190 | 191 | - name: Build Executable 192 | run: | 193 | nuitka \ 194 | --assume-yes-for-downloads \ 195 | --show-scons \ 196 | --clang \ 197 | --lto=no \ 198 | --jobs=4 \ 199 | --static-libpython=no \ 200 | --standalone \ 201 | --enable-plugin=anti-bloat \ 202 | --enable-plugin=tk-inter \ 203 | --include-package=undetected_chromedriver \ 204 | --include-package=certifi \ 205 | --show-modules \ 206 | --show-anti-bloat-changes \ 207 | --follow-stdlib \ 208 | --follow-imports \ 209 | --nofollow-import-to="*.tests" \ 210 | --nofollow-import-to="unittest" \ 211 | --nofollow-import-to="pydoc" \ 212 | --nofollow-import-to="test" \ 213 | --prefer-source-code \ 214 | TiktokStreamKeyGenerator.py 215 | 216 | - name: Compress Executable 217 | run: zip -r TiktokStreamKeyGenerator-linux.zip TiktokStreamKeyGenerator.dist/* 218 | 219 | - name: Upload artifacts 220 | uses: actions/upload-artifact@v4 221 | with: 222 | name: linux- 223 | path: | 224 | ./TiktokStreamKeyGenerator-linux.zip 225 | 226 | release: 227 | runs-on: ubuntu-latest 228 | needs: [build_linux, build_windows, build_macos] 229 | 230 | steps: 231 | - name: Checkout code 232 | uses: actions/checkout@v3 233 | 234 | - name: Download Windows artifacts 235 | uses: actions/download-artifact@v4 236 | with: 237 | pattern: windows-* 238 | merge-multiple: true 239 | path: ./windows 240 | 241 | - name: Download MacOS artifacts 242 | uses: actions/download-artifact@v4 243 | with: 244 | pattern: macos-* 245 | merge-multiple: true 246 | path: ./macos 247 | 248 | - name: Download Linux artifacts 249 | uses: actions/download-artifact@v4 250 | with: 251 | pattern: linux-* 252 | merge-multiple: true 253 | path: ./linux 254 | 255 | - name: Create the release 256 | uses: softprops/action-gh-release@v1 257 | env: 258 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 259 | with: 260 | tag_name: "v${{ github.event.inputs.version }}" 261 | body: ${{ github.event.inputs.changelog }} 262 | files: | 263 | ./windows/TiktokStreamKeyGeneratorRelease-win.zip 264 | ./windows/TiktokStreamKeyGeneratorDebug-win.zip 265 | ./macos/TiktokStreamKeyGenerator-x86_64-macos.zip 266 | ./macos/TiktokStreamKeyGenerator-arm64-macos.zip 267 | ./linux/TiktokStreamKeyGenerator-linux.zip -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | cookies* 2 | config* 3 | TiktokStreamKeyGenerator.spec 4 | build/* 5 | dist/* 6 | *.pem 7 | */__pycache__/* 8 | .env 9 | __pycache__/* 10 | -------------------------------------------------------------------------------- /Libs/constants.py: -------------------------------------------------------------------------------- 1 | application = { 2 | "aid": 1233, 3 | "app_name": "musical_ly", 4 | "version_code": "190103", 5 | "version_name": "19.1.3", 6 | "ab_version": "19.1.3", 7 | "build_number": "19.1.3", 8 | "update_version_code": 2021901030, 9 | "manifest_version_code": 2021901030, 10 | "app_version": "19.1.3", 11 | "version_code": 190103, 12 | "git_hash": "27690874", 13 | "release_build": "6e21592_20210415", 14 | "sig_hash": "3e084e9c0ae40e21f00baf8b2a111091", 15 | "sdk": "2", 16 | "sdk_version": "19", 17 | } 18 | 19 | locales = [ 20 | {"by": "be-BY"}, 21 | {"bg": "bg-BG"}, 22 | {"es": "ca-ES"}, 23 | {"cz": "cs-CZ"}, 24 | {"dk": "da-DK"}, 25 | {"de": "de-DE"}, 26 | {"gr": "el-GR"}, 27 | {"au": "en-AU"}, 28 | {"us": "en-US"}, 29 | {"fr": "fr-FR"}, 30 | {"hr": "hr-HR"}, 31 | {"it": "it-IT"}, 32 | {"lt": "lt-LT"}, 33 | {"pl": "pl-PL"}, 34 | {"pt": "pt-BR"}, 35 | {"ro": "ro-RO"}, 36 | {"ru": "ru-RU"}, 37 | {"sk": "sk-SK"}, 38 | {"se": "sv-SE"}, 39 | {"il": "iw-IL"}, 40 | {"in": "hi-IN"}, 41 | ] 42 | devices = [ 43 | { 44 | "brand": "samsung", 45 | "model": ["SM-A127F"], 46 | "resolution": "1467x720", 47 | "dpi": 300, 48 | "build": ["RP1A.200720.012"], 49 | "rom": ["A127FXXU3AUJ5"], 50 | "board": [ 51 | "universal7884B", 52 | "mt6768", 53 | "mt6768", 54 | "atoll", 55 | "universal9825", 56 | "universal7904", 57 | "universal7904", 58 | "universal9611", 59 | "mt6765", 60 | "msm8953", 61 | "universal7870", 62 | "universal9610", 63 | "universal9610", 64 | "universal9611", 65 | "msm8937", 66 | "universal7870", 67 | "universal7870", 68 | "msm8953", 69 | "universal7570", 70 | "msm8953", 71 | "mt6765", 72 | "mt6739", 73 | "sm6150", 74 | "universal9810", 75 | "msm8998", 76 | "universal7904", 77 | "sdm660", 78 | "universal7885", 79 | "msm8953", 80 | "universal7885", 81 | "msm8937", 82 | "universal7884B", 83 | "atoll", 84 | "universal9820", 85 | "universal3830", 86 | "mt6739", 87 | "sdm845", 88 | "universal9611", 89 | "universal3830", 90 | "universal9820", 91 | "universal3830", 92 | "mt6768", 93 | "sm6150", 94 | "mt6768", 95 | "universal9810", 96 | "universal9611", 97 | "universal9610", 98 | "universal7904", 99 | "kona", 100 | "msm8937", 101 | "msm8953", 102 | "mt6765", 103 | "msm8937", 104 | "mt6765", 105 | "msm8937", 106 | "bengal", 107 | "universal9810", 108 | "msmnile", 109 | "universal7904", 110 | "universal2100_r", 111 | ], 112 | "core": [ 113 | "exynos7884B", 114 | "k69v1_64_titan_marmot", 115 | "k68v1_64_titan", 116 | "atoll", 117 | "exynos9825", 118 | "exynos7904", 119 | "exynos7904", 120 | "exynos9611", 121 | "S96116RA1", 122 | "msm8953", 123 | "exynos7870", 124 | "exynos9610", 125 | "exynos9610", 126 | "exynos9611", 127 | "msm8937", 128 | "exynos7870", 129 | "exynos7870", 130 | "msm8953", 131 | "exynos7570", 132 | "QC_Reference_Phone", 133 | "k65v1_64_bsp_titan_rat", 134 | "k39tv1_bsp_1g_titan", 135 | "sm6150", 136 | "exynos9810", 137 | "msm8998", 138 | "exynos7904", 139 | "sdm660", 140 | "exynos7885", 141 | "QC_Reference_Phone", 142 | "exynos7885", 143 | "QC_Reference_Phone", 144 | "exynos7884B", 145 | "atoll", 146 | "exynos9820", 147 | "exynos850", 148 | "k39tv1_bsp_titan_hamster", 149 | "sdm845", 150 | "exynos9611", 151 | "exynos850", 152 | "exynos9820", 153 | "exynos850", 154 | "k68v1_64_titan", 155 | "sm6150", 156 | "k69v1_64_titan_buffalo", 157 | "exynos9810", 158 | "exynos9611", 159 | "exynos9610", 160 | "exynos7904", 161 | "kona", 162 | "QC_Reference_Phone", 163 | "QC_Reference_Phone", 164 | "hs03s", 165 | "QC_Reference_Phone", 166 | "ot8", 167 | "QC_Reference_Phone", 168 | "bengal", 169 | "exynos9810", 170 | "msmnile", 171 | "exynos7904", 172 | "exynos2100", 173 | ], 174 | "device": [ 175 | {"device": "a10", "product": "a10ser"}, 176 | {"device": "a32", "product": "a32ser"}, 177 | {"device": "a31", "product": "a31ser"}, 178 | {"device": "a72q", "product": "a72qnsxx"}, 179 | {"device": "d1", "product": "d1eea"}, 180 | {"device": "a30", "product": "a30ser"}, 181 | {"device": "a30s", "product": "a30sser"}, 182 | {"device": "a51", "product": "a51nsser"}, 183 | {"device": "a10s", "product": "a10sxx"}, 184 | {"device": "a6plte", "product": "a6plteser"}, 185 | {"device": "j6lte", "product": "j6lteser"}, 186 | {"device": "a50", "product": "a50xser"}, 187 | {"device": "a50", "product": "a50ser"}, 188 | {"device": "m31", "product": "m31nsser"}, 189 | {"device": "j6primelte", "product": "j6primelteser"}, 190 | {"device": "j6lte", "product": "j6ltexx"}, 191 | {"device": "a6lte", "product": "a6lteser"}, 192 | {"device": "a20s", "product": "a20sxx"}, 193 | {"device": "j4lte", "product": "j4lteser"}, 194 | {"device": "a02q", "product": "a02qnnser"}, 195 | {"device": "a12", "product": "a12nsser"}, 196 | {"device": "a01core", "product": "a01coreser"}, 197 | {"device": "a71", "product": "a71naxx"}, 198 | {"device": "star2lte", "product": "star2lteser"}, 199 | {"device": "gts4llte", "product": "gts4llteser"}, 200 | {"device": "a40", "product": "a40ser"}, 201 | {"device": "a9y18qlte", "product": "a9y18qlteser"}, 202 | {"device": "a7y18lte", "product": "a7y18ltejt"}, 203 | {"device": "m11q", "product": "m11qnsser"}, 204 | {"device": "a7y18lte", "product": "a7y18lteser"}, 205 | {"device": "gto", "product": "gtoser"}, 206 | {"device": "a20", "product": "a20ser"}, 207 | {"device": "a52q", "product": "a52qnsser"}, 208 | {"device": "beyond0", "product": "beyond0lteser"}, 209 | {"device": "a12s", "product": "a12snsser"}, 210 | {"device": "a02", "product": "a02cisser"}, 211 | {"device": "star2qltesq", "product": "star2qltesq"}, 212 | {"device": "m21", "product": "m21nsser"}, 213 | {"device": "m12", "product": "m12nsser"}, 214 | {"device": "beyond2", "product": "beyond2ltexx"}, 215 | {"device": "a21s", "product": "a21snsser"}, 216 | {"device": "a41", "product": "a41ser"}, 217 | {"device": "a60q", "product": "a60qzh"}, 218 | {"device": "a22", "product": "a22nsser"}, 219 | {"device": "starlte", "product": "starlteser"}, 220 | {"device": "m31s", "product": "m31snsser"}, 221 | {"device": "a50", "product": "a50dd"}, 222 | {"device": "a30", "product": "a30dd"}, 223 | {"device": "x1q", "product": "x1quex"}, 224 | {"device": "a01q", "product": "a01qser"}, 225 | {"device": "a11q", "product": "a11qnsser"}, 226 | {"device": "a03s", "product": "a03snnser"}, 227 | {"device": "gtowifi", "product": "gtowifiser"}, 228 | {"device": "gta7litewifi", "product": "gta7litewifiser"}, 229 | {"device": "m01q", "product": "m01qser"}, 230 | {"device": "gta4l", "product": "gta4lxx"}, 231 | {"device": "crownlte", "product": "crownlteser"}, 232 | {"device": "r5q", "product": "r5qnaxx"}, 233 | {"device": "gta3xl", "product": "gta3xlxx"}, 234 | {"device": "o1s", "product": "o1sxser"}, 235 | ], 236 | "display_density": "mdpi", 237 | "os": 10, 238 | } 239 | ] 240 | -------------------------------------------------------------------------------- /Libs/device.py: -------------------------------------------------------------------------------- 1 | import os 2 | import random 3 | import time, base64, datetime, pytz, uuid, binascii 4 | 5 | from .constants import * 6 | 7 | 8 | class Device: 9 | def __init__(self): 10 | pass 11 | 12 | @staticmethod 13 | def __setup_timezone(country_code: str) -> dict: 14 | timezone_name = random.choice(pytz.country_timezones[country_code]) 15 | timezone = round( 16 | int( 17 | datetime.datetime.now(pytz.timezone(timezone_name)).utcoffset().seconds 18 | / 3600 19 | ) 20 | ) 21 | offset = round( 22 | datetime.datetime.now(pytz.timezone(timezone_name)) 23 | .utcoffset() 24 | .total_seconds() 25 | ) 26 | return { 27 | "timezone_name": timezone_name, 28 | "timezone": timezone, 29 | "offset": offset, 30 | } 31 | 32 | @staticmethod 33 | def __setup_locale(country_code: str) -> str: 34 | try: 35 | search_country = [ 36 | country for country in locales if country_code in country.keys() 37 | ] 38 | return search_country[0][country_code] 39 | except Exception as e: 40 | raise ValueError(e) 41 | 42 | @staticmethod 43 | def __set_gmt(timezone: int) -> str: 44 | if 0 < timezone < 10: 45 | result = "GMT+0{}:00".format(str(timezone)) 46 | if 0 > timezone > -10: 47 | result = "GMT-0{}:00".format(str(timezone)) 48 | if 0 < timezone and timezone >= 10: 49 | result = "GMT+{}:00".format(str(timezone)) 50 | if timezone < 0 and timezone <= -10: 51 | result = "GMT+{}:00".format(str(timezone)) 52 | return result 53 | 54 | @staticmethod 55 | def __guuid() -> str: 56 | return str(uuid.uuid4()) 57 | 58 | @staticmethod 59 | def __openudid() -> str: 60 | return binascii.hexlify(os.urandom(8)).decode() 61 | 62 | @staticmethod 63 | def __detect_api_level(os_version: float) -> int: 64 | if os_version == 7.0: 65 | return 24 66 | if os_version == 8.0: 67 | return 26 68 | if os_version == 9.0: 69 | return 28 70 | if os_version == 10.0: 71 | return 29 72 | if os_version == 11.0: 73 | return 30 74 | 75 | @staticmethod 76 | def __security_path() -> str: 77 | paths = [] 78 | for i in range(2): 79 | random_bytes = os.urandom(16) 80 | encoded_path = base64.urlsafe_b64encode(random_bytes).decode() 81 | paths.append(encoded_path) 82 | return f"/data/app/~~{paths[0]}/com.zhiliaoapp.musically-{paths[1]}/base.apk" 83 | 84 | def create_device(self, country_code: str = "us"): 85 | simple_device = random.choice(devices) 86 | 87 | timezone_params = self.__setup_timezone(country_code) 88 | locales_params = self.__setup_locale(country_code) 89 | gmt = self.__set_gmt(timezone_params["timezone"]) 90 | 91 | build = random.choice(simple_device["build"]) 92 | rom = random.choice(simple_device["rom"]) 93 | core = random.choice(simple_device["core"]) 94 | model = random.choice(simple_device["model"]) 95 | product_info = random.choice(simple_device["device"]) 96 | board = random.choice(simple_device["board"]) 97 | 98 | device_i = product_info["device"] 99 | product = product_info["product"] 100 | 101 | device = { 102 | "device_brand": simple_device["brand"], 103 | "device_model": model, 104 | "google_aid": self.__guuid(), 105 | "cdid": self.__guuid(), 106 | "clientudid": self.__guuid(), 107 | "req_id": self.__guuid(), 108 | "build": build, 109 | "rom": rom, 110 | "rom_version": build + "." + rom, 111 | "resolution": simple_device["resolution"], 112 | "timezone_name": timezone_params["timezone_name"], 113 | "timezone": timezone_params["timezone"], 114 | "offset": timezone_params["offset"], 115 | "locale": locales_params, 116 | "os": simple_device["os"], 117 | "os_api": self.__detect_api_level(simple_device["os"]), 118 | "openudid": self.__openudid(), 119 | "display_density": simple_device["display_density"], 120 | "dpi": simple_device["dpi"], 121 | "device": device_i, 122 | "product": product, 123 | "install_time": int(round(time.time() * 1000)) 124 | - random.randint(5000, 30000), 125 | "region": country_code.upper(), 126 | "language": "en" if country_code == "us" else country_code, 127 | "app_language": "en" if country_code == "us" else country_code, 128 | "op_region": country_code.upper(), 129 | "sys_region": country_code.upper(), 130 | "core": core, 131 | "board": board, 132 | "gmt": gmt, 133 | "ut": random.randint(100, 500), 134 | "cba": hex(random.randint(1000000000, 5900000000)), 135 | "ts": random.randint(-1414524480, -1014524480), 136 | "uid": random.randrange(10000, 10550, 50), 137 | "dp": random.randint(100000000, 999999999), 138 | "hc": f"0016{random.randint(500000, 999999)}", 139 | "bas": random.randint(10, 100), 140 | "bat": random.randrange(3500, 4900, 500), 141 | "path": self.__security_path(), 142 | "dbg": random.randint(-100, 0), 143 | "token_cache": base64.urlsafe_b64encode(os.urandom(108)) 144 | .decode() 145 | .replace("=", "_"), 146 | } 147 | return device 148 | -------------------------------------------------------------------------------- /Libs/device_gen.py: -------------------------------------------------------------------------------- 1 | import json, time, hashlib, requests 2 | 3 | from urllib.parse import * 4 | from .constants import * 5 | from .ttencrypt import TTEncrypt 6 | from .xgorgon import Xgorgon 7 | 8 | 9 | 10 | 11 | class Applog: 12 | def __init__(self, device: dict, proxy = None): 13 | self.__device = device 14 | self.__host = "log-va.tiktokv.com" 15 | 16 | def __headers(self, params: str, payload: (str or bool) = None) -> dict: # type: ignore 17 | sig = Xgorgon().calculate(params, payload, None) 18 | 19 | headers = { 20 | "x-ss-stub": str(hashlib.md5(str(payload).encode()).hexdigest()).upper(), 21 | "accept-encoding": "gzip", 22 | "passport-sdk-version": "19", 23 | "sdk-version": "2", 24 | "x-ss-req-ticket": str(int(time.time())) + "000", 25 | "x-tt-dm-status": "login=0;ct=0", 26 | "host": self.__host, 27 | "connection": "Keep-Alive", 28 | "content-type": "application/octet-stream", 29 | "user-agent": ( 30 | f"com.zhiliaoapp.musically/{application['version_code']} " 31 | + f"(Linux; U; Android {self.__device['os']}; pt_BR; {self.__device['device_model']}; " 32 | + f"Build/{self.__device['build']}; " 33 | + "Cronet/TTNetVersion:5f9640e3 2021-04-21 QuicVersion:47946d2a 2020-10-14)" 34 | ), 35 | "x-gorgon": sig["x-gorgon"], 36 | "x-khronos": str(sig["x-khronos"]), 37 | } 38 | 39 | return headers 40 | 41 | def __params(self) -> str: 42 | __base_params = { 43 | "ac": "wifi", 44 | "channel": "googleplay", 45 | "aid": application["aid"], 46 | "app_name": "musical_ly", 47 | "version_code": application["version_code"], 48 | "version_name": application["version_name"], 49 | "device_platform": "android", 50 | "ab_version": application["ab_version"], 51 | "ssmix": "a", 52 | "device_type": self.__device["device_model"], 53 | "device_brand": self.__device["device_brand"], 54 | "language": self.__device["language"], 55 | "os_api": self.__device["os_api"], 56 | "os_version": self.__device["os"], 57 | "openudid": self.__device["openudid"], 58 | "manifest_version_code": application["manifest_version_code"], 59 | "resolution": str(self.__device["resolution"]).split("x")[1] 60 | + "*" 61 | + str(self.__device["resolution"]).split("x")[0], 62 | "dpi": self.__device["dpi"], 63 | "update_version_code": application["update_version_code"], 64 | "_rticket": round(time.time() * 1000), 65 | "app_type": "normal", 66 | "sys_region": self.__device["sys_region"], 67 | "timezone_name": self.__device["timezone_name"], 68 | "app_language": self.__device["app_language"], 69 | "ac2": "wifi", 70 | "uoo": "0", 71 | "op_region": self.__device["op_region"], 72 | "timezone_offset": self.__device["offset"], 73 | "build_number": application["build_number"], 74 | "locale": self.__device["locale"], 75 | "region": self.__device["region"], 76 | "ts": int(time.time()), 77 | "cdid": self.__device["cdid"], 78 | "cpu_support64": "true", 79 | "host_abi": "armeabi-v7a", 80 | } 81 | 82 | return urlencode(__base_params) 83 | 84 | def __payload(self): 85 | 86 | payload = { 87 | "magic_tag": "ss_app_log", 88 | "header": { 89 | "display_name": "TikTok", 90 | "update_version_code": application["update_version_code"], 91 | "manifest_version_code": application["manifest_version_code"], 92 | "app_version_minor": "", 93 | "aid": application["aid"], 94 | "channel": "googleplay", 95 | "package": "com.zhiliaoapp.musically", 96 | "app_version": application["app_version"], 97 | "version_code": application["version_code"], 98 | "sdk_version": "2.12.1-rc.17", 99 | "sdk_target_version": 29, 100 | "git_hash": application["git_hash"], 101 | "os": "Android", 102 | "os_version": str(self.__device["os"]), 103 | "os_api": self.__device["os_api"], 104 | "device_model": self.__device["device_model"], 105 | "device_brand": self.__device["device_brand"], 106 | "device_manufacturer": self.__device["device_brand"], 107 | "cpu_abi": "armeabi-v7a", 108 | "release_build": application["release_build"], 109 | "density_dpi": self.__device["dpi"], 110 | "display_density": self.__device["display_density"], 111 | "resolution": self.__device["resolution"], 112 | "language": self.__device["language"], 113 | "timezone": self.__device["timezone"], 114 | "access": "wifi", 115 | "not_request_sender": 0, 116 | "rom": self.__device["rom"], 117 | "rom_version": self.__device["rom_version"], 118 | "cdid": self.__device["cdid"], 119 | "sig_hash": application["sig_hash"], 120 | "gaid_limited": 0, 121 | "google_aid": self.__device["google_aid"], 122 | "openudid": self.__device["openudid"], 123 | "clientudid": self.__device["clientudid"], 124 | "region": self.__device["region"], 125 | "tz_name": f"{self.__device['timezone_name'].split('/')[0]}/{self.__device['timezone_name'].split('/')[1]}", 126 | "tz_offset": self.__device["offset"], 127 | "req_id": self.__device["req_id"], 128 | "custom": { 129 | "is_kids_mode": 0, 130 | "filter_warn": 0, 131 | "web_ua": f"Dalvik/2.1.0 (Linux; U; Android {self.__device['os']}; {self.__device['device_model']} Build/{self.__device['build']})", 132 | "user_period": 0, 133 | "user_mode": -1, 134 | }, 135 | "apk_first_install_time": self.__device["install_time"], 136 | "is_system_app": 0, 137 | "sdk_flavor": "global", 138 | }, 139 | "_gen_time": round(time.time() * 1000), 140 | } 141 | return payload 142 | 143 | @staticmethod 144 | def __tt_encryption(data: dict) -> str: 145 | ttencrypt = TTEncrypt() 146 | data_formated = json.dumps(data).replace(" ", "") 147 | return ttencrypt.encrypt(data_formated) 148 | 149 | def register_device(self): 150 | params = self.__params() 151 | payload = self.__payload() 152 | 153 | r = requests.post( 154 | url=("https://" + self.__host + "/service/2/device_register/?" + params), 155 | headers=self.__headers(params), 156 | data=bytes.fromhex(self.__tt_encryption(payload)), 157 | ) 158 | 159 | if r.json()["device_id"] == 0 or r.json()["device_id"] == "0": 160 | self.register_device() 161 | 162 | return r.json()["device_id"], r.json()["install_id"] 163 | 164 | 165 | class Xlog: 166 | def __init__(self, __device_id): 167 | self.__device_id = __device_id 168 | 169 | def bypass(self): 170 | params = urlencode( 171 | { 172 | "os": "0", 173 | "ver": "0.6.11.29.19-MT", 174 | "m": "2", 175 | "app_ver": "19.1.3", 176 | "region": "en_US", 177 | "aid": "1233", 178 | "did": self.__device_id, 179 | } 180 | ) 181 | sig = Xgorgon().calculate(params, None, None) 182 | 183 | headers = { 184 | "accept-encoding": "gzip", 185 | "cookie": "sessionid=", 186 | "x-ss-req-ticket": str("".join(str(time.time()).split(".")))[:13], 187 | "x-tt-dm-status": "login=0;ct=0", 188 | "x-gorgon": sig["x-gorgon"], 189 | "x-khronos": str(sig["x-khronos"]), 190 | "host": "xlog-va.tiktokv.com", 191 | "connection": "Keep-Alive", 192 | "user-agent": "okhttp/3.10.0.1", 193 | } 194 | 195 | url = "https://xlog-va.tiktokv.com/v2/s?" + params 196 | 197 | response = requests.get(url, headers=headers) 198 | -------------------------------------------------------------------------------- /Libs/signature.py: -------------------------------------------------------------------------------- 1 | import base64 2 | import hashlib 3 | import ctypes 4 | from os import urandom 5 | from urllib.parse import urlencode 6 | import urllib.parse 7 | 8 | def padding_size(size: int) -> int: 9 | mod = size % 16 10 | if mod > 0: 11 | return size + (16 - mod) 12 | return size 13 | 14 | def pkcs7_padding_data_length(buffer, buffer_size, modulus): 15 | if buffer_size % modulus != 0 or buffer_size < modulus: 16 | return 0 17 | padding_value = buffer[buffer_size-1] 18 | if padding_value < 1 or padding_value > modulus: 19 | return 0 20 | if buffer_size < padding_value + 1: 21 | return 0 22 | count = 1 23 | buffer_size -= 1 24 | for i in range(count, padding_value): 25 | buffer_size -= 1 26 | if buffer[buffer_size] != padding_value: 27 | return 0 28 | return buffer_size 29 | 30 | def pkcs7_padding_pad_buffer(buffer: bytearray, data_length: int, buffer_size: int, modulus: int) -> int: 31 | pad_byte = modulus - (data_length % modulus) 32 | if data_length + pad_byte > buffer_size: 33 | return -pad_byte 34 | for i in range(pad_byte): 35 | buffer[data_length+i] = pad_byte 36 | return pad_byte 37 | 38 | def md5bytes(data: bytes) -> str: 39 | m = hashlib.md5() 40 | m.update(data) 41 | return m.hexdigest() 42 | 43 | 44 | def get_type_data(ptr, index, data_type): 45 | if data_type == "uint64_t": 46 | return int.from_bytes(ptr[index * 8 : (index + 1) * 8], "little") 47 | else: 48 | raise ValueError("Invalid data type") 49 | 50 | 51 | def set_type_data(ptr, index, data, data_type): 52 | if data_type == "uint64_t": 53 | ptr[index * 8 : (index + 1) * 8] = data.to_bytes(8, "little") 54 | else: 55 | raise ValueError("Invalid data type") 56 | 57 | 58 | def validate(num): 59 | return num & 0xFFFFFFFFFFFFFFFF 60 | 61 | 62 | def __ROR__(value: ctypes.c_ulonglong, count: int) -> ctypes.c_ulonglong: 63 | nbits = ctypes.sizeof(value) * 8 64 | count %= nbits 65 | low = ctypes.c_ulonglong(value.value << (nbits - count)).value 66 | value = ctypes.c_ulonglong(value.value >> count).value 67 | value = value | low 68 | return value 69 | 70 | 71 | def encrypt_ladon_input(hash_table, input_data): 72 | data0 = int.from_bytes(input_data[:8], byteorder="little") 73 | data1 = int.from_bytes(input_data[8:], byteorder="little") 74 | 75 | for i in range(0x22): 76 | hash = int.from_bytes(hash_table[i * 8 : (i + 1) * 8], byteorder="little") 77 | data1 = validate(hash ^ (data0 + ((data1 >> 8) | (data1 << (64 - 8))))) 78 | data0 = validate(data1 ^ ((data0 >> 0x3D) | (data0 << (64 - 0x3D)))) 79 | 80 | output_data = bytearray(26) 81 | output_data[:8] = data0.to_bytes(8, byteorder="little") 82 | output_data[8:] = data1.to_bytes(8, byteorder="little") 83 | 84 | return bytes(output_data) 85 | 86 | 87 | def encrypt_ladon(md5hex: bytes, data: bytes, size: int): 88 | hash_table = bytearray(272 + 16) 89 | hash_table[:32] = md5hex 90 | 91 | temp = [] 92 | for i in range(4): 93 | temp.append(int.from_bytes(hash_table[i * 8 : (i + 1) * 8], byteorder="little")) 94 | 95 | buffer_b0 = temp[0] 96 | buffer_b8 = temp[1] 97 | temp.pop(0) 98 | temp.pop(0) 99 | 100 | for i in range(0, 0x22): 101 | x9 = buffer_b0 102 | x8 = buffer_b8 103 | x8 = validate(__ROR__(ctypes.c_ulonglong(x8), 8)) 104 | x8 = validate(x8 + x9) 105 | x8 = validate(x8 ^ i) 106 | temp.append(x8) 107 | x8 = validate(x8 ^ __ROR__(ctypes.c_ulonglong(x9), 61)) 108 | set_type_data(hash_table, i + 1, x8, "uint64_t") 109 | buffer_b0 = x8 110 | buffer_b8 = temp[0] 111 | temp.pop(0) 112 | 113 | new_size = padding_size(size) 114 | 115 | input = bytearray(new_size) 116 | input[:size] = data 117 | pkcs7_padding_pad_buffer(input, size, new_size, 16) 118 | 119 | output = bytearray(new_size) 120 | for i in range(new_size // 16): 121 | output[i * 16 : (i + 1) * 16] = encrypt_ladon_input( 122 | hash_table, input[i * 16 : (i + 1) * 16] 123 | ) 124 | 125 | return output 126 | 127 | 128 | def ladon_encrypt( 129 | khronos : int, 130 | lc_id : int = 1611921764, 131 | aid : int = 8311, 132 | random_bytes : bytes = urandom(4)) -> str: 133 | 134 | data = f"{khronos}-{lc_id}-{aid}" 135 | 136 | keygen = random_bytes + str(aid).encode() 137 | md5hex = md5bytes(keygen) 138 | 139 | size = len(data) 140 | new_size = padding_size(size) 141 | 142 | output = bytearray(new_size + 4) 143 | output[:4] = random_bytes 144 | 145 | output[4:] = encrypt_ladon(md5hex.encode(), data.encode(), size) 146 | 147 | return {"x-ladon": base64.b64encode(bytes(output)).decode()} 148 | 149 | 150 | def get_x_ss_stub(data): 151 | encoded_data = urlencode(data, quote_via=urllib.parse.quote).encode('utf-8') 152 | md5_hash = hashlib.md5(encoded_data).hexdigest() 153 | return {"x-ss-stub": md5_hash} 154 | 155 | class Ladon: 156 | @staticmethod 157 | def encrypt(x_khronos: int, lc_id: str, aid: int) -> str: 158 | return ladon_encrypt(x_khronos, lc_id, aid) 159 | 160 | -------------------------------------------------------------------------------- /Libs/ttencrypt.py: -------------------------------------------------------------------------------- 1 | import binascii 2 | import gzip 3 | import random 4 | from Crypto.Cipher import AES 5 | 6 | 7 | class TTEncrypt: 8 | __content = [] 9 | __content_raw = [] 10 | CF = 0 11 | begining = [0x74, 0x63, 0x05, 0x10, 0, 0] 12 | dword_0 = [ 13 | 99, 14 | 124, 15 | 119, 16 | 123, 17 | 242, 18 | 107, 19 | 111, 20 | 197, 21 | 48, 22 | 1, 23 | 103, 24 | 43, 25 | 254, 26 | 215, 27 | 171, 28 | 118, 29 | 202, 30 | 130, 31 | 201, 32 | 125, 33 | 250, 34 | 89, 35 | 71, 36 | 240, 37 | 173, 38 | 212, 39 | 162, 40 | 175, 41 | 156, 42 | 164, 43 | 114, 44 | 192, 45 | 183, 46 | 253, 47 | 147, 48 | 38, 49 | 54, 50 | 63, 51 | 247, 52 | 204, 53 | 52, 54 | 165, 55 | 229, 56 | 241, 57 | 113, 58 | 216, 59 | 49, 60 | 21, 61 | 4, 62 | 199, 63 | 35, 64 | 195, 65 | 24, 66 | 150, 67 | 5, 68 | 154, 69 | 7, 70 | 18, 71 | 128, 72 | 226, 73 | 235, 74 | 39, 75 | 178, 76 | 117, 77 | 9, 78 | 131, 79 | 44, 80 | 26, 81 | 27, 82 | 110, 83 | 90, 84 | 160, 85 | 82, 86 | 59, 87 | 214, 88 | 179, 89 | 41, 90 | 227, 91 | 47, 92 | 132, 93 | 83, 94 | 209, 95 | 0, 96 | 237, 97 | 32, 98 | 252, 99 | 177, 100 | 91, 101 | 106, 102 | 203, 103 | 190, 104 | 57, 105 | 74, 106 | 76, 107 | 88, 108 | 207, 109 | 208, 110 | 239, 111 | 170, 112 | 251, 113 | 67, 114 | 77, 115 | 51, 116 | 133, 117 | 69, 118 | 249, 119 | 2, 120 | 127, 121 | 80, 122 | 60, 123 | 159, 124 | 168, 125 | 81, 126 | 163, 127 | 64, 128 | 143, 129 | 146, 130 | 157, 131 | 56, 132 | 245, 133 | 188, 134 | 182, 135 | 218, 136 | 33, 137 | 16, 138 | 255, 139 | 243, 140 | 210, 141 | 205, 142 | 12, 143 | 19, 144 | 236, 145 | 95, 146 | 151, 147 | 68, 148 | 23, 149 | 196, 150 | 167, 151 | 126, 152 | 61, 153 | 100, 154 | 93, 155 | 25, 156 | 115, 157 | 96, 158 | 129, 159 | 79, 160 | 220, 161 | 34, 162 | 42, 163 | 144, 164 | 136, 165 | 70, 166 | 238, 167 | 184, 168 | 20, 169 | 222, 170 | 94, 171 | 11, 172 | 219, 173 | 224, 174 | 50, 175 | 58, 176 | 10, 177 | 73, 178 | 6, 179 | 36, 180 | 92, 181 | 194, 182 | 211, 183 | 172, 184 | 98, 185 | 145, 186 | 149, 187 | 228, 188 | 121, 189 | 231, 190 | 200, 191 | 55, 192 | 109, 193 | 141, 194 | 213, 195 | 78, 196 | 169, 197 | 108, 198 | 86, 199 | 244, 200 | 234, 201 | 101, 202 | 122, 203 | 174, 204 | 8, 205 | 186, 206 | 120, 207 | 37, 208 | 46, 209 | 28, 210 | 166, 211 | 180, 212 | 198, 213 | 232, 214 | 221, 215 | 116, 216 | 31, 217 | 75, 218 | 189, 219 | 139, 220 | 138, 221 | 112, 222 | 62, 223 | 181, 224 | 102, 225 | 72, 226 | 3, 227 | 246, 228 | 14, 229 | 97, 230 | 53, 231 | 87, 232 | 185, 233 | 134, 234 | 193, 235 | 29, 236 | 158, 237 | 225, 238 | 248, 239 | 152, 240 | 17, 241 | 105, 242 | 217, 243 | 142, 244 | 148, 245 | 155, 246 | 30, 247 | 135, 248 | 233, 249 | 206, 250 | 85, 251 | 40, 252 | 223, 253 | 140, 254 | 161, 255 | 137, 256 | 13, 257 | 191, 258 | 230, 259 | 66, 260 | 104, 261 | 65, 262 | 153, 263 | 45, 264 | 15, 265 | 176, 266 | 84, 267 | 187, 268 | 22, 269 | ] # line:258 270 | dword_1 = [ 271 | 16777216, 272 | 33554432, 273 | 67108864, 274 | 134217728, 275 | 268435456, 276 | 536870912, 277 | 1073741824, 278 | 2147483648, 279 | 452984832, 280 | 905969664, 281 | ] # line:270 282 | dword_2 = [ 283 | 0, 284 | 235474187, 285 | 470948374, 286 | 303765277, 287 | 941896748, 288 | 908933415, 289 | 607530554, 290 | 708780849, 291 | 1883793496, 292 | 2118214995, 293 | 1817866830, 294 | 1649639237, 295 | 1215061108, 296 | 1181045119, 297 | 1417561698, 298 | 1517767529, 299 | 3767586992, 300 | 4003061179, 301 | 4236429990, 302 | 4069246893, 303 | 3635733660, 304 | 3602770327, 305 | 3299278474, 306 | 3400528769, 307 | 2430122216, 308 | 2664543715, 309 | 2362090238, 310 | 2193862645, 311 | 2835123396, 312 | 2801107407, 313 | 3035535058, 314 | 3135740889, 315 | 3678124923, 316 | 3576870512, 317 | 3341394285, 318 | 3374361702, 319 | 3810496343, 320 | 3977675356, 321 | 4279080257, 322 | 4043610186, 323 | 2876494627, 324 | 2776292904, 325 | 3076639029, 326 | 3110650942, 327 | 2472011535, 328 | 2640243204, 329 | 2403728665, 330 | 2169303058, 331 | 1001089995, 332 | 899835584, 333 | 666464733, 334 | 699432150, 335 | 59727847, 336 | 226906860, 337 | 530400753, 338 | 294930682, 339 | 1273168787, 340 | 1172967064, 341 | 1475418501, 342 | 1509430414, 343 | 1942435775, 344 | 2110667444, 345 | 1876241833, 346 | 1641816226, 347 | 2910219766, 348 | 2743034109, 349 | 2976151520, 350 | 3211623147, 351 | 2505202138, 352 | 2606453969, 353 | 2302690252, 354 | 2269728455, 355 | 3711829422, 356 | 3543599269, 357 | 3240894392, 358 | 3475313331, 359 | 3843699074, 360 | 3943906441, 361 | 4178062228, 362 | 4144047775, 363 | 1306967366, 364 | 1139781709, 365 | 1374988112, 366 | 1610459739, 367 | 1975683434, 368 | 2076935265, 369 | 1775276924, 370 | 1742315127, 371 | 1034867998, 372 | 866637845, 373 | 566021896, 374 | 800440835, 375 | 92987698, 376 | 193195065, 377 | 429456164, 378 | 395441711, 379 | 1984812685, 380 | 2017778566, 381 | 1784663195, 382 | 1683407248, 383 | 1315562145, 384 | 1080094634, 385 | 1383856311, 386 | 1551037884, 387 | 101039829, 388 | 135050206, 389 | 437757123, 390 | 337553864, 391 | 1042385657, 392 | 807962610, 393 | 573804783, 394 | 742039012, 395 | 2531067453, 396 | 2564033334, 397 | 2328828971, 398 | 2227573024, 399 | 2935566865, 400 | 2700099354, 401 | 3001755655, 402 | 3168937228, 403 | 3868552805, 404 | 3902563182, 405 | 4203181171, 406 | 4102977912, 407 | 3736164937, 408 | 3501741890, 409 | 3265478751, 410 | 3433712980, 411 | 1106041591, 412 | 1340463100, 413 | 1576976609, 414 | 1408749034, 415 | 2043211483, 416 | 2009195472, 417 | 1708848333, 418 | 1809054150, 419 | 832877231, 420 | 1068351396, 421 | 766945465, 422 | 599762354, 423 | 159417987, 424 | 126454664, 425 | 361929877, 426 | 463180190, 427 | 2709260871, 428 | 2943682380, 429 | 3178106961, 430 | 3009879386, 431 | 2572697195, 432 | 2538681184, 433 | 2236228733, 434 | 2336434550, 435 | 3509871135, 436 | 3745345300, 437 | 3441850377, 438 | 3274667266, 439 | 3910161971, 440 | 3877198648, 441 | 4110568485, 442 | 4211818798, 443 | 2597806476, 444 | 2497604743, 445 | 2261089178, 446 | 2295101073, 447 | 2733856160, 448 | 2902087851, 449 | 3202437046, 450 | 2968011453, 451 | 3936291284, 452 | 3835036895, 453 | 4136440770, 454 | 4169408201, 455 | 3535486456, 456 | 3702665459, 457 | 3467192302, 458 | 3231722213, 459 | 2051518780, 460 | 1951317047, 461 | 1716890410, 462 | 1750902305, 463 | 1113818384, 464 | 1282050075, 465 | 1584504582, 466 | 1350078989, 467 | 168810852, 468 | 67556463, 469 | 371049330, 470 | 404016761, 471 | 841739592, 472 | 1008918595, 473 | 775550814, 474 | 540080725, 475 | 3969562369, 476 | 3801332234, 477 | 4035489047, 478 | 4269907996, 479 | 3569255213, 480 | 3669462566, 481 | 3366754619, 482 | 3332740144, 483 | 2631065433, 484 | 2463879762, 485 | 2160117071, 486 | 2395588676, 487 | 2767645557, 488 | 2868897406, 489 | 3102011747, 490 | 3069049960, 491 | 202008497, 492 | 33778362, 493 | 270040487, 494 | 504459436, 495 | 875451293, 496 | 975658646, 497 | 675039627, 498 | 641025152, 499 | 2084704233, 500 | 1917518562, 501 | 1615861247, 502 | 1851332852, 503 | 1147550661, 504 | 1248802510, 505 | 1484005843, 506 | 1451044056, 507 | 933301370, 508 | 967311729, 509 | 733156972, 510 | 632953703, 511 | 260388950, 512 | 25965917, 513 | 328671808, 514 | 496906059, 515 | 1206477858, 516 | 1239443753, 517 | 1543208500, 518 | 1441952575, 519 | 2144161806, 520 | 1908694277, 521 | 1675577880, 522 | 1842759443, 523 | 3610369226, 524 | 3644379585, 525 | 3408119516, 526 | 3307916247, 527 | 4011190502, 528 | 3776767469, 529 | 4077384432, 530 | 4245618683, 531 | 2809771154, 532 | 2842737049, 533 | 3144396420, 534 | 3043140495, 535 | 2673705150, 536 | 2438237621, 537 | 2203032232, 538 | 2370213795, 539 | ] # line:528 540 | dword_3 = [ 541 | 0, 542 | 185469197, 543 | 370938394, 544 | 487725847, 545 | 741876788, 546 | 657861945, 547 | 975451694, 548 | 824852259, 549 | 1483753576, 550 | 1400783205, 551 | 1315723890, 552 | 1164071807, 553 | 1950903388, 554 | 2135319889, 555 | 1649704518, 556 | 1767536459, 557 | 2967507152, 558 | 3152976349, 559 | 2801566410, 560 | 2918353863, 561 | 2631447780, 562 | 2547432937, 563 | 2328143614, 564 | 2177544179, 565 | 3901806776, 566 | 3818836405, 567 | 4270639778, 568 | 4118987695, 569 | 3299409036, 570 | 3483825537, 571 | 3535072918, 572 | 3652904859, 573 | 2077965243, 574 | 1893020342, 575 | 1841768865, 576 | 1724457132, 577 | 1474502543, 578 | 1559041666, 579 | 1107234197, 580 | 1257309336, 581 | 598438867, 582 | 681933534, 583 | 901210569, 584 | 1052338372, 585 | 261314535, 586 | 77422314, 587 | 428819965, 588 | 310463728, 589 | 3409685355, 590 | 3224740454, 591 | 3710368113, 592 | 3593056380, 593 | 3875770207, 594 | 3960309330, 595 | 4045380933, 596 | 4195456072, 597 | 2471224067, 598 | 2554718734, 599 | 2237133081, 600 | 2388260884, 601 | 3212035895, 602 | 3028143674, 603 | 2842678573, 604 | 2724322336, 605 | 4138563181, 606 | 4255350624, 607 | 3769721975, 608 | 3955191162, 609 | 3667219033, 610 | 3516619604, 611 | 3431546947, 612 | 3347532110, 613 | 2933734917, 614 | 2782082824, 615 | 3099667487, 616 | 3016697106, 617 | 2196052529, 618 | 2313884476, 619 | 2499348523, 620 | 2683765030, 621 | 1179510461, 622 | 1296297904, 623 | 1347548327, 624 | 1533017514, 625 | 1786102409, 626 | 1635502980, 627 | 2087309459, 628 | 2003294622, 629 | 507358933, 630 | 355706840, 631 | 136428751, 632 | 53458370, 633 | 839224033, 634 | 957055980, 635 | 605657339, 636 | 790073846, 637 | 2373340630, 638 | 2256028891, 639 | 2607439820, 640 | 2422494913, 641 | 2706270690, 642 | 2856345839, 643 | 3075636216, 644 | 3160175349, 645 | 3573941694, 646 | 3725069491, 647 | 3273267108, 648 | 3356761769, 649 | 4181598602, 650 | 4063242375, 651 | 4011996048, 652 | 3828103837, 653 | 1033297158, 654 | 915985419, 655 | 730517276, 656 | 545572369, 657 | 296679730, 658 | 446754879, 659 | 129166120, 660 | 213705253, 661 | 1709610350, 662 | 1860738147, 663 | 1945798516, 664 | 2029293177, 665 | 1239331162, 666 | 1120974935, 667 | 1606591296, 668 | 1422699085, 669 | 4148292826, 670 | 4233094615, 671 | 3781033664, 672 | 3931371469, 673 | 3682191598, 674 | 3497509347, 675 | 3446004468, 676 | 3328955385, 677 | 2939266226, 678 | 2755636671, 679 | 3106780840, 680 | 2988687269, 681 | 2198438022, 682 | 2282195339, 683 | 2501218972, 684 | 2652609425, 685 | 1201765386, 686 | 1286567175, 687 | 1371368976, 688 | 1521706781, 689 | 1805211710, 690 | 1620529459, 691 | 2105887268, 692 | 1988838185, 693 | 533804130, 694 | 350174575, 695 | 164439672, 696 | 46346101, 697 | 870912086, 698 | 954669403, 699 | 636813900, 700 | 788204353, 701 | 2358957921, 702 | 2274680428, 703 | 2592523643, 704 | 2441661558, 705 | 2695033685, 706 | 2880240216, 707 | 3065962831, 708 | 3182487618, 709 | 3572145929, 710 | 3756299780, 711 | 3270937875, 712 | 3388507166, 713 | 4174560061, 714 | 4091327024, 715 | 4006521127, 716 | 3854606378, 717 | 1014646705, 718 | 930369212, 719 | 711349675, 720 | 560487590, 721 | 272786309, 722 | 457992840, 723 | 106852767, 724 | 223377554, 725 | 1678381017, 726 | 1862534868, 727 | 1914052035, 728 | 2031621326, 729 | 1211247597, 730 | 1128014560, 731 | 1580087799, 732 | 1428173050, 733 | 32283319, 734 | 182621114, 735 | 401639597, 736 | 486441376, 737 | 768917123, 738 | 651868046, 739 | 1003007129, 740 | 818324884, 741 | 1503449823, 742 | 1385356242, 743 | 1333838021, 744 | 1150208456, 745 | 1973745387, 746 | 2125135846, 747 | 1673061617, 748 | 1756818940, 749 | 2970356327, 750 | 3120694122, 751 | 2802849917, 752 | 2887651696, 753 | 2637442643, 754 | 2520393566, 755 | 2334669897, 756 | 2149987652, 757 | 3917234703, 758 | 3799141122, 759 | 4284502037, 760 | 4100872472, 761 | 3309594171, 762 | 3460984630, 763 | 3545789473, 764 | 3629546796, 765 | 2050466060, 766 | 1899603969, 767 | 1814803222, 768 | 1730525723, 769 | 1443857720, 770 | 1560382517, 771 | 1075025698, 772 | 1260232239, 773 | 575138148, 774 | 692707433, 775 | 878443390, 776 | 1062597235, 777 | 243256656, 778 | 91341917, 779 | 409198410, 780 | 325965383, 781 | 3403100636, 782 | 3252238545, 783 | 3704300486, 784 | 3620022987, 785 | 3874428392, 786 | 3990953189, 787 | 4042459122, 788 | 4227665663, 789 | 2460449204, 790 | 2578018489, 791 | 2226875310, 792 | 2411029155, 793 | 3198115200, 794 | 3046200461, 795 | 2827177882, 796 | 2743944855, 797 | ] # line:786 798 | dword_4 = [ 799 | 0, 800 | 218828297, 801 | 437656594, 802 | 387781147, 803 | 875313188, 804 | 958871085, 805 | 775562294, 806 | 590424639, 807 | 1750626376, 808 | 1699970625, 809 | 1917742170, 810 | 2135253587, 811 | 1551124588, 812 | 1367295589, 813 | 1180849278, 814 | 1265195639, 815 | 3501252752, 816 | 3720081049, 817 | 3399941250, 818 | 3350065803, 819 | 3835484340, 820 | 3919042237, 821 | 4270507174, 822 | 4085369519, 823 | 3102249176, 824 | 3051593425, 825 | 2734591178, 826 | 2952102595, 827 | 2361698556, 828 | 2177869557, 829 | 2530391278, 830 | 2614737639, 831 | 3145456443, 832 | 3060847922, 833 | 2708326185, 834 | 2892417312, 835 | 2404901663, 836 | 2187128086, 837 | 2504130317, 838 | 2555048196, 839 | 3542330227, 840 | 3727205754, 841 | 3375740769, 842 | 3292445032, 843 | 3876557655, 844 | 3926170974, 845 | 4246310725, 846 | 4027744588, 847 | 1808481195, 848 | 1723872674, 849 | 1910319033, 850 | 2094410160, 851 | 1608975247, 852 | 1391201670, 853 | 1173430173, 854 | 1224348052, 855 | 59984867, 856 | 244860394, 857 | 428169201, 858 | 344873464, 859 | 935293895, 860 | 984907214, 861 | 766078933, 862 | 547512796, 863 | 1844882806, 864 | 1627235199, 865 | 2011214180, 866 | 2062270317, 867 | 1507497298, 868 | 1423022939, 869 | 1137477952, 870 | 1321699145, 871 | 95345982, 872 | 145085239, 873 | 532201772, 874 | 313773861, 875 | 830661914, 876 | 1015671571, 877 | 731183368, 878 | 648017665, 879 | 3175501286, 880 | 2957853679, 881 | 2807058932, 882 | 2858115069, 883 | 2305455554, 884 | 2220981195, 885 | 2474404304, 886 | 2658625497, 887 | 3575528878, 888 | 3625268135, 889 | 3473416636, 890 | 3254988725, 891 | 3778151818, 892 | 3963161475, 893 | 4213447064, 894 | 4130281361, 895 | 3599595085, 896 | 3683022916, 897 | 3432737375, 898 | 3247465558, 899 | 3802222185, 900 | 4020912224, 901 | 4172763771, 902 | 4122762354, 903 | 3201631749, 904 | 3017672716, 905 | 2764249623, 906 | 2848461854, 907 | 2331590177, 908 | 2280796200, 909 | 2431590963, 910 | 2648976442, 911 | 104699613, 912 | 188127444, 913 | 472615631, 914 | 287343814, 915 | 840019705, 916 | 1058709744, 917 | 671593195, 918 | 621591778, 919 | 1852171925, 920 | 1668212892, 921 | 1953757831, 922 | 2037970062, 923 | 1514790577, 924 | 1463996600, 925 | 1080017571, 926 | 1297403050, 927 | 3673637356, 928 | 3623636965, 929 | 3235995134, 930 | 3454686199, 931 | 4007360968, 932 | 3822090177, 933 | 4107101658, 934 | 4190530515, 935 | 2997825956, 936 | 3215212461, 937 | 2830708150, 938 | 2779915199, 939 | 2256734592, 940 | 2340947849, 941 | 2627016082, 942 | 2443058075, 943 | 172466556, 944 | 122466165, 945 | 273792366, 946 | 492483431, 947 | 1047239000, 948 | 861968209, 949 | 612205898, 950 | 695634755, 951 | 1646252340, 952 | 1863638845, 953 | 2013908262, 954 | 1963115311, 955 | 1446242576, 956 | 1530455833, 957 | 1277555970, 958 | 1093597963, 959 | 1636604631, 960 | 1820824798, 961 | 2073724613, 962 | 1989249228, 963 | 1436590835, 964 | 1487645946, 965 | 1337376481, 966 | 1119727848, 967 | 164948639, 968 | 81781910, 969 | 331544205, 970 | 516552836, 971 | 1039717051, 972 | 821288114, 973 | 669961897, 974 | 719700128, 975 | 2973530695, 976 | 3157750862, 977 | 2871682645, 978 | 2787207260, 979 | 2232435299, 980 | 2283490410, 981 | 2667994737, 982 | 2450346104, 983 | 3647212047, 984 | 3564045318, 985 | 3279033885, 986 | 3464042516, 987 | 3980931627, 988 | 3762502690, 989 | 4150144569, 990 | 4199882800, 991 | 3070356634, 992 | 3121275539, 993 | 2904027272, 994 | 2686254721, 995 | 2200818878, 996 | 2384911031, 997 | 2570832044, 998 | 2486224549, 999 | 3747192018, 1000 | 3528626907, 1001 | 3310321856, 1002 | 3359936201, 1003 | 3950355702, 1004 | 3867060991, 1005 | 4049844452, 1006 | 4234721005, 1007 | 1739656202, 1008 | 1790575107, 1009 | 2108100632, 1010 | 1890328081, 1011 | 1402811438, 1012 | 1586903591, 1013 | 1233856572, 1014 | 1149249077, 1015 | 266959938, 1016 | 48394827, 1017 | 369057872, 1018 | 418672217, 1019 | 1002783846, 1020 | 919489135, 1021 | 567498868, 1022 | 752375421, 1023 | 209336225, 1024 | 24197544, 1025 | 376187827, 1026 | 459744698, 1027 | 945164165, 1028 | 895287692, 1029 | 574624663, 1030 | 793451934, 1031 | 1679968233, 1032 | 1764313568, 1033 | 2117360635, 1034 | 1933530610, 1035 | 1343127501, 1036 | 1560637892, 1037 | 1243112415, 1038 | 1192455638, 1039 | 3704280881, 1040 | 3519142200, 1041 | 3336358691, 1042 | 3419915562, 1043 | 3907448597, 1044 | 3857572124, 1045 | 4075877127, 1046 | 4294704398, 1047 | 3029510009, 1048 | 3113855344, 1049 | 2927934315, 1050 | 2744104290, 1051 | 2159976285, 1052 | 2377486676, 1053 | 2594734927, 1054 | 2544078150, 1055 | ] # line:1044 1056 | dword_5 = [ 1057 | 0, 1058 | 151849742, 1059 | 303699484, 1060 | 454499602, 1061 | 607398968, 1062 | 758720310, 1063 | 908999204, 1064 | 1059270954, 1065 | 1214797936, 1066 | 1097159550, 1067 | 1517440620, 1068 | 1400849762, 1069 | 1817998408, 1070 | 1699839814, 1071 | 2118541908, 1072 | 2001430874, 1073 | 2429595872, 1074 | 2581445614, 1075 | 2194319100, 1076 | 2345119218, 1077 | 3034881240, 1078 | 3186202582, 1079 | 2801699524, 1080 | 2951971274, 1081 | 3635996816, 1082 | 3518358430, 1083 | 3399679628, 1084 | 3283088770, 1085 | 4237083816, 1086 | 4118925222, 1087 | 4002861748, 1088 | 3885750714, 1089 | 1002142683, 1090 | 850817237, 1091 | 698445255, 1092 | 548169417, 1093 | 529487843, 1094 | 377642221, 1095 | 227885567, 1096 | 77089521, 1097 | 1943217067, 1098 | 2061379749, 1099 | 1640576439, 1100 | 1757691577, 1101 | 1474760595, 1102 | 1592394909, 1103 | 1174215055, 1104 | 1290801793, 1105 | 2875968315, 1106 | 2724642869, 1107 | 3111247143, 1108 | 2960971305, 1109 | 2405426947, 1110 | 2253581325, 1111 | 2638606623, 1112 | 2487810577, 1113 | 3808662347, 1114 | 3926825029, 1115 | 4044981591, 1116 | 4162096729, 1117 | 3342319475, 1118 | 3459953789, 1119 | 3576539503, 1120 | 3693126241, 1121 | 1986918061, 1122 | 2137062819, 1123 | 1685577905, 1124 | 1836772287, 1125 | 1381620373, 1126 | 1532285339, 1127 | 1078185097, 1128 | 1229899655, 1129 | 1040559837, 1130 | 923313619, 1131 | 740276417, 1132 | 621982671, 1133 | 439452389, 1134 | 322734571, 1135 | 137073913, 1136 | 19308535, 1137 | 3871163981, 1138 | 4021308739, 1139 | 4104605777, 1140 | 4255800159, 1141 | 3263785589, 1142 | 3414450555, 1143 | 3499326569, 1144 | 3651041127, 1145 | 2933202493, 1146 | 2815956275, 1147 | 3167684641, 1148 | 3049390895, 1149 | 2330014213, 1150 | 2213296395, 1151 | 2566595609, 1152 | 2448830231, 1153 | 1305906550, 1154 | 1155237496, 1155 | 1607244650, 1156 | 1455525988, 1157 | 1776460110, 1158 | 1626319424, 1159 | 2079897426, 1160 | 1928707164, 1161 | 96392454, 1162 | 213114376, 1163 | 396673818, 1164 | 514443284, 1165 | 562755902, 1166 | 679998000, 1167 | 865136418, 1168 | 983426092, 1169 | 3708173718, 1170 | 3557504664, 1171 | 3474729866, 1172 | 3323011204, 1173 | 4180808110, 1174 | 4030667424, 1175 | 3945269170, 1176 | 3794078908, 1177 | 2507040230, 1178 | 2623762152, 1179 | 2272556026, 1180 | 2390325492, 1181 | 2975484382, 1182 | 3092726480, 1183 | 2738905026, 1184 | 2857194700, 1185 | 3973773121, 1186 | 3856137295, 1187 | 4274053469, 1188 | 4157467219, 1189 | 3371096953, 1190 | 3252932727, 1191 | 3673476453, 1192 | 3556361835, 1193 | 2763173681, 1194 | 2915017791, 1195 | 3064510765, 1196 | 3215307299, 1197 | 2156299017, 1198 | 2307622919, 1199 | 2459735317, 1200 | 2610011675, 1201 | 2081048481, 1202 | 1963412655, 1203 | 1846563261, 1204 | 1729977011, 1205 | 1480485785, 1206 | 1362321559, 1207 | 1243905413, 1208 | 1126790795, 1209 | 878845905, 1210 | 1030690015, 1211 | 645401037, 1212 | 796197571, 1213 | 274084841, 1214 | 425408743, 1215 | 38544885, 1216 | 188821243, 1217 | 3613494426, 1218 | 3731654548, 1219 | 3313212038, 1220 | 3430322568, 1221 | 4082475170, 1222 | 4200115116, 1223 | 3780097726, 1224 | 3896688048, 1225 | 2668221674, 1226 | 2516901860, 1227 | 2366882550, 1228 | 2216610296, 1229 | 3141400786, 1230 | 2989552604, 1231 | 2837966542, 1232 | 2687165888, 1233 | 1202797690, 1234 | 1320957812, 1235 | 1437280870, 1236 | 1554391400, 1237 | 1669664834, 1238 | 1787304780, 1239 | 1906247262, 1240 | 2022837584, 1241 | 265905162, 1242 | 114585348, 1243 | 499347990, 1244 | 349075736, 1245 | 736970802, 1246 | 585122620, 1247 | 972512814, 1248 | 821712160, 1249 | 2595684844, 1250 | 2478443234, 1251 | 2293045232, 1252 | 2174754046, 1253 | 3196267988, 1254 | 3079546586, 1255 | 2895723464, 1256 | 2777952454, 1257 | 3537852828, 1258 | 3687994002, 1259 | 3234156416, 1260 | 3385345166, 1261 | 4142626212, 1262 | 4293295786, 1263 | 3841024952, 1264 | 3992742070, 1265 | 174567692, 1266 | 57326082, 1267 | 410887952, 1268 | 292596766, 1269 | 777231668, 1270 | 660510266, 1271 | 1011452712, 1272 | 893681702, 1273 | 1108339068, 1274 | 1258480242, 1275 | 1343618912, 1276 | 1494807662, 1277 | 1715193156, 1278 | 1865862730, 1279 | 1948373848, 1280 | 2100090966, 1281 | 2701949495, 1282 | 2818666809, 1283 | 3004591147, 1284 | 3122358053, 1285 | 2235061775, 1286 | 2352307457, 1287 | 2535604243, 1288 | 2653899549, 1289 | 3915653703, 1290 | 3764988233, 1291 | 4219352155, 1292 | 4067639125, 1293 | 3444575871, 1294 | 3294430577, 1295 | 3746175075, 1296 | 3594982253, 1297 | 836553431, 1298 | 953270745, 1299 | 600235211, 1300 | 718002117, 1301 | 367585007, 1302 | 484830689, 1303 | 133361907, 1304 | 251657213, 1305 | 2041877159, 1306 | 1891211689, 1307 | 1806599355, 1308 | 1654886325, 1309 | 1568718495, 1310 | 1418573201, 1311 | 1335535747, 1312 | 1184342925, 1313 | ] # line:1302 1314 | dword_6 = [ 1315 | 3328402341, 1316 | 4168907908, 1317 | 4000806809, 1318 | 4135287693, 1319 | 4294111757, 1320 | 3597364157, 1321 | 3731845041, 1322 | 2445657428, 1323 | 1613770832, 1324 | 33620227, 1325 | 3462883241, 1326 | 1445669757, 1327 | 3892248089, 1328 | 3050821474, 1329 | 1303096294, 1330 | 3967186586, 1331 | 2412431941, 1332 | 528646813, 1333 | 2311702848, 1334 | 4202528135, 1335 | 4026202645, 1336 | 2992200171, 1337 | 2387036105, 1338 | 4226871307, 1339 | 1101901292, 1340 | 3017069671, 1341 | 1604494077, 1342 | 1169141738, 1343 | 597466303, 1344 | 1403299063, 1345 | 3832705686, 1346 | 2613100635, 1347 | 1974974402, 1348 | 3791519004, 1349 | 1033081774, 1350 | 1277568618, 1351 | 1815492186, 1352 | 2118074177, 1353 | 4126668546, 1354 | 2211236943, 1355 | 1748251740, 1356 | 1369810420, 1357 | 3521504564, 1358 | 4193382664, 1359 | 3799085459, 1360 | 2883115123, 1361 | 1647391059, 1362 | 706024767, 1363 | 134480908, 1364 | 2512897874, 1365 | 1176707941, 1366 | 2646852446, 1367 | 806885416, 1368 | 932615841, 1369 | 168101135, 1370 | 798661301, 1371 | 235341577, 1372 | 605164086, 1373 | 461406363, 1374 | 3756188221, 1375 | 3454790438, 1376 | 1311188841, 1377 | 2142417613, 1378 | 3933566367, 1379 | 302582043, 1380 | 495158174, 1381 | 1479289972, 1382 | 874125870, 1383 | 907746093, 1384 | 3698224818, 1385 | 3025820398, 1386 | 1537253627, 1387 | 2756858614, 1388 | 1983593293, 1389 | 3084310113, 1390 | 2108928974, 1391 | 1378429307, 1392 | 3722699582, 1393 | 1580150641, 1394 | 327451799, 1395 | 2790478837, 1396 | 3117535592, 1397 | 0, 1398 | 3253595436, 1399 | 1075847264, 1400 | 3825007647, 1401 | 2041688520, 1402 | 3059440621, 1403 | 3563743934, 1404 | 2378943302, 1405 | 1740553945, 1406 | 1916352843, 1407 | 2487896798, 1408 | 2555137236, 1409 | 2958579944, 1410 | 2244988746, 1411 | 3151024235, 1412 | 3320835882, 1413 | 1336584933, 1414 | 3992714006, 1415 | 2252555205, 1416 | 2588757463, 1417 | 1714631509, 1418 | 293963156, 1419 | 2319795663, 1420 | 3925473552, 1421 | 67240454, 1422 | 4269768577, 1423 | 2689618160, 1424 | 2017213508, 1425 | 631218106, 1426 | 1269344483, 1427 | 2723238387, 1428 | 1571005438, 1429 | 2151694528, 1430 | 93294474, 1431 | 1066570413, 1432 | 563977660, 1433 | 1882732616, 1434 | 4059428100, 1435 | 1673313503, 1436 | 2008463041, 1437 | 2950355573, 1438 | 1109467491, 1439 | 537923632, 1440 | 3858759450, 1441 | 4260623118, 1442 | 3218264685, 1443 | 2177748300, 1444 | 403442708, 1445 | 638784309, 1446 | 3287084079, 1447 | 3193921505, 1448 | 899127202, 1449 | 2286175436, 1450 | 773265209, 1451 | 2479146071, 1452 | 1437050866, 1453 | 4236148354, 1454 | 2050833735, 1455 | 3362022572, 1456 | 3126681063, 1457 | 840505643, 1458 | 3866325909, 1459 | 3227541664, 1460 | 427917720, 1461 | 2655997905, 1462 | 2749160575, 1463 | 1143087718, 1464 | 1412049534, 1465 | 999329963, 1466 | 193497219, 1467 | 2353415882, 1468 | 3354324521, 1469 | 1807268051, 1470 | 672404540, 1471 | 2816401017, 1472 | 3160301282, 1473 | 369822493, 1474 | 2916866934, 1475 | 3688947771, 1476 | 1681011286, 1477 | 1949973070, 1478 | 336202270, 1479 | 2454276571, 1480 | 201721354, 1481 | 1210328172, 1482 | 3093060836, 1483 | 2680341085, 1484 | 3184776046, 1485 | 1135389935, 1486 | 3294782118, 1487 | 965841320, 1488 | 831886756, 1489 | 3554993207, 1490 | 4068047243, 1491 | 3588745010, 1492 | 2345191491, 1493 | 1849112409, 1494 | 3664604599, 1495 | 26054028, 1496 | 2983581028, 1497 | 2622377682, 1498 | 1235855840, 1499 | 3630984372, 1500 | 2891339514, 1501 | 4092916743, 1502 | 3488279077, 1503 | 3395642799, 1504 | 4101667470, 1505 | 1202630377, 1506 | 268961816, 1507 | 1874508501, 1508 | 4034427016, 1509 | 1243948399, 1510 | 1546530418, 1511 | 941366308, 1512 | 1470539505, 1513 | 1941222599, 1514 | 2546386513, 1515 | 3421038627, 1516 | 2715671932, 1517 | 3899946140, 1518 | 1042226977, 1519 | 2521517021, 1520 | 1639824860, 1521 | 227249030, 1522 | 260737669, 1523 | 3765465232, 1524 | 2084453954, 1525 | 1907733956, 1526 | 3429263018, 1527 | 2420656344, 1528 | 100860677, 1529 | 4160157185, 1530 | 470683154, 1531 | 3261161891, 1532 | 1781871967, 1533 | 2924959737, 1534 | 1773779408, 1535 | 394692241, 1536 | 2579611992, 1537 | 974986535, 1538 | 664706745, 1539 | 3655459128, 1540 | 3958962195, 1541 | 731420851, 1542 | 571543859, 1543 | 3530123707, 1544 | 2849626480, 1545 | 126783113, 1546 | 865375399, 1547 | 765172662, 1548 | 1008606754, 1549 | 361203602, 1550 | 3387549984, 1551 | 2278477385, 1552 | 2857719295, 1553 | 1344809080, 1554 | 2782912378, 1555 | 59542671, 1556 | 1503764984, 1557 | 160008576, 1558 | 437062935, 1559 | 1707065306, 1560 | 3622233649, 1561 | 2218934982, 1562 | 3496503480, 1563 | 2185314755, 1564 | 697932208, 1565 | 1512910199, 1566 | 504303377, 1567 | 2075177163, 1568 | 2824099068, 1569 | 1841019862, 1570 | 739644986, 1571 | ] # line:1560 1572 | dword_7 = [ 1573 | 2781242211, 1574 | 2230877308, 1575 | 2582542199, 1576 | 2381740923, 1577 | 234877682, 1578 | 3184946027, 1579 | 2984144751, 1580 | 1418839493, 1581 | 1348481072, 1582 | 50462977, 1583 | 2848876391, 1584 | 2102799147, 1585 | 434634494, 1586 | 1656084439, 1587 | 3863849899, 1588 | 2599188086, 1589 | 1167051466, 1590 | 2636087938, 1591 | 1082771913, 1592 | 2281340285, 1593 | 368048890, 1594 | 3954334041, 1595 | 3381544775, 1596 | 201060592, 1597 | 3963727277, 1598 | 1739838676, 1599 | 4250903202, 1600 | 3930435503, 1601 | 3206782108, 1602 | 4149453988, 1603 | 2531553906, 1604 | 1536934080, 1605 | 3262494647, 1606 | 484572669, 1607 | 2923271059, 1608 | 1783375398, 1609 | 1517041206, 1610 | 1098792767, 1611 | 49674231, 1612 | 1334037708, 1613 | 1550332980, 1614 | 4098991525, 1615 | 886171109, 1616 | 150598129, 1617 | 2481090929, 1618 | 1940642008, 1619 | 1398944049, 1620 | 1059722517, 1621 | 201851908, 1622 | 1385547719, 1623 | 1699095331, 1624 | 1587397571, 1625 | 674240536, 1626 | 2704774806, 1627 | 252314885, 1628 | 3039795866, 1629 | 151914247, 1630 | 908333586, 1631 | 2602270848, 1632 | 1038082786, 1633 | 651029483, 1634 | 1766729511, 1635 | 3447698098, 1636 | 2682942837, 1637 | 454166793, 1638 | 2652734339, 1639 | 1951935532, 1640 | 775166490, 1641 | 758520603, 1642 | 3000790638, 1643 | 4004797018, 1644 | 4217086112, 1645 | 4137964114, 1646 | 1299594043, 1647 | 1639438038, 1648 | 3464344499, 1649 | 2068982057, 1650 | 1054729187, 1651 | 1901997871, 1652 | 2534638724, 1653 | 4121318227, 1654 | 1757008337, 1655 | 0, 1656 | 750906861, 1657 | 1614815264, 1658 | 535035132, 1659 | 3363418545, 1660 | 3988151131, 1661 | 3201591914, 1662 | 1183697867, 1663 | 3647454910, 1664 | 1265776953, 1665 | 3734260298, 1666 | 3566750796, 1667 | 3903871064, 1668 | 1250283471, 1669 | 1807470800, 1670 | 717615087, 1671 | 3847203498, 1672 | 384695291, 1673 | 3313910595, 1674 | 3617213773, 1675 | 1432761139, 1676 | 2484176261, 1677 | 3481945413, 1678 | 283769337, 1679 | 100925954, 1680 | 2180939647, 1681 | 4037038160, 1682 | 1148730428, 1683 | 3123027871, 1684 | 3813386408, 1685 | 4087501137, 1686 | 4267549603, 1687 | 3229630528, 1688 | 2315620239, 1689 | 2906624658, 1690 | 3156319645, 1691 | 1215313976, 1692 | 82966005, 1693 | 3747855548, 1694 | 3245848246, 1695 | 1974459098, 1696 | 1665278241, 1697 | 807407632, 1698 | 451280895, 1699 | 251524083, 1700 | 1841287890, 1701 | 1283575245, 1702 | 337120268, 1703 | 891687699, 1704 | 801369324, 1705 | 3787349855, 1706 | 2721421207, 1707 | 3431482436, 1708 | 959321879, 1709 | 1469301956, 1710 | 4065699751, 1711 | 2197585534, 1712 | 1199193405, 1713 | 2898814052, 1714 | 3887750493, 1715 | 724703513, 1716 | 2514908019, 1717 | 2696962144, 1718 | 2551808385, 1719 | 3516813135, 1720 | 2141445340, 1721 | 1715741218, 1722 | 2119445034, 1723 | 2872807568, 1724 | 2198571144, 1725 | 3398190662, 1726 | 700968686, 1727 | 3547052216, 1728 | 1009259540, 1729 | 2041044702, 1730 | 3803995742, 1731 | 487983883, 1732 | 1991105499, 1733 | 1004265696, 1734 | 1449407026, 1735 | 1316239930, 1736 | 504629770, 1737 | 3683797321, 1738 | 168560134, 1739 | 1816667172, 1740 | 3837287516, 1741 | 1570751170, 1742 | 1857934291, 1743 | 4014189740, 1744 | 2797888098, 1745 | 2822345105, 1746 | 2754712981, 1747 | 936633572, 1748 | 2347923833, 1749 | 852879335, 1750 | 1133234376, 1751 | 1500395319, 1752 | 3084545389, 1753 | 2348912013, 1754 | 1689376213, 1755 | 3533459022, 1756 | 3762923945, 1757 | 3034082412, 1758 | 4205598294, 1759 | 133428468, 1760 | 634383082, 1761 | 2949277029, 1762 | 2398386810, 1763 | 3913789102, 1764 | 403703816, 1765 | 3580869306, 1766 | 2297460856, 1767 | 1867130149, 1768 | 1918643758, 1769 | 607656988, 1770 | 4049053350, 1771 | 3346248884, 1772 | 1368901318, 1773 | 600565992, 1774 | 2090982877, 1775 | 2632479860, 1776 | 557719327, 1777 | 3717614411, 1778 | 3697393085, 1779 | 2249034635, 1780 | 2232388234, 1781 | 2430627952, 1782 | 1115438654, 1783 | 3295786421, 1784 | 2865522278, 1785 | 3633334344, 1786 | 84280067, 1787 | 33027830, 1788 | 303828494, 1789 | 2747425121, 1790 | 1600795957, 1791 | 4188952407, 1792 | 3496589753, 1793 | 2434238086, 1794 | 1486471617, 1795 | 658119965, 1796 | 3106381470, 1797 | 953803233, 1798 | 334231800, 1799 | 3005978776, 1800 | 857870609, 1801 | 3151128937, 1802 | 1890179545, 1803 | 2298973838, 1804 | 2805175444, 1805 | 3056442267, 1806 | 574365214, 1807 | 2450884487, 1808 | 550103529, 1809 | 1233637070, 1810 | 4289353045, 1811 | 2018519080, 1812 | 2057691103, 1813 | 2399374476, 1814 | 4166623649, 1815 | 2148108681, 1816 | 387583245, 1817 | 3664101311, 1818 | 836232934, 1819 | 3330556482, 1820 | 3100665960, 1821 | 3280093505, 1822 | 2955516313, 1823 | 2002398509, 1824 | 287182607, 1825 | 3413881008, 1826 | 4238890068, 1827 | 3597515707, 1828 | 975967766, 1829 | ] # line:1818 1830 | dword_8 = [ 1831 | 1671808611, 1832 | 2089089148, 1833 | 2006576759, 1834 | 2072901243, 1835 | 4061003762, 1836 | 1807603307, 1837 | 1873927791, 1838 | 3310653893, 1839 | 810573872, 1840 | 16974337, 1841 | 1739181671, 1842 | 729634347, 1843 | 4263110654, 1844 | 3613570519, 1845 | 2883997099, 1846 | 1989864566, 1847 | 3393556426, 1848 | 2191335298, 1849 | 3376449993, 1850 | 2106063485, 1851 | 4195741690, 1852 | 1508618841, 1853 | 1204391495, 1854 | 4027317232, 1855 | 2917941677, 1856 | 3563566036, 1857 | 2734514082, 1858 | 2951366063, 1859 | 2629772188, 1860 | 2767672228, 1861 | 1922491506, 1862 | 3227229120, 1863 | 3082974647, 1864 | 4246528509, 1865 | 2477669779, 1866 | 644500518, 1867 | 911895606, 1868 | 1061256767, 1869 | 4144166391, 1870 | 3427763148, 1871 | 878471220, 1872 | 2784252325, 1873 | 3845444069, 1874 | 4043897329, 1875 | 1905517169, 1876 | 3631459288, 1877 | 827548209, 1878 | 356461077, 1879 | 67897348, 1880 | 3344078279, 1881 | 593839651, 1882 | 3277757891, 1883 | 405286936, 1884 | 2527147926, 1885 | 84871685, 1886 | 2595565466, 1887 | 118033927, 1888 | 305538066, 1889 | 2157648768, 1890 | 3795705826, 1891 | 3945188843, 1892 | 661212711, 1893 | 2999812018, 1894 | 1973414517, 1895 | 152769033, 1896 | 2208177539, 1897 | 745822252, 1898 | 439235610, 1899 | 455947803, 1900 | 1857215598, 1901 | 1525593178, 1902 | 2700827552, 1903 | 1391895634, 1904 | 994932283, 1905 | 3596728278, 1906 | 3016654259, 1907 | 695947817, 1908 | 3812548067, 1909 | 795958831, 1910 | 2224493444, 1911 | 1408607827, 1912 | 3513301457, 1913 | 0, 1914 | 3979133421, 1915 | 543178784, 1916 | 4229948412, 1917 | 2982705585, 1918 | 1542305371, 1919 | 1790891114, 1920 | 3410398667, 1921 | 3201918910, 1922 | 961245753, 1923 | 1256100938, 1924 | 1289001036, 1925 | 1491644504, 1926 | 3477767631, 1927 | 3496721360, 1928 | 4012557807, 1929 | 2867154858, 1930 | 4212583931, 1931 | 1137018435, 1932 | 1305975373, 1933 | 861234739, 1934 | 2241073541, 1935 | 1171229253, 1936 | 4178635257, 1937 | 33948674, 1938 | 2139225727, 1939 | 1357946960, 1940 | 1011120188, 1941 | 2679776671, 1942 | 2833468328, 1943 | 1374921297, 1944 | 2751356323, 1945 | 1086357568, 1946 | 2408187279, 1947 | 2460827538, 1948 | 2646352285, 1949 | 944271416, 1950 | 4110742005, 1951 | 3168756668, 1952 | 3066132406, 1953 | 3665145818, 1954 | 560153121, 1955 | 271589392, 1956 | 4279952895, 1957 | 4077846003, 1958 | 3530407890, 1959 | 3444343245, 1960 | 202643468, 1961 | 322250259, 1962 | 3962553324, 1963 | 1608629855, 1964 | 2543990167, 1965 | 1154254916, 1966 | 389623319, 1967 | 3294073796, 1968 | 2817676711, 1969 | 2122513534, 1970 | 1028094525, 1971 | 1689045092, 1972 | 1575467613, 1973 | 422261273, 1974 | 1939203699, 1975 | 1621147744, 1976 | 2174228865, 1977 | 1339137615, 1978 | 3699352540, 1979 | 577127458, 1980 | 712922154, 1981 | 2427141008, 1982 | 2290289544, 1983 | 1187679302, 1984 | 3995715566, 1985 | 3100863416, 1986 | 339486740, 1987 | 3732514782, 1988 | 1591917662, 1989 | 186455563, 1990 | 3681988059, 1991 | 3762019296, 1992 | 844522546, 1993 | 978220090, 1994 | 169743370, 1995 | 1239126601, 1996 | 101321734, 1997 | 611076132, 1998 | 1558493276, 1999 | 3260915650, 2000 | 3547250131, 2001 | 2901361580, 2002 | 1655096418, 2003 | 2443721105, 2004 | 2510565781, 2005 | 3828863972, 2006 | 2039214713, 2007 | 3878868455, 2008 | 3359869896, 2009 | 928607799, 2010 | 1840765549, 2011 | 2374762893, 2012 | 3580146133, 2013 | 1322425422, 2014 | 2850048425, 2015 | 1823791212, 2016 | 1459268694, 2017 | 4094161908, 2018 | 3928346602, 2019 | 1706019429, 2020 | 2056189050, 2021 | 2934523822, 2022 | 135794696, 2023 | 3134549946, 2024 | 2022240376, 2025 | 628050469, 2026 | 779246638, 2027 | 472135708, 2028 | 2800834470, 2029 | 3032970164, 2030 | 3327236038, 2031 | 3894660072, 2032 | 3715932637, 2033 | 1956440180, 2034 | 522272287, 2035 | 1272813131, 2036 | 3185336765, 2037 | 2340818315, 2038 | 2323976074, 2039 | 1888542832, 2040 | 1044544574, 2041 | 3049550261, 2042 | 1722469478, 2043 | 1222152264, 2044 | 50660867, 2045 | 4127324150, 2046 | 236067854, 2047 | 1638122081, 2048 | 895445557, 2049 | 1475980887, 2050 | 3117443513, 2051 | 2257655686, 2052 | 3243809217, 2053 | 489110045, 2054 | 2662934430, 2055 | 3778599393, 2056 | 4162055160, 2057 | 2561878936, 2058 | 288563729, 2059 | 1773916777, 2060 | 3648039385, 2061 | 2391345038, 2062 | 2493985684, 2063 | 2612407707, 2064 | 505560094, 2065 | 2274497927, 2066 | 3911240169, 2067 | 3460925390, 2068 | 1442818645, 2069 | 678973480, 2070 | 3749357023, 2071 | 2358182796, 2072 | 2717407649, 2073 | 2306869641, 2074 | 219617805, 2075 | 3218761151, 2076 | 3862026214, 2077 | 1120306242, 2078 | 1756942440, 2079 | 1103331905, 2080 | 2578459033, 2081 | 762796589, 2082 | 252780047, 2083 | 2966125488, 2084 | 1425844308, 2085 | 3151392187, 2086 | 372911126, 2087 | ] # line:2076 2088 | dword_9 = [ 2089 | 1667474886, 2090 | 2088535288, 2091 | 2004326894, 2092 | 2071694838, 2093 | 4075949567, 2094 | 1802223062, 2095 | 1869591006, 2096 | 3318043793, 2097 | 808472672, 2098 | 16843522, 2099 | 1734846926, 2100 | 724270422, 2101 | 4278065639, 2102 | 3621216949, 2103 | 2880169549, 2104 | 1987484396, 2105 | 3402253711, 2106 | 2189597983, 2107 | 3385409673, 2108 | 2105378810, 2109 | 4210693615, 2110 | 1499065266, 2111 | 1195886990, 2112 | 4042263547, 2113 | 2913856577, 2114 | 3570689971, 2115 | 2728590687, 2116 | 2947541573, 2117 | 2627518243, 2118 | 2762274643, 2119 | 1920112356, 2120 | 3233831835, 2121 | 3082273397, 2122 | 4261223649, 2123 | 2475929149, 2124 | 640051788, 2125 | 909531756, 2126 | 1061110142, 2127 | 4160160501, 2128 | 3435941763, 2129 | 875846760, 2130 | 2779116625, 2131 | 3857003729, 2132 | 4059105529, 2133 | 1903268834, 2134 | 3638064043, 2135 | 825316194, 2136 | 353713962, 2137 | 67374088, 2138 | 3351728789, 2139 | 589522246, 2140 | 3284360861, 2141 | 404236336, 2142 | 2526454071, 2143 | 84217610, 2144 | 2593830191, 2145 | 117901582, 2146 | 303183396, 2147 | 2155911963, 2148 | 3806477791, 2149 | 3958056653, 2150 | 656894286, 2151 | 2998062463, 2152 | 1970642922, 2153 | 151591698, 2154 | 2206440989, 2155 | 741110872, 2156 | 437923380, 2157 | 454765878, 2158 | 1852748508, 2159 | 1515908788, 2160 | 2694904667, 2161 | 1381168804, 2162 | 993742198, 2163 | 3604373943, 2164 | 3014905469, 2165 | 690584402, 2166 | 3823320797, 2167 | 791638366, 2168 | 2223281939, 2169 | 1398011302, 2170 | 3520161977, 2171 | 0, 2172 | 3991743681, 2173 | 538992704, 2174 | 4244381667, 2175 | 2981218425, 2176 | 1532751286, 2177 | 1785380564, 2178 | 3419096717, 2179 | 3200178535, 2180 | 960056178, 2181 | 1246420628, 2182 | 1280103576, 2183 | 1482221744, 2184 | 3486468741, 2185 | 3503319995, 2186 | 4025428677, 2187 | 2863326543, 2188 | 4227536621, 2189 | 1128514950, 2190 | 1296947098, 2191 | 859002214, 2192 | 2240123921, 2193 | 1162203018, 2194 | 4193849577, 2195 | 33687044, 2196 | 2139062782, 2197 | 1347481760, 2198 | 1010582648, 2199 | 2678045221, 2200 | 2829640523, 2201 | 1364325282, 2202 | 2745433693, 2203 | 1077985408, 2204 | 2408548869, 2205 | 2459086143, 2206 | 2644360225, 2207 | 943212656, 2208 | 4126475505, 2209 | 3166494563, 2210 | 3065430391, 2211 | 3671750063, 2212 | 555836226, 2213 | 269496352, 2214 | 4294908645, 2215 | 4092792573, 2216 | 3537006015, 2217 | 3452783745, 2218 | 202118168, 2219 | 320025894, 2220 | 3974901699, 2221 | 1600119230, 2222 | 2543297077, 2223 | 1145359496, 2224 | 387397934, 2225 | 3301201811, 2226 | 2812801621, 2227 | 2122220284, 2228 | 1027426170, 2229 | 1684319432, 2230 | 1566435258, 2231 | 421079858, 2232 | 1936954854, 2233 | 1616945344, 2234 | 2172753945, 2235 | 1330631070, 2236 | 3705438115, 2237 | 572679748, 2238 | 707427924, 2239 | 2425400123, 2240 | 2290647819, 2241 | 1179044492, 2242 | 4008585671, 2243 | 3099120491, 2244 | 336870440, 2245 | 3739122087, 2246 | 1583276732, 2247 | 185277718, 2248 | 3688593069, 2249 | 3772791771, 2250 | 842159716, 2251 | 976899700, 2252 | 168435220, 2253 | 1229577106, 2254 | 101059084, 2255 | 606366792, 2256 | 1549591736, 2257 | 3267517855, 2258 | 3553849021, 2259 | 2897014595, 2260 | 1650632388, 2261 | 2442242105, 2262 | 2509612081, 2263 | 3840161747, 2264 | 2038008818, 2265 | 3890688725, 2266 | 3368567691, 2267 | 926374254, 2268 | 1835907034, 2269 | 2374863873, 2270 | 3587531953, 2271 | 1313788572, 2272 | 2846482505, 2273 | 1819063512, 2274 | 1448540844, 2275 | 4109633523, 2276 | 3941213647, 2277 | 1701162954, 2278 | 2054852340, 2279 | 2930698567, 2280 | 134748176, 2281 | 3132806511, 2282 | 2021165296, 2283 | 623210314, 2284 | 774795868, 2285 | 471606328, 2286 | 2795958615, 2287 | 3031746419, 2288 | 3334885783, 2289 | 3907527627, 2290 | 3722280097, 2291 | 1953799400, 2292 | 522133822, 2293 | 1263263126, 2294 | 3183336545, 2295 | 2341176845, 2296 | 2324333839, 2297 | 1886425312, 2298 | 1044267644, 2299 | 3048588401, 2300 | 1718004428, 2301 | 1212733584, 2302 | 50529542, 2303 | 4143317495, 2304 | 235803164, 2305 | 1633788866, 2306 | 892690282, 2307 | 1465383342, 2308 | 3115962473, 2309 | 2256965911, 2310 | 3250673817, 2311 | 488449850, 2312 | 2661202215, 2313 | 3789633753, 2314 | 4177007595, 2315 | 2560144171, 2316 | 286339874, 2317 | 1768537042, 2318 | 3654906025, 2319 | 2391705863, 2320 | 2492770099, 2321 | 2610673197, 2322 | 505291324, 2323 | 2273808917, 2324 | 3924369609, 2325 | 3469625735, 2326 | 1431699370, 2327 | 673740880, 2328 | 3755965093, 2329 | 2358021891, 2330 | 2711746649, 2331 | 2307489801, 2332 | 218961690, 2333 | 3217021541, 2334 | 3873845719, 2335 | 1111672452, 2336 | 1751693520, 2337 | 1094828930, 2338 | 2576986153, 2339 | 757954394, 2340 | 252645662, 2341 | 2964376443, 2342 | 1414855848, 2343 | 3149649517, 2344 | 370555436, 2345 | ] # line:2334 2346 | LIST_6B0 = [ 2347 | 4089235720, 2348 | 1779033703, 2349 | 2227873595, 2350 | 3144134277, 2351 | 4271175723, 2352 | 1013904242, 2353 | 1595750129, 2354 | 2773480762, 2355 | 2917565137, 2356 | 1359893119, 2357 | 725511199, 2358 | 2600822924, 2359 | 4215389547, 2360 | 528734635, 2361 | 327033209, 2362 | 1541459225, 2363 | ] # line:2352 2364 | ord_list = [ 2365 | 77, 2366 | 212, 2367 | 194, 2368 | 230, 2369 | 184, 2370 | 49, 2371 | 98, 2372 | 9, 2373 | 14, 2374 | 82, 2375 | 179, 2376 | 199, 2377 | 166, 2378 | 115, 2379 | 59, 2380 | 164, 2381 | 28, 2382 | 178, 2383 | 70, 2384 | 43, 2385 | 130, 2386 | 154, 2387 | 181, 2388 | 138, 2389 | 25, 2390 | 107, 2391 | 57, 2392 | 219, 2393 | 87, 2394 | 23, 2395 | 117, 2396 | 36, 2397 | 244, 2398 | 155, 2399 | 175, 2400 | 127, 2401 | 8, 2402 | 232, 2403 | 214, 2404 | 141, 2405 | 38, 2406 | 167, 2407 | 46, 2408 | 55, 2409 | 193, 2410 | 169, 2411 | 90, 2412 | 47, 2413 | 31, 2414 | 5, 2415 | 165, 2416 | 24, 2417 | 146, 2418 | 174, 2419 | 242, 2420 | 148, 2421 | 151, 2422 | 50, 2423 | 182, 2424 | 42, 2425 | 56, 2426 | 170, 2427 | 221, 2428 | 88, 2429 | ] # line:2418 2430 | rodata = [ 2431 | 3609767458, 2432 | 1116352408, 2433 | 602891725, 2434 | 1899447441, 2435 | 3964484399, 2436 | 3049323471, 2437 | 2173295548, 2438 | 3921009573, 2439 | 4081628472, 2440 | 961987163, 2441 | 3053834265, 2442 | 1508970993, 2443 | 2937671579, 2444 | 2453635748, 2445 | 3664609560, 2446 | 2870763221, 2447 | 2734883394, 2448 | 3624381080, 2449 | 1164996542, 2450 | 310598401, 2451 | 1323610764, 2452 | 607225278, 2453 | 3590304994, 2454 | 1426881987, 2455 | 4068182383, 2456 | 1925078388, 2457 | 991336113, 2458 | 2162078206, 2459 | 633803317, 2460 | 2614888103, 2461 | 3479774868, 2462 | 3248222580, 2463 | 2666613458, 2464 | 3835390401, 2465 | 944711139, 2466 | 4022224774, 2467 | 2341262773, 2468 | 264347078, 2469 | 2007800933, 2470 | 604807628, 2471 | 1495990901, 2472 | 770255983, 2473 | 1856431235, 2474 | 1249150122, 2475 | 3175218132, 2476 | 1555081692, 2477 | 2198950837, 2478 | 1996064986, 2479 | 3999719339, 2480 | 2554220882, 2481 | 766784016, 2482 | 2821834349, 2483 | 2566594879, 2484 | 2952996808, 2485 | 3203337956, 2486 | 3210313671, 2487 | 1034457026, 2488 | 3336571891, 2489 | 2466948901, 2490 | 3584528711, 2491 | 3758326383, 2492 | 113926993, 2493 | 168717936, 2494 | 338241895, 2495 | 1188179964, 2496 | 666307205, 2497 | 1546045734, 2498 | 773529912, 2499 | 1522805485, 2500 | 1294757372, 2501 | 2643833823, 2502 | 1396182291, 2503 | 2343527390, 2504 | 1695183700, 2505 | 1014477480, 2506 | 1986661051, 2507 | 1206759142, 2508 | 2177026350, 2509 | 344077627, 2510 | 2456956037, 2511 | 1290863460, 2512 | 2730485921, 2513 | 3158454273, 2514 | 2820302411, 2515 | 3505952657, 2516 | 3259730800, 2517 | 106217008, 2518 | 3345764771, 2519 | 3606008344, 2520 | 3516065817, 2521 | 1432725776, 2522 | 3600352804, 2523 | 1467031594, 2524 | 4094571909, 2525 | 851169720, 2526 | 275423344, 2527 | 3100823752, 2528 | 430227734, 2529 | 1363258195, 2530 | 506948616, 2531 | 3750685593, 2532 | 659060556, 2533 | 3785050280, 2534 | 883997877, 2535 | 3318307427, 2536 | 958139571, 2537 | 3812723403, 2538 | 1322822218, 2539 | 2003034995, 2540 | 1537002063, 2541 | 3602036899, 2542 | 1747873779, 2543 | 1575990012, 2544 | 1955562222, 2545 | 1125592928, 2546 | 2024104815, 2547 | 2716904306, 2548 | 2227730452, 2549 | 442776044, 2550 | 2361852424, 2551 | 593698344, 2552 | 2428436474, 2553 | 3733110249, 2554 | 2756734187, 2555 | 2999351573, 2556 | 3204031479, 2557 | 3815920427, 2558 | 3329325298, 2559 | 3928383900, 2560 | 3391569614, 2561 | 566280711, 2562 | 3515267271, 2563 | 3454069534, 2564 | 3940187606, 2565 | 4000239992, 2566 | 4118630271, 2567 | 1914138554, 2568 | 116418474, 2569 | 2731055270, 2570 | 174292421, 2571 | 3203993006, 2572 | 289380356, 2573 | 320620315, 2574 | 460393269, 2575 | 587496836, 2576 | 685471733, 2577 | 1086792851, 2578 | 852142971, 2579 | 365543100, 2580 | 1017036298, 2581 | 2618297676, 2582 | 1126000580, 2583 | 3409855158, 2584 | 1288033470, 2585 | 4234509866, 2586 | 1501505948, 2587 | 987167468, 2588 | 1607167915, 2589 | 1246189591, 2590 | 1816402316, 2591 | ] # line:2580 2592 | list_9C8 = [] 2593 | 2594 | def encrypt(self, data): 2595 | headers = [31, 139, 8, 0, 0, 0, 0, 0, 0, 0] 2596 | data = gzip.compress(bytes(data.encode("latin-1")), compresslevel=9, mtime=0) 2597 | data = list(data) 2598 | self.setData(data) 2599 | for i in range(len(headers)): 2600 | self.__content[i] = headers[i] 2601 | list_0B0 = self.calculate(self.list_9C8) + self.ord_list 2602 | 2603 | list_5D8 = self.calculate(list_0B0) 2604 | list_378 = [] 2605 | list_740 = [] 2606 | for i in range(0x10): 2607 | list_378.append(list_5D8[i]) 2608 | list_378Array = self.dump_list(list_378) 2609 | for i in range(0x10, 0x20): 2610 | list_740.append(list_5D8[i]) 2611 | 2612 | list_8D8 = self.calculate(self.__content) 2613 | list_AB0 = list_8D8 + self.__content 2614 | list_AB0List = self.convertLongList(list_AB0) 2615 | differ = 0x10 - len(list_AB0) % 0x10 2616 | 2617 | for i in range(differ): 2618 | list_AB0List.append(differ) 2619 | 2620 | list_AB0 = list_AB0List 2621 | 2622 | list_55C = self.hex_CF8(list_378Array) 2623 | final_list = self.hex_0A2(list_AB0, list_740, list_55C) 2624 | final_list = (self.begining + self.list_9C8) + final_list 2625 | final_list = self.changeLongArrayTobytes(final_list) 2626 | 2627 | return bytes(i % 256 for i in final_list).hex() 2628 | 2629 | def decrypt(self, data): 2630 | data = bytearray.fromhex(data) 2631 | data = list(data) 2632 | self.setData(data) 2633 | self.__content = self.__content_raw[38:] 2634 | self.list_9C8 = self.__content_raw[6:38] 2635 | self.__content = self.changeByteArrayToLong(self.__content) 2636 | list_0B0 = self.calculate(self.list_9C8) + self.ord_list 2637 | list_5D8 = self.calculate(list_0B0) 2638 | 2639 | list_378 = [] 2640 | list_740 = [] 2641 | for i in range(0x10): 2642 | list_378.append(list_5D8[i]) 2643 | list_378Array = self.dump_list(list_378) 2644 | for i in range(0x10, 0x20): 2645 | list_740.append(list_5D8[i]) 2646 | 2647 | key_longs = self.hex_list(list_378Array) 2648 | decrypted = self.aes_decrypt(bytes(key_longs), bytes(self.__content)) 2649 | 2650 | decryptedByteArray = ([0] * 16) + list(decrypted) 2651 | toDecompress = decryptedByteArray[64:] 2652 | result = gzip.decompress(bytes(toDecompress)) 2653 | return result.decode() 2654 | 2655 | def aes_decrypt(self, secretKey, encoded): 2656 | initVector = encoded[0:16] 2657 | data = encoded[16:] 2658 | decryptor = AES.new(secretKey, AES.MODE_CBC, initVector) 2659 | decoded = decryptor.decrypt(data) 2660 | return decoded[: -decoded[-1]] 2661 | 2662 | def bytearray_decode(self, arrays): 2663 | out = [] 2664 | for d in arrays: 2665 | out.append(chr(d)) 2666 | return "".join(out) 2667 | 2668 | def changeLongArrayTobytes(self, array): 2669 | result = [] 2670 | for i in range(len(array)): 2671 | if array[i] > 127: 2672 | result.append(array[i] - 256) 2673 | else: 2674 | result.append(array[i]) 2675 | return result 2676 | 2677 | def hex_0A2(self, content, list_740, list_55C): 2678 | result = [] 2679 | l55cl = len(list_55C) 2680 | lens = len(content) 2681 | end = lens // 16 2682 | for i in range(end): 2683 | for j in range(16): 2684 | list_740[j] = list_740[j] ^ content[16 * i + j] 2685 | 2686 | tmp_list = self.dump_list(list_740) 2687 | R6 = tmp_list[3] 2688 | LR = tmp_list[0] 2689 | R8 = tmp_list[1] 2690 | R12 = tmp_list[2] 2691 | R5 = list_55C[0] 2692 | R4 = list_55C[1] 2693 | R1 = list_55C[2] 2694 | R2 = list_55C[3] 2695 | R11 = 0 2696 | v_334 = 0 2697 | R2 = R2 ^ R6 2698 | v_33C = R2 2699 | R1 = R1 ^ R12 2700 | v_338 = R1 2701 | R4 = R4 ^ R8 2702 | R12 = R5 ^ LR 2703 | for j in range(5): 2704 | R3 = v_33C 2705 | R9 = R4 2706 | R0 = int(self.UBFX(R12, 0x10, 8)) 2707 | R1 = R3 >> 0x18 2708 | R1 = self.dword_6[R1] 2709 | R0 = self.dword_7[R0] 2710 | R0 = R0 ^ R1 2711 | R1 = int(self.UBFX(R4, 8, 8)) 2712 | R8 = v_338 2713 | R1 = self.dword_8[R1] 2714 | LR = list_55C[8 * j + 6] 2715 | R0 = R0 ^ R1 2716 | R1 = int(self.UTFX(R8)) 2717 | R1 = self.dword_9[R1] 2718 | R0 = R0 ^ R1 2719 | R1 = list_55C[8 * j + 4] 2720 | v_334 = R1 2721 | R1 = list_55C[8 * j + 5] 2722 | v_330 = R1 2723 | R1 = list_55C[8 * j + 7] 2724 | R11 = R0 ^ R1 2725 | R1 = int(self.UBFX(R3, 0x10, 8)) 2726 | R0 = R8 >> 24 2727 | R0 = self.dword_6[R0] 2728 | R1 = self.dword_7[R1] 2729 | R0 = R0 ^ R1 2730 | R1 = int(self.UBFX(R12, 8, 8)) 2731 | R1 = self.dword_8[R1] 2732 | R0 = R0 ^ R1 2733 | R1 = int(self.UTFX(R9)) 2734 | R1 = self.dword_9[R1] 2735 | R0 = R0 ^ R1 2736 | R1 = int(self.UBFX(R8, 0x10, 8)) 2737 | R6 = R0 ^ LR 2738 | R0 = R9 >> 24 2739 | R0 = self.dword_6[R0] 2740 | R1 = self.dword_7[R1] 2741 | R0 = R0 ^ R1 2742 | R1 = int(self.UBFX(R3, 8, 8)) 2743 | R1 = self.dword_8[R1] 2744 | R0 = R0 ^ R1 2745 | R1 = int(self.UTFX(R12)) 2746 | R1 = self.dword_9[R1] 2747 | R0 = R0 ^ R1 2748 | R1 = v_330 2749 | LR = R0 ^ R1 2750 | R0 = int(self.UTFX(R3)) 2751 | R0 = self.dword_9[R0] 2752 | R4 = R12 >> 24 2753 | 2754 | R1 = int(self.UBFX(R8, 8, 8)) 2755 | R4 = self.dword_6[R4] 2756 | R5 = int(self.UBFX(R9, 16, 8)) 2757 | R1 = self.dword_8[R1] 2758 | R5 = self.dword_7[R5] 2759 | R5 = R5 ^ R4 2760 | R1 = R1 ^ R5 2761 | R0 = R0 ^ R1 2762 | R1 = v_334 2763 | R1 = R1 ^ R0 2764 | R0 = R1 >> 0x18 2765 | v_334 = R0 2766 | if j == 4: 2767 | break 2768 | else: 2769 | R4 = int(self.UBFX(R1, 16, 8)) 2770 | R5 = R11 >> 24 2771 | R10 = R6 2772 | R5 = self.dword_6[R5] 2773 | R4 = self.dword_7[R4] 2774 | R5 = R5 ^ R4 2775 | R4 = int(self.UBFX(LR, 8, 8)) 2776 | R4 = self.dword_8[R4] 2777 | R5 = R5 ^ R4 2778 | R4 = int(self.UTFX(R10)) 2779 | R4 = self.dword_9[R4] 2780 | R5 = R5 ^ R4 2781 | R4 = list_55C[8 * j + 11] 2782 | R0 = R5 ^ R4 2783 | v_33C = R0 2784 | R4 = int(self.UBFX(R11, 16, 8)) 2785 | R5 = R10 >> 24 2786 | R5 = self.dword_6[R5] 2787 | R4 = self.dword_7[R4] 2788 | R5 = R5 ^ R4 2789 | R4 = int(self.UBFX(R1, 8, 8)) 2790 | R0 = list_55C[8 * j + 9] 2791 | R9 = list_55C[8 * j + 8] 2792 | R1 = int(self.UTFX(R1)) 2793 | R4 = self.dword_8[R4] 2794 | R1 = self.dword_9[R1] 2795 | R5 = R5 ^ R4 2796 | R4 = int(self.UTFX(LR)) 2797 | R4 = self.dword_9[R4] 2798 | R5 = R5 ^ R4 2799 | R4 = list_55C[8 * j + 10] 2800 | R4 = R4 ^ R5 2801 | v_338 = R4 2802 | R5 = int(self.UBFX(R10, 16, 8)) 2803 | R4 = LR >> 24 2804 | R4 = self.dword_6[R4] 2805 | R5 = self.dword_7[R5] 2806 | R4 = R4 ^ R5 2807 | R5 = int(self.UBFX(R11, 8, 8)) 2808 | R5 = self.dword_8[R5] 2809 | R4 = R4 ^ R5 2810 | R1 = R1 ^ R4 2811 | R4 = R1 ^ R0 2812 | R0 = v_334 2813 | R1 = int(self.UBFX(LR, 16, 8)) 2814 | R5 = int(self.UBFX(R10, 8, 8)) 2815 | R0 = self.dword_6[R0] 2816 | R1 = self.dword_7[R1] 2817 | R5 = self.dword_8[R5] 2818 | R0 = R0 ^ R1 2819 | R1 = int(self.UTFX(R11)) 2820 | R1 = self.dword_9[R1] 2821 | R0 = R0 ^ R5 2822 | R0 = R0 ^ R1 2823 | R12 = R0 ^ R9 2824 | R2 = R11 >> 24 2825 | R3 = int(self.UBFX(R1, 16, 8)) 2826 | R10 = R6 2827 | R0 = R10 >> 24 2828 | R2 = self.dword_0[R2] 2829 | 2830 | R2 = int(self.parseLong(self.toHex(R2) + "000000", 10, 16)) 2831 | R9 = R10 2832 | R3 = self.dword_0[R3] 2833 | R3 = int(self.parseLong(self.toHex(R3) + "0000", 10, 16)) 2834 | R0 = self.dword_0[R0] 2835 | R0 = int(self.parseLong(self.toHex(R0) + "000000", 10, 16)) 2836 | R2 = R2 ^ R3 2837 | v_350 = R2 2838 | R2 = int(self.UBFX(R11, 0x10, 8)) 2839 | R2 = self.dword_0[R2] 2840 | R2 = int(self.parseLong(self.toHex(R2) + "0000", 10, 16)) 2841 | R0 = R0 ^ R2 2842 | R2 = int(self.UBFX(R1, 8, 8)) 2843 | R1 = int(self.UTFX(R1)) 2844 | R2 = self.dword_0[R2] 2845 | R2 = int(self.parseLong(self.toHex(R2) + "00", 10, 16)) 2846 | R1 = self.dword_0[R1] 2847 | R0 = R0 ^ R2 2848 | R2 = int(self.UTFX(LR)) 2849 | R2 = self.dword_0[R2] 2850 | R12 = R0 ^ R2 2851 | R0 = list_55C[l55cl - 2] 2852 | R10 = list_55C[l55cl - 3] 2853 | R12 = R12 ^ R0 2854 | R2 = list_55C[l55cl - 1] 2855 | R0 = LR >> 24 2856 | v_34C = R2 2857 | R2 = int(self.UBFX(R9, 0x10, 8)) 2858 | R0 = self.dword_0[R0] 2859 | R0 = int(self.parseLong(self.toHex(R0) + "000000", 10, 16)) 2860 | R2 = self.dword_0[R2] 2861 | R2 = int(self.parseLong(self.toHex(R2) + "0000", 10, 16)) 2862 | R0 = R0 ^ R2 2863 | R2 = int(self.UBFX(R11, 8, 8)) 2864 | R2 = self.dword_0[R2] 2865 | R2 = int(self.parseLong(self.toHex(R2) + "00", 10, 16)) 2866 | R0 = R0 ^ R2 2867 | R0 = R0 ^ R1 2868 | R1 = R0 ^ R10 2869 | R0 = v_334 2870 | R2 = int(self.UBFX(LR, 0x10, 8)) 2871 | R0 = self.dword_0[R0] 2872 | R0 = int(self.parseLong(self.toHex(R0) + "000000", 10, 16)) 2873 | R2 = self.dword_0[R2] 2874 | R2 = int(self.parseLong(self.toHex(R2) + "0000", 10, 16)) 2875 | R0 = R0 ^ R2 2876 | R2 = int(self.UBFX(R9, 8, 8)) 2877 | R2 = self.dword_0[R2] 2878 | R2 = int(self.parseLong(self.toHex(R2) + "00", 10, 16)) 2879 | R0 = R0 ^ R2 2880 | R2 = int(self.UTFX(R11)) 2881 | R2 = self.dword_0[R2] 2882 | R0 = R0 ^ R2 2883 | R2 = int(self.UTFX(R9)) 2884 | R2 = self.dword_0[R2] 2885 | R3 = int(self.UBFX(LR, 8, 8)) 2886 | R3 = self.dword_0[R3] 2887 | R3 = int(self.parseLong(self.toHex(R3) + "00", 10, 16)) 2888 | R5 = v_350 2889 | R6 = list_55C[l55cl - 4] 2890 | R3 = R3 ^ R5 2891 | R2 = R2 ^ R3 2892 | R3 = v_34C 2893 | R0 = R0 ^ R6 2894 | R2 = R2 ^ R3 2895 | list_740 = self.hex_list([R0, R1, R12, R2]) 2896 | result = result + list_740 2897 | 2898 | return result # WORKED 2899 | 2900 | def calculate(self, content): 2901 | hex_6A8 = 0 2902 | tmp_list = [] 2903 | length = len(content) 2904 | list_6B0 = self.LIST_6B0.copy() 2905 | 2906 | for item in content: 2907 | tmp_list.append(item) 2908 | 2909 | divisible = length % 0x80 2910 | tmp = 0x80 - divisible 2911 | 2912 | if tmp > 0x11: 2913 | tmp_list.append(0x80) 2914 | for i in range(tmp - 0x11): 2915 | tmp_list.append(0) 2916 | 2917 | for j in range(16): 2918 | tmp_list.append(0) 2919 | else: 2920 | tmp_list.append(128) 2921 | 2922 | for i in range(128 - 16 + tmp + 1): 2923 | tmp_list.append(0) 2924 | 2925 | for j in range(16): 2926 | tmp_list.append(0) 2927 | 2928 | tmp_list_size = len(tmp_list) 2929 | d = tmp_list_size // 0x80 2930 | for i in range(tmp_list_size // 0x80): 2931 | if (tmp_list_size // 128 - 1) == i: 2932 | ending = self.handle_ending(hex_6A8, divisible) 2933 | for j in range(8): 2934 | index = tmp_list_size - j - 1 2935 | tmp_list[index] = ending[7 - j] 2936 | 2937 | param_list = [] 2938 | for j in range(32): 2939 | tmpss = "" 2940 | for k in range(4): 2941 | tmp_string = self.toHex(tmp_list[0x80 * i + 4 * j + k]) 2942 | if len(tmp_string) < 2: 2943 | tmp_string = "0" + tmp_string 2944 | 2945 | tmpss = tmpss + tmp_string 2946 | 2947 | param_list.append(int(self.parseLong(tmpss, 10, 16))) 2948 | 2949 | list_3B8 = self.hex_27E(param_list) 2950 | 2951 | list_6B0 = self.hex_30A(list_6B0, list_3B8) 2952 | 2953 | hex_6A8 += 0x400 2954 | 2955 | list_8D8 = self.hex_C52(list_6B0) 2956 | return list_8D8 2957 | 2958 | def convertLongList(self, content): 2959 | if len(content) == 0: 2960 | return [] 2961 | result = [] 2962 | for i in content: 2963 | result.append(i) 2964 | return result 2965 | 2966 | def dump_list(self, content): 2967 | size = len(content) 2968 | ssize = size // 4 2969 | result = [] 2970 | for index in range(ssize): 2971 | tmp_string = "" 2972 | for j in range(4): 2973 | tmp = self.toHex(content[4 * index + j]) 2974 | if len(tmp) < 2: 2975 | tmp = "0" + tmp 2976 | 2977 | tmp_string = tmp_string + tmp 2978 | i = int(self.parseLong(tmp_string, 10, 16)) 2979 | result.append(int(i)) 2980 | return result 2981 | 2982 | def hex_CF8(self, param_list): 2983 | list_388 = [] 2984 | list_378 = param_list 2985 | for i in range(0xA): 2986 | R3 = list_378[0] 2987 | R8 = list_378[1] 2988 | R9 = list_378[2] 2989 | R5 = list_378[3] 2990 | R6 = int(self.UBFX(R5, 8, 8)) 2991 | R6 = self.dword_0[R6] 2992 | R6 = int(self.parseLong(self.toHex(R6) + "0000", 10, 16)) 2993 | R4 = int(self.UBFX(R5, 0x10, 8)) 2994 | R11 = self.dword_1[i] 2995 | R4 = self.dword_0[R4] 2996 | R4 = int(self.parseLong(self.toHex(R4) + "000000", 10, 16)) 2997 | R3 = R3 ^ R4 2998 | R4 = int(self.UTFX(R5)) 2999 | R3 = R3 ^ R6 3000 | R4 = self.dword_0[R4] 3001 | R4 = int(self.parseLong(self.toHex(R4) + "00", 10, 16)) 3002 | R3 = R3 ^ R4 3003 | R4 = R5 >> 24 3004 | R4 = self.dword_0[R4] 3005 | R3 = R3 ^ R4 3006 | R3 = R3 ^ R11 3007 | R2 = R8 ^ R3 3008 | R4 = R9 ^ R2 3009 | R5 = R5 ^ R4 3010 | list_378 = [R3, R2, R4, R5] 3011 | list_388 = list_388 + list_378 3012 | l388l = len(list_388) 3013 | list_478 = [] 3014 | for i in range(0x9): 3015 | R5 = list_388[l388l - 8 - 4 * i] 3016 | R4 = int(self.UBFX(R5, 0x10, 8)) 3017 | R6 = R5 >> 0x18 3018 | R6 = self.dword_2[R6] 3019 | R4 = self.dword_3[R4] 3020 | R6 = R6 ^ R4 3021 | R4 = int(self.UBFX(R5, 8, 8)) 3022 | R5 = int(self.UTFX(R5)) 3023 | R4 = self.dword_4[R4] 3024 | R5 = self.dword_5[R5] 3025 | R6 = R6 ^ R4 3026 | R6 = R6 ^ R5 3027 | list_478.append(R6) 3028 | R6 = list_388[l388l - 7 - 4 * i] 3029 | R1 = int(self.UBFX(R6, 0x10, 8)) 3030 | R4 = R6 >> 0x18 3031 | R4 = self.dword_2[R4] 3032 | R1 = self.dword_3[R1] 3033 | R1 = R1 ^ R4 3034 | R4 = int(self.UBFX(R6, 8, 8)) 3035 | R4 = self.dword_4[R4] 3036 | R1 = R1 ^ R4 3037 | R4 = int(self.UTFX(R6)) 3038 | R4 = self.dword_5[R4] 3039 | R1 = R1 ^ R4 3040 | list_478.append(R1) 3041 | R1 = list_388[l388l - 6 - 4 * i] 3042 | R6 = int(self.UBFX(R1, 0x10, 8)) 3043 | R4 = R1 >> 0x18 3044 | R4 = self.dword_2[R4] 3045 | R6 = self.dword_3[R6] 3046 | R4 = R4 ^ R6 3047 | R6 = int(self.UBFX(R1, 8, 8)) 3048 | R1 = int(self.UTFX(R1)) 3049 | R6 = self.dword_4[R6] 3050 | R1 = self.dword_5[R1] 3051 | R4 = R4 ^ R6 3052 | R1 = R1 ^ R4 3053 | list_478.append(R1) 3054 | R0 = list_388[l388l - 5 - 4 * i] 3055 | R1 = int(self.UTFX(R0)) 3056 | R4 = int(self.UBFX(R0, 8, 8)) 3057 | R6 = R0 >> 0x18 3058 | R0 = int(self.UBFX(R0, 0x10, 8)) 3059 | R6 = self.dword_2[R6] 3060 | R0 = self.dword_3[R0] 3061 | R4 = self.dword_4[R4] 3062 | R1 = self.dword_5[R1] 3063 | R0 = R0 ^ R6 3064 | R0 = R0 ^ R4 3065 | R0 = R0 ^ R1 3066 | list_478.append(R0) 3067 | list_468 = param_list + list_388 3068 | return list_468 3069 | 3070 | def handle_ending(self, num, r0): 3071 | s = self.toHex(num) 3072 | r1 = None 3073 | r2 = None 3074 | if len(s) <= 8: 3075 | r1 = num 3076 | r2 = 0 3077 | else: 3078 | num_str = self.toHex(num) 3079 | length = len(num) 3080 | r1 = self.parseLong(num_str[: length - 8], 10, 16) 3081 | r2 = self.parseLong(num_str[2 : length - 8], 10, 16) 3082 | 3083 | r1 = self.ADDS(r1, r0 << 3) 3084 | r2 = self.ADC(r2, r0 >> 29) 3085 | a = self.hex_list([r2, r1]) 3086 | return self.hex_list([r2, r1]) 3087 | 3088 | def UTFX(self, num): 3089 | tmp_string = self.toBinaryString(num) 3090 | start = len(tmp_string) - 8 3091 | return self.parseLong(tmp_string[start:], 10, 2) 3092 | 3093 | def hex_27E(self, param_list): 3094 | r6 = param_list[0] 3095 | r8 = param_list[1] 3096 | for i in range(0x40): 3097 | r0 = param_list[2 * i + 0x1C] 3098 | r5 = param_list[2 * i + 0x1D] 3099 | r4 = self.LSRS(r0, 0x13) 3100 | r3 = self.LSRS(r0, 0x1D) 3101 | lr = r4 | self.check(r5) << 13 3102 | r4 = self.LSLS(r0, 3) 3103 | r4 = r4 | self.check(r5) >> 29 3104 | r3 = r3 | self.check(r5) << 3 3105 | r4 = r4 ^ self.check(r0) >> 6 3106 | lr = lr ^ r4 3107 | r4 = self.LSRS(r5, 6) 3108 | r4 = r4 | self.check(r0) << 26 3109 | r9 = r3 ^ r4 3110 | r4 = self.LSRS(r5, 0x13) 3111 | r0 = r4 | self.check(r0) << 13 3112 | r10 = param_list[2 * i + 0x12] 3113 | r3 = param_list[2 * i + 0x13] 3114 | r5 = param_list[2 * i + 0x2] 3115 | r4 = param_list[2 * i + 0x3] 3116 | r0 = r0 ^ r9 3117 | r3 = self.ADDS(r3, r8) 3118 | r6 = self.ADC(r6, r10) 3119 | r8 = self.ADDS(r3, r0) 3120 | lr = self.ADC(lr, r6) 3121 | r6 = self.LSRS(r4, 7) 3122 | r3 = self.LSRS(r4, 8) 3123 | r6 = r6 | self.check(r5) << 25 3124 | r3 = r3 | self.check(r5) << 24 3125 | r3 = int(self.EORS(r3, r6)) 3126 | r6 = self.LSRS(r5, 1) 3127 | r0 = int(self.RRX(r4)) 3128 | r0 = int(self.EORS(r0, r3)) 3129 | r3 = r6 | self.check(r4) << 31 3130 | r6 = self.LSRS(r5, 8) 3131 | r0 = int(self.ADDS(r0, r8)) 3132 | r6 = r6 | self.check(r4) << 24 3133 | r8 = r4 3134 | r6 = r6 ^ self.check(r5) >> 7 3135 | r3 = r3 ^ r6 3136 | r6 = r5 3137 | 3138 | r3 = self.ADC(r3, lr) 3139 | param_list = param_list + [r3, r0] 3140 | 3141 | return param_list # WORKED 3142 | 3143 | def hex_30A(self, param_list, list_3B8): 3144 | v_3A0 = param_list[7] 3145 | v_3A4 = param_list[6] 3146 | v_374 = param_list[5] 3147 | v_378 = param_list[4] 3148 | LR = param_list[0] 3149 | R12 = param_list[1] 3150 | v_39C = param_list[2] 3151 | v_398 = param_list[3] 3152 | v_3AC = param_list[11] 3153 | v_3A8 = param_list[10] 3154 | R9 = param_list[12] 3155 | R10 = param_list[13] 3156 | R5 = param_list[9] 3157 | R8 = param_list[8] 3158 | R4 = param_list[15] 3159 | R6 = param_list[14] 3160 | for index in range(10): 3161 | v_384 = R5 3162 | R3 = self.rodata[0x10 * index] 3163 | R1 = self.rodata[0x10 * index + 2] 3164 | R2 = self.rodata[0x10 * index + 1] 3165 | R3 = self.ADDS(R3, R6) 3166 | 3167 | R6 = self.check(R8) >> 14 3168 | 3169 | v_390 = R1 3170 | R6 = R6 | self.check(R5) << 18 3171 | 3172 | R1 = self.rodata[0x10 * index + 3] 3173 | R0 = self.rodata[0x10 * index + 4] 3174 | v_36C = R0 3175 | R0 = self.ADC(R2, R4) 3176 | R2 = self.LSRS(R5, 0x12) 3177 | R4 = self.LSRS(R5, 0xE) 3178 | R2 = R2 | self.check(R8) << 14 3179 | R4 = R4 | self.check(R8) << 18 3180 | R2 = self.EORS(R2, R4) 3181 | R4 = self.LSLS(R5, 0x17) 3182 | R4 = R4 | self.check(R8) >> 9 3183 | v_38C = R1 3184 | R2 = self.EORS(R2, R4) 3185 | R4 = self.check(R8) >> 18 3186 | R4 = R4 | self.check(R5) << 14 3187 | R6 = self.EORS(R6, R4) 3188 | R4 = self.LSRS(R5, 9) 3189 | R4 = R4 | self.check(R8) << 23 3190 | v_354 = R8 3191 | R6 = self.EORS(R6, R4) 3192 | R3 = self.ADDS(R3, R6) 3193 | R0 = self.ADCS(R0, R2) 3194 | R2 = list_3B8[0x10 * index + 1] 3195 | R2 = self.ADDS(R2, R3) 3196 | R3 = list_3B8[0x10 * index + 3] 3197 | R6 = list_3B8[0x10 * index] 3198 | v_358 = R10 3199 | R6 = self.ADCS(R6, R0) 3200 | R0 = v_3AC 3201 | v_360 = R3 3202 | R0 = R0 ^ R10 3203 | R3 = list_3B8[0x10 * index + 2] 3204 | R0 = self.ANDS(R0, R5) 3205 | R1 = list_3B8[0x10 * index + 5] 3206 | R4 = R0 ^ R10 3207 | R0 = v_3A8 3208 | v_364 = R1 3209 | R0 = R0 ^ R9 3210 | R1 = v_374 3211 | R0 = R0 & R8 3212 | R8 = v_39C 3213 | R0 = R0 ^ R9 3214 | v_35C = R3 3215 | R10 = self.ADDS(R2, R0) 3216 | R0 = v_398 3217 | R11 = self.ADC(R6, R4) 3218 | R3 = v_378 3219 | R2 = R0 | R12 3220 | R6 = R0 & R12 3221 | R2 = self.ANDS(R2, R1) 3222 | R1 = R0 3223 | R2 = self.ORRS(R2, R6) 3224 | R6 = R8 | LR 3225 | R6 = self.ANDS(R6, R3) 3226 | R3 = R8 & LR 3227 | R3 = self.ORRS(R3, R6) 3228 | R6 = self.check(R12) << 30 3229 | R0 = self.check(R12) >> 28 3230 | R6 = R6 | self.check(LR) >> 2 3231 | R0 = R0 | self.check(LR) << 4 3232 | R4 = self.check(LR) >> 28 3233 | R0 = self.EORS(R0, R6) 3234 | R6 = self.check(R12) << 25 3235 | R6 = R6 | self.check(LR) >> 7 3236 | R4 = R4 | self.check(R12) << 4 3237 | R0 = self.EORS(R0, R6) 3238 | R6 = self.check(R12) >> 2 3239 | R6 = R6 | self.check(LR) << 30 3240 | R3 = self.ADDS(R3, R10) 3241 | R6 = R6 ^ R4 3242 | R4 = self.check(R12) >> 7 3243 | R4 = R4 | self.check(LR) << 25 3244 | R2 = self.ADC(R2, R11) 3245 | R6 = self.EORS(R6, R4) 3246 | v_37C = R12 3247 | R5 = self.ADDS(R3, R6) 3248 | R6 = self.ADC(R2, R0) 3249 | R0 = R6 | R12 3250 | R2 = R6 & R12 3251 | R0 = self.ANDS(R0, R1) 3252 | R3 = self.LSRS(R6, 0x1C) 3253 | R0 = self.ORRS(R0, R2) 3254 | R2 = self.LSLS(R6, 0x1E) 3255 | R2 = R2 | self.check(R5) >> 2 3256 | R3 = R3 | self.check(R5) << 4 3257 | R2 = self.EORS(R2, R3) 3258 | R3 = self.LSLS(R6, 0x19) 3259 | R3 = R3 | self.check(R5) >> 7 3260 | R4 = self.LSRS(R5, 0x1C) 3261 | R3 = self.EORS(R3, R2) 3262 | R2 = self.LSRS(R6, 2) 3263 | R2 = R2 | self.check(R5) << 30 3264 | R4 = R4 | self.check(R6) << 4 3265 | R2 = self.EORS(R2, R4) 3266 | R4 = self.LSRS(R6, 7) 3267 | R4 = R4 | self.check(R5) << 25 3268 | R12 = R6 3269 | R2 = self.EORS(R2, R4) 3270 | R4 = R5 | LR 3271 | R4 = R4 & R8 3272 | R6 = R5 & LR 3273 | R4 = self.ORRS(R4, R6) 3274 | v_388 = R5 3275 | R5 = self.ADDS(R2, R4) 3276 | R0 = self.ADCS(R0, R3) 3277 | v_398 = R1 3278 | R4 = R9 3279 | v_350 = R0 3280 | R0 = v_3A4 3281 | R1 = v_3A0 3282 | v_380 = LR 3283 | LR = self.ADDS(R0, R10) 3284 | R9 = self.ADC(R1, R11) 3285 | R0 = v_3AC 3286 | R6 = self.check(LR) >> 14 3287 | R1 = v_384 3288 | R3 = self.check(R9) >> 18 3289 | R2 = self.check(R9) >> 14 3290 | R3 = R3 | self.check(LR) << 14 3291 | R2 = R2 | self.check(LR) << 18 3292 | R2 = self.EORS(R2, R3) 3293 | R3 = self.check(R9) << 23 3294 | R3 = R3 | self.check(LR) >> 9 3295 | R6 = R6 | self.check(R9) << 18 3296 | R2 = self.EORS(R2, R3) 3297 | R3 = self.check(LR) >> 18 3298 | R3 = R3 | self.check(R9) << 14 3299 | v_39C = R8 3300 | R3 = self.EORS(R3, R6) 3301 | R6 = self.check(R9) >> 9 3302 | R6 = R6 | self.check(LR) << 23 3303 | R8 = v_354 3304 | R3 = self.EORS(R3, R6) 3305 | R6 = R0 ^ R1 3306 | R6 = R6 & R9 3307 | v_370 = R12 3308 | R6 = self.EORS(R6, R0) 3309 | R0 = v_3A8 3310 | R1 = R0 ^ R8 3311 | R1 = R1 & LR 3312 | R1 = self.EORS(R1, R0) 3313 | R0 = v_358 3314 | R1 = self.ADDS(R1, R4) 3315 | R6 = self.ADCS(R6, R0) 3316 | R0 = v_390 3317 | R1 = self.ADDS(R1, R0) 3318 | R0 = v_38C 3319 | R6 = self.ADCS(R6, R0) 3320 | R0 = v_360 3321 | R1 = self.ADDS(R1, R0) 3322 | R0 = v_35C 3323 | R6 = self.ADCS(R6, R0) 3324 | R1 = self.ADDS(R1, R3) 3325 | R3 = self.ADC(R6, R2) 3326 | R2 = v_350 3327 | R0 = self.ADDS(R5, R1) 3328 | R5 = v_37C 3329 | R4 = self.ADC(R2, R3) 3330 | v_390 = R4 3331 | R2 = R4 | R12 3332 | R6 = R4 & R12 3333 | R2 = self.ANDS(R2, R5) 3334 | R5 = self.LSRS(R4, 0x1C) 3335 | R10 = R2 | R6 3336 | R2 = self.LSLS(R4, 0x1E) 3337 | R2 = R2 | self.check(R0) >> 2 3338 | R5 = R5 | self.check(R0) << 4 3339 | R2 = self.EORS(R2, R5) 3340 | R5 = self.LSLS(R4, 0x19) 3341 | R5 = R5 | self.check(R0) >> 7 3342 | R6 = self.LSRS(R0, 0x1C) 3343 | R12 = R2 ^ R5 3344 | R2 = self.LSRS(R4, 2) 3345 | R2 = R2 | self.check(R0) << 30 3346 | R6 = R6 | self.check(R4) << 4 3347 | R2 = self.EORS(R2, R6) 3348 | R6 = self.LSRS(R4, 7) 3349 | R4 = v_388 3350 | R6 = R6 | self.check(R0) << 25 3351 | R5 = v_380 3352 | R2 = self.EORS(R2, R6) 3353 | R6 = R0 | R4 3354 | R4 = self.ANDS(R4, R0) 3355 | R6 = self.ANDS(R6, R5) 3356 | v_38C = R0 3357 | R4 = self.ORRS(R4, R6) 3358 | R6 = LR ^ R8 3359 | R0 = self.ADDS(R2, R4) 3360 | v_3A4 = R0 3361 | R0 = self.ADC(R12, R10) 3362 | v_3A0 = R0 3363 | R0 = v_378 3364 | R10 = self.ADDS(R1, R0) 3365 | R0 = v_374 3366 | R6 = R6 & R10 3367 | R1 = self.ADC(R3, R0) 3368 | R5 = self.check(R10) >> 14 3369 | R0 = v_384 3370 | R6 = R6 ^ R8 3371 | R3 = self.LSRS(R1, 0x12) 3372 | R4 = self.LSRS(R1, 0xE) 3373 | R3 = R3 | self.check(R10) << 14 3374 | R4 = R4 | self.check(R10) << 18 3375 | R3 = self.EORS(R3, R4) 3376 | R4 = self.LSLS(R1, 0x17) 3377 | R4 = R4 | self.check(R10) >> 9 3378 | R5 = R5 | self.check(R1) << 18 3379 | R11 = R3 ^ R4 3380 | R3 = self.check(R10) >> 18 3381 | R3 = R3 | self.check(R1) << 14 3382 | v_378 = R1 3383 | R3 = self.EORS(R3, R5) 3384 | R5 = self.LSRS(R1, 9) 3385 | R5 = R5 | self.check(R10) << 23 3386 | R3 = self.EORS(R3, R5) 3387 | R5 = R9 ^ R0 3388 | R5 = self.ANDS(R5, R1) 3389 | R1 = v_3A8 3390 | R5 = self.EORS(R5, R0) 3391 | R0 = v_36C 3392 | R4 = self.ADDS(R0, R1) 3393 | R2 = self.rodata[0x10 * index + 5] 3394 | R0 = v_3AC 3395 | R2 = self.ADCS(R2, R0) 3396 | R0 = v_364 3397 | R4 = self.ADDS(R4, R0) 3398 | R12 = list_3B8[0x10 * index + 4] 3399 | R0 = v_3A4 3400 | R2 = self.ADC(R2, R12) 3401 | R6 = self.ADDS(R6, R4) 3402 | R2 = self.ADCS(R2, R5) 3403 | R3 = self.ADDS(R3, R6) 3404 | R11 = self.ADC(R11, R2) 3405 | R1 = self.ADDS(R0, R3) 3406 | R0 = v_3A0 3407 | R6 = v_390 3408 | R4 = self.check(R1) >> 28 3409 | R0 = self.ADC(R0, R11) 3410 | R5 = v_370 3411 | R2 = R0 | R6 3412 | R6 = self.ANDS(R6, R0) 3413 | R2 = self.ANDS(R2, R5) 3414 | R5 = self.LSRS(R0, 0x1C) 3415 | R12 = R2 | R6 3416 | R6 = self.LSLS(R0, 0x1E) 3417 | R6 = R6 | self.check(R1) >> 2 3418 | R5 = R5 | self.check(R1) << 4 3419 | R6 = self.EORS(R6, R5) 3420 | R5 = self.LSLS(R0, 0x19) 3421 | R5 = R5 | self.check(R1) >> 7 3422 | R4 = R4 | self.check(R0) << 4 3423 | R6 = self.EORS(R6, R5) 3424 | R5 = self.LSRS(R0, 2) 3425 | R5 = R5 | self.check(R1) << 30 3426 | v_3AC = R0 3427 | R5 = self.EORS(R5, R4) 3428 | R4 = self.LSRS(R0, 7) 3429 | R0 = v_38C 3430 | R4 = R4 | self.check(R1) << 25 3431 | R2 = v_388 3432 | R5 = self.EORS(R5, R4) 3433 | R4 = R1 | R0 3434 | v_3A8 = R1 3435 | R4 = self.ANDS(R4, R2) 3436 | R2 = R1 & R0 3437 | R2 = self.ORRS(R2, R4) 3438 | R0 = self.ADDS(R5, R2) 3439 | v_3A4 = R0 3440 | R0 = self.ADC(R6, R12) 3441 | v_3A0 = R0 3442 | R0 = v_39C 3443 | R2 = v_398 3444 | R0 = self.ADDS(R0, R3) 3445 | v_39C = R0 3446 | R11 = self.ADC(R11, R2) 3447 | R4 = self.LSRS(R0, 0xE) 3448 | R3 = self.check(R11) >> 18 3449 | R6 = self.check(R11) >> 14 3450 | R3 = R3 | self.check(R0) << 14 3451 | R6 = R6 | self.check(R0) << 18 3452 | R3 = self.EORS(R3, R6) 3453 | R6 = self.check(R11) << 23 3454 | R6 = R6 | self.check(R0) >> 9 3455 | R4 = R4 | self.check(R11) << 18 3456 | R1 = self.EORS(R3, R6) 3457 | R6 = self.LSRS(R0, 0x12) 3458 | R6 = R6 | self.check(R11) << 14 3459 | R3 = R10 ^ LR 3460 | R6 = self.EORS(R6, R4) 3461 | R4 = self.check(R11) >> 9 3462 | R3 = self.ANDS(R3, R0) 3463 | R4 = R4 | self.check(R0) << 23 3464 | R5 = R6 ^ R4 3465 | v_398 = R1 3466 | R3 = R3 ^ LR 3467 | R1 = v_378 3468 | R6 = self.rodata[0x10 * index + 6] 3469 | R12 = self.rodata[0x10 * index + 7] 3470 | R4 = R1 ^ R9 3471 | R0 = v_384 3472 | R6 = self.ADDS(R6, R8) 3473 | R4 = R4 & R11 3474 | R12 = self.ADC(R12, R0) 3475 | R4 = R4 ^ R9 3476 | R8 = list_3B8[0x10 * index + 7] 3477 | R2 = list_3B8[0x10 * index + 6] 3478 | R6 = self.ADDS(R6, R8) 3479 | R0 = v_398 3480 | R2 = self.ADC(R2, R12) 3481 | R3 = self.ADDS(R3, R6) 3482 | R2 = self.ADCS(R2, R4) 3483 | R6 = self.ADDS(R3, R5) 3484 | R12 = self.ADC(R2, R0) 3485 | R0 = v_3A4 3486 | R4 = v_390 3487 | R1 = self.ADDS(R0, R6) 3488 | R0 = v_3A0 3489 | v_384 = R1 3490 | R5 = self.ADC(R0, R12) 3491 | R0 = v_3AC 3492 | R8 = self.check(R1) >> 28 3493 | R2 = R5 | R0 3494 | R3 = R8 | self.check(R5) << 4 3495 | R2 = self.ANDS(R2, R4) 3496 | R4 = R5 & R0 3497 | R0 = R2 | R4 3498 | R4 = self.LSLS(R5, 0x1E) 3499 | R2 = self.LSRS(R5, 0x1C) 3500 | R4 = R4 | self.check(R1) >> 2 3501 | R2 = R2 | self.check(R1) << 4 3502 | v_3A0 = R0 3503 | R2 = self.EORS(R2, R4) 3504 | R4 = self.LSLS(R5, 0x19) 3505 | R4 = R4 | self.check(R1) >> 7 3506 | R0 = v_3A8 3507 | R2 = self.EORS(R2, R4) 3508 | R4 = self.LSRS(R5, 2) 3509 | R4 = R4 | self.check(R1) << 30 3510 | R8 = R5 3511 | R3 = self.EORS(R3, R4) 3512 | R4 = self.LSRS(R5, 7) 3513 | R4 = R4 | self.check(R1) << 25 3514 | R5 = v_38C 3515 | R3 = self.EORS(R3, R4) 3516 | R4 = R1 | R0 3517 | R4 = self.ANDS(R4, R5) 3518 | R5 = R1 & R0 3519 | R4 = self.ORRS(R4, R5) 3520 | v_36C = R8 3521 | R0 = self.ADDS(R3, R4) 3522 | v_3A4 = R0 3523 | R0 = v_3A0 3524 | R0 = self.ADCS(R0, R2) 3525 | v_3A0 = R0 3526 | R0 = v_380 3527 | R2 = v_37C 3528 | R0 = self.ADDS(R0, R6) 3529 | R5 = self.ADC(R12, R2) 3530 | v_37C = R5 3531 | R4 = self.LSRS(R0, 0xE) 3532 | v_380 = R0 3533 | R2 = self.LSRS(R5, 0x12) 3534 | R3 = self.LSRS(R5, 0xE) 3535 | R2 = R2 | self.check(R0) << 14 3536 | R3 = R3 | self.check(R0) << 18 3537 | R2 = self.EORS(R2, R3) 3538 | R3 = self.LSLS(R5, 0x17) 3539 | R3 = R3 | self.check(R0) >> 9 3540 | R4 = R4 | self.check(R5) << 18 3541 | R1 = R2 ^ R3 3542 | R3 = self.LSRS(R0, 0x12) 3543 | R3 = R3 | self.check(R5) << 14 3544 | v_398 = R1 3545 | R3 = self.EORS(R3, R4) 3546 | R4 = self.LSRS(R5, 9) 3547 | R1 = v_378 3548 | R4 = R4 | self.check(R0) << 23 3549 | R12 = R3 ^ R4 3550 | R3 = list_3B8[0x10 * index + 9] 3551 | R4 = R11 ^ R1 3552 | R4 = self.ANDS(R4, R5) 3553 | R4 = self.EORS(R4, R1) 3554 | R1 = v_39C 3555 | R5 = R1 ^ R10 3556 | R5 = self.ANDS(R5, R0) 3557 | R5 = R5 ^ R10 3558 | R2 = self.rodata[0x10 * index + 8] 3559 | R0 = self.ADDS(R2, LR) 3560 | R2 = self.rodata[0x10 * index + 9] 3561 | R2 = self.ADC(R2, R9) 3562 | R0 = self.ADDS(R0, R3) 3563 | R3 = list_3B8[0x10 * index + 8] 3564 | R2 = self.ADCS(R2, R3) 3565 | R0 = self.ADDS(R0, R5) 3566 | R2 = self.ADCS(R2, R4) 3567 | R1 = self.ADDS(R0, R12) 3568 | R0 = v_398 3569 | R3 = v_3AC 3570 | R4 = self.ADC(R2, R0) 3571 | R0 = v_3A4 3572 | R6 = self.ADDS(R0, R1) 3573 | R0 = v_3A0 3574 | v_3A4 = R6 3575 | R0 = self.ADCS(R0, R4) 3576 | v_3A0 = R0 3577 | R2 = R0 | R8 3578 | R2 = self.ANDS(R2, R3) 3579 | R3 = R0 & R8 3580 | LR = R2 | R3 3581 | R8 = R6 3582 | R3 = self.LSLS(R0, 0x1E) 3583 | R5 = self.LSRS(R0, 0x1C) 3584 | R3 = R3 | self.check(R8) >> 2 3585 | R5 = R5 | self.check(R8) << 4 3586 | R3 = self.EORS(R3, R5) 3587 | R5 = self.LSLS(R0, 0x19) 3588 | R5 = R5 | self.check(R8) >> 7 3589 | R2 = self.check(R8) >> 28 3590 | R12 = R3 ^ R5 3591 | R5 = self.LSRS(R0, 2) 3592 | R5 = R5 | self.check(R8) << 30 3593 | R2 = R2 | self.check(R0) << 4 3594 | R2 = self.EORS(R2, R5) 3595 | R5 = self.LSRS(R0, 7) 3596 | R3 = v_384 3597 | R5 = R5 | self.check(R8) << 25 3598 | R6 = v_3A8 3599 | R2 = self.EORS(R2, R5) 3600 | R5 = R8 | R3 3601 | R5 = self.ANDS(R5, R6) 3602 | R6 = R8 & R3 3603 | R5 = self.ORRS(R5, R6) 3604 | R0 = self.ADDS(R2, R5) 3605 | v_398 = R0 3606 | R2 = v_388 3607 | R12 = self.ADC(R12, LR) 3608 | R0 = v_370 3609 | R3 = self.ADDS(R1, R2) 3610 | R1 = v_380 3611 | R8 = self.ADC(R4, R0) 3612 | R0 = R3 3613 | R2 = self.check(R8) >> 18 3614 | R3 = self.check(R8) >> 14 3615 | R2 = R2 | self.check(R0) << 14 3616 | R3 = R3 | self.check(R0) << 18 3617 | R2 = self.EORS(R2, R3) 3618 | R3 = self.check(R8) << 23 3619 | R3 = R3 | self.check(R0) >> 9 3620 | R4 = self.LSRS(R0, 0xE) 3621 | LR = R2 ^ R3 3622 | R3 = self.LSRS(R0, 0x12) 3623 | R3 = R3 | self.check(R8) << 14 3624 | R4 = R4 | self.check(R8) << 18 3625 | R3 = self.EORS(R3, R4) 3626 | R4 = self.check(R8) >> 9 3627 | R4 = R4 | self.check(R0) << 23 3628 | R2 = R0 3629 | R0 = v_37C 3630 | R3 = self.EORS(R3, R4) 3631 | v_388 = R2 3632 | R4 = R0 ^ R11 3633 | R0 = v_39C 3634 | R4 = R4 & R8 3635 | R5 = R1 ^ R0 3636 | R4 = R4 ^ R11 3637 | R5 = self.ANDS(R5, R2) 3638 | R5 = self.EORS(R5, R0) 3639 | R6 = self.rodata[0x10 * index + 10] 3640 | R1 = self.ADDS(R6, R10) 3641 | R6 = self.rodata[0x10 * index + 11] 3642 | R0 = v_378 3643 | R6 = self.ADCS(R6, R0) 3644 | R2 = list_3B8[0x10 * index + 11] 3645 | R1 = self.ADDS(R1, R2) 3646 | R2 = list_3B8[0x10 * index + 10] 3647 | R0 = v_398 3648 | R2 = self.ADCS(R2, R6) 3649 | R1 = self.ADDS(R1, R5) 3650 | R2 = self.ADCS(R2, R4) 3651 | R1 = self.ADDS(R1, R3) 3652 | R4 = self.ADC(R2, LR) 3653 | R6 = v_3A0 3654 | R0 = self.ADDS(R0, R1) 3655 | R9 = self.ADC(R12, R4) 3656 | R3 = v_36C 3657 | R2 = R9 | R6 3658 | R5 = self.check(R9) >> 28 3659 | v_374 = R9 3660 | R2 = self.ANDS(R2, R3) 3661 | R3 = R9 & R6 3662 | R10 = R2 | R3 3663 | R3 = self.check(R9) << 30 3664 | R3 = R3 | self.check(R0) >> 2 3665 | R5 = R5 | self.check(R0) << 4 3666 | R3 = self.EORS(R3, R5) 3667 | R5 = self.check(R9) << 25 3668 | R5 = R5 | self.check(R0) >> 7 3669 | R6 = self.LSRS(R0, 0x1C) 3670 | R12 = R3 ^ R5 3671 | R5 = self.check(R9) >> 2 3672 | R5 = R5 | self.check(R0) << 30 3673 | R6 = R6 | self.check(R9) << 4 3674 | R5 = self.EORS(R5, R6) 3675 | R6 = self.check(R9) >> 7 3676 | R3 = v_3A4 3677 | R6 = R6 | self.check(R0) << 25 3678 | R2 = v_384 3679 | R5 = self.EORS(R5, R6) 3680 | R6 = R0 | R3 3681 | R6 = self.ANDS(R6, R2) 3682 | R2 = R0 & R3 3683 | R2 = R2 | R6 3684 | R2 = self.ADDS(R2, R5) 3685 | v_398 = R2 3686 | R2 = self.ADC(R12, R10) 3687 | v_378 = R2 3688 | R2 = v_38C 3689 | R12 = self.ADDS(R1, R2) 3690 | R1 = v_390 3691 | LR = self.ADC(R4, R1) 3692 | R4 = self.check(R12) >> 14 3693 | R1 = self.check(LR) >> 18 3694 | R2 = self.check(LR) >> 14 3695 | R1 = R1 | self.check(R12) << 14 3696 | R2 = R2 | self.check(R12) << 18 3697 | R1 = self.EORS(R1, R2) 3698 | R2 = self.check(LR) << 23 3699 | R2 = R2 | self.check(R12) >> 9 3700 | R4 = R4 | self.check(LR) << 18 3701 | R1 = self.EORS(R1, R2) 3702 | R2 = self.check(R12) >> 18 3703 | R2 = R2 | self.check(LR) << 14 3704 | v_390 = R1 3705 | R2 = self.EORS(R2, R4) 3706 | R4 = self.check(LR) >> 9 3707 | R1 = v_37C 3708 | R4 = R4 | self.check(R12) << 23 3709 | R10 = R2 ^ R4 3710 | R2 = v_388 3711 | R4 = R8 ^ R1 3712 | R4 = R4 & LR 3713 | R4 = self.EORS(R4, R1) 3714 | R1 = v_380 3715 | R5 = R2 ^ R1 3716 | R2 = v_39C 3717 | R5 = R5 & R12 3718 | R5 = self.EORS(R5, R1) 3719 | R6 = self.rodata[0x10 * index + 12] 3720 | R3 = self.rodata[0x10 * index + 13] 3721 | R6 = self.ADDS(R6, R2) 3722 | R3 = self.ADC(R3, R11) 3723 | R1 = list_3B8[0x10 * index + 13] 3724 | R1 = self.ADDS(R1, R6) 3725 | R6 = list_3B8[0x10 * index + 12] 3726 | R3 = self.ADCS(R3, R6) 3727 | R1 = self.ADDS(R1, R5) 3728 | R3 = self.ADCS(R3, R4) 3729 | R5 = self.ADDS(R1, R10) 3730 | R1 = v_390 3731 | R2 = self.ADC(R3, R1) 3732 | R1 = v_398 3733 | R3 = v_3A0 3734 | R10 = self.ADDS(R1, R5) 3735 | R1 = v_378 3736 | v_378 = R0 3737 | R11 = self.ADC(R1, R2) 3738 | R6 = self.check(R10) >> 28 3739 | R1 = R11 | R9 3740 | v_398 = R11 3741 | R1 = self.ANDS(R1, R3) 3742 | R3 = R11 & R9 3743 | R9 = R1 | R3 3744 | R3 = self.check(R11) << 30 3745 | R4 = self.check(R11) >> 28 3746 | R3 = R3 | self.check(R10) >> 2 3747 | R4 = R4 | self.check(R10) << 4 3748 | R6 = R6 | self.check(R11) << 4 3749 | R3 = self.EORS(R3, R4) 3750 | R4 = self.check(R11) << 25 3751 | R4 = R4 | self.check(R10) >> 7 3752 | R1 = v_3A4 3753 | R3 = self.EORS(R3, R4) 3754 | R4 = self.check(R11) >> 2 3755 | R4 = R4 | self.check(R10) << 30 3756 | v_39C = R10 3757 | R4 = self.EORS(R4, R6) 3758 | R6 = self.check(R11) >> 7 3759 | R6 = R6 | self.check(R10) << 25 3760 | R4 = self.EORS(R4, R6) 3761 | R6 = R10 | R0 3762 | R6 = self.ANDS(R6, R1) 3763 | R1 = R10 & R0 3764 | R1 = self.ORRS(R1, R6) 3765 | R10 = LR 3766 | R0 = self.ADDS(R4, R1) 3767 | v_390 = R0 3768 | R0 = self.ADC(R3, R9) 3769 | v_38C = R0 3770 | R0 = v_3A8 3771 | R9 = R12 3772 | R4 = self.ADDS(R5, R0) 3773 | R0 = v_3AC 3774 | v_3A8 = R4 3775 | R0 = self.ADCS(R0, R2) 3776 | R3 = self.LSRS(R4, 0xE) 3777 | v_3AC = R0 3778 | R1 = self.LSRS(R0, 0x12) 3779 | R2 = self.LSRS(R0, 0xE) 3780 | R1 = R1 | self.check(R4) << 14 3781 | R2 = R2 | self.check(R4) << 18 3782 | R1 = self.EORS(R1, R2) 3783 | R2 = self.LSLS(R0, 0x17) 3784 | R2 = R2 | self.check(R4) >> 9 3785 | R3 = R3 | self.check(R0) << 18 3786 | R11 = R1 ^ R2 3787 | R2 = self.LSRS(R4, 0x12) 3788 | R2 = R2 | self.check(R0) << 14 3789 | R2 = self.EORS(R2, R3) 3790 | R3 = self.LSRS(R0, 9) 3791 | R3 = R3 | self.check(R4) << 23 3792 | R2 = self.EORS(R2, R3) 3793 | R3 = LR ^ R8 3794 | R3 = self.ANDS(R3, R0) 3795 | R0 = v_388 3796 | LR = R3 ^ R8 3797 | R5 = R12 ^ R0 3798 | R5 = self.ANDS(R5, R4) 3799 | R3 = R0 3800 | R5 = self.EORS(R5, R0) 3801 | R4 = self.rodata[0x10 * index + 14] 3802 | R6 = self.rodata[0x10 * index + 15] 3803 | R0 = v_380 3804 | R4 = self.ADDS(R4, R0) 3805 | R0 = v_37C 3806 | R6 = self.ADCS(R6, R0) 3807 | R0 = list_3B8[0x10 * index + 14] 3808 | R1 = list_3B8[0x10 * index + 15] 3809 | R1 = self.ADDS(R1, R4) 3810 | R0 = self.ADCS(R0, R6) 3811 | R1 = self.ADDS(R1, R5) 3812 | R0 = self.ADC(R0, LR) 3813 | R1 = self.ADDS(R1, R2) 3814 | R2 = v_390 3815 | R0 = self.ADC(R0, R11) 3816 | R4 = R8 3817 | LR = self.ADDS(R2, R1) 3818 | R2 = v_38C 3819 | R6 = R3 3820 | R12 = self.ADC(R2, R0) 3821 | R2 = v_384 3822 | R8 = self.ADDS(R1, R2) 3823 | R2 = v_36C 3824 | R5 = self.ADC(R0, R2) 3825 | 3826 | list_638 = [ 3827 | self.check(LR), 3828 | self.check(R12), 3829 | self.check(v_39C), 3830 | self.check(v_398), 3831 | self.check(v_378), 3832 | self.check(v_374), 3833 | self.check(v_3A4), 3834 | self.check(v_3A0), 3835 | self.check(R8), 3836 | self.check(R5), 3837 | self.check(v_3A8), 3838 | self.check(v_3AC), 3839 | self.check(R9), 3840 | self.check(R10), 3841 | self.check(R6), 3842 | self.check(R4), 3843 | ] 3844 | 3845 | for i in range(8): 3846 | R0 = param_list[2 * i] 3847 | R1 = param_list[2 * i + 1] 3848 | R0 = self.ADDS(R0, list_638[2 * i]) 3849 | R1 = self.ADCS(R1, list_638[2 * i + 1]) 3850 | param_list[2 * i] = R0 3851 | param_list[2 * i + 1] = R1 3852 | return param_list 3853 | 3854 | def hex_C52(self, list_6B0): 3855 | list_8D8 = [] 3856 | for i in range(8): 3857 | tmp = self.hex_list([list_6B0[2 * i + 1], list_6B0[2 * i]]) 3858 | list_8D8 = list_8D8 + tmp 3859 | return list_8D8 3860 | 3861 | def toHex(self, num): 3862 | return format(int(num), "x") 3863 | 3864 | def check(self, tmp): 3865 | ss = "" 3866 | if tmp < 0: 3867 | ss = self.toHex(4294967296 + int(tmp)) 3868 | else: 3869 | ss = self.toHex(tmp) 3870 | if len(ss) > 8: 3871 | size = len(ss) 3872 | start = size - 8 3873 | ss = ss[start:] 3874 | tmp = int(self.parseLong(ss, 10, 16)) 3875 | return tmp # 3035769959 3876 | 3877 | def ADDS(self, a, b): 3878 | c = self.check(a) + self.check(b) 3879 | if len(self.toHex(c)) > 8: 3880 | self.CF = 1 3881 | else: 3882 | self.CF = 0 3883 | result = self.check(c) 3884 | return result 3885 | 3886 | def ANDS(self, a, b): 3887 | return self.check(a & b) 3888 | 3889 | def EORS(self, a, b): 3890 | return self.check(a ^ b) 3891 | 3892 | def ADC(self, a, b): 3893 | 3894 | c = self.check(a) + self.check(b) 3895 | d = self.check(c + self.CF) 3896 | return d 3897 | 3898 | def ADCS(self, a, b): 3899 | c = self.check(a) + self.check(b) 3900 | d = self.check(c + self.CF) 3901 | if len(self.toHex(c)) > 8: 3902 | self.CF = 1 3903 | else: 3904 | self.CF = 0 3905 | return d 3906 | 3907 | def LSLS(self, num, k): 3908 | result = self.bin_type(num) 3909 | self.CF = result[k - 1] 3910 | return self.check(self.check(num) << k) 3911 | 3912 | def LSRS(self, num, k): 3913 | result = self.bin_type(num) 3914 | self.CF = result[len(result) - k] 3915 | return self.check(self.check(num) >> k) 3916 | 3917 | def ORRS(self, a, b): 3918 | return self.check(a | b) 3919 | 3920 | def RRX(self, num): 3921 | result = self.bin_type(num) 3922 | lenght = len(result) 3923 | s = str(self.CF) + result[: lenght - 1 - 0] 3924 | return self.parseLong(s, 10, 2) 3925 | 3926 | def bin_type(self, num): 3927 | result = "" 3928 | num = self.check(num) 3929 | lst = self.toBinaryString(num) 3930 | for i in range(32): 3931 | if i < len(lst): 3932 | result += str(lst[i]) 3933 | else: 3934 | result = "0" + result 3935 | return result 3936 | 3937 | def UBFX(self, num, lsb, width): 3938 | tmp_string = self.toBinaryString(num) 3939 | while len(tmp_string) < 32: 3940 | tmp_string = "0" + tmp_string 3941 | lens = len(tmp_string) 3942 | start = lens - lsb - width 3943 | end = start - lsb 3944 | a = int(self.parseLong(tmp_string[start : end - start], 10, 2)) 3945 | 3946 | return int(self.parseLong(tmp_string[start : end - start], 10, 2)) 3947 | 3948 | def UFTX(self, num): 3949 | tmp_string = self.toBinaryString(num) 3950 | start = len(tmp_string) - 8 3951 | return self.parseLong(tmp_string[start:], 10, 2) 3952 | 3953 | def toBinaryString(self, num): 3954 | return "{0:b}".format(num) 3955 | 3956 | def setData(self, data): 3957 | self.__content_raw = data 3958 | self.__content = data 3959 | self.list_9C8 = self.hex_9C8() 3960 | 3961 | def hex_9C8(self): 3962 | result = [] 3963 | for i in range(32): 3964 | result.append(self.chooice(0, 0x100)) 3965 | return result 3966 | 3967 | def chooice(self, start, end): 3968 | return int(random.uniform(0, 1) * (end + 1 - start) + start) 3969 | 3970 | def s2b(self, data): 3971 | arr = [] 3972 | for i in range(len(data)): 3973 | arr.append(data[i]) 3974 | return arr 3975 | 3976 | def hex_list(self, content): 3977 | result = [] 3978 | for value in content: 3979 | tmp = self.toHex(value) 3980 | while len(tmp) < 8: 3981 | tmp = "0" + tmp 3982 | for i in range(4): 3983 | start = 2 * i 3984 | end = 2 * i + 2 3985 | ss = tmp[start:end] 3986 | result.append(int(self.parseLong(ss, 10, 16))) 3987 | return result 3988 | 3989 | def parseLong(self, num, to_base=10, from_base=10): 3990 | if isinstance(num, str): 3991 | n = int(num, from_base) 3992 | else: 3993 | n = int(num) 3994 | alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" 3995 | if n < to_base: 3996 | return alphabet[n] 3997 | else: 3998 | return self.parseLong(n // to_base, to_base) + alphabet[n % to_base] 3999 | 4000 | def byteArray2str(self, b): 4001 | return binascii.hexlify(bytes(b)).decode() 4002 | 4003 | def changeByteArrayToLong(self, bytes): 4004 | result = [] 4005 | for byte in bytes: 4006 | if byte < 0: 4007 | result.append(byte + 256) 4008 | else: 4009 | result.append(byte) 4010 | return result 4011 | -------------------------------------------------------------------------------- /Libs/xgorgon.py: -------------------------------------------------------------------------------- 1 | import hashlib 2 | import random 3 | import json 4 | import time 5 | 6 | 7 | class Gorgon: 8 | def __init__(self, params: str, data: str, cookies: str) -> None: 9 | 10 | self.params = params 11 | self.data = data 12 | self.cookies = cookies 13 | 14 | def hash(self, data: str) -> str: 15 | _hash = str(hashlib.md5(data.encode()).hexdigest()) 16 | 17 | return _hash 18 | 19 | def get_base_string(self) -> str: 20 | base_str = self.hash(self.params) 21 | base_str = ( 22 | base_str + self.hash(self.data) if self.data else base_str + str("0" * 32) 23 | ) 24 | base_str = ( 25 | base_str + self.hash(self.cookies) 26 | if self.cookies 27 | else base_str + str("0" * 32) 28 | ) 29 | 30 | return base_str 31 | 32 | def get_value(self) -> json: 33 | base_str = self.get_base_string() 34 | 35 | return self.encrypt(base_str) 36 | 37 | def encrypt(self, data: str) -> json: 38 | unix = int(time.time()) 39 | len = 0x14 40 | key = [ 41 | 0xDF, 42 | 0x77, 43 | 0xB9, 44 | 0x40, 45 | 0xB9, 46 | 0x9B, 47 | 0x84, 48 | 0x83, 49 | 0xD1, 50 | 0xB9, 51 | 0xCB, 52 | 0xD1, 53 | 0xF7, 54 | 0xC2, 55 | 0xB9, 56 | 0x85, 57 | 0xC3, 58 | 0xD0, 59 | 0xFB, 60 | 0xC3, 61 | ] 62 | 63 | param_list = [] 64 | 65 | for i in range(0, 12, 4): 66 | temp = data[8 * i : 8 * (i + 1)] 67 | for j in range(4): 68 | H = int(temp[j * 2 : (j + 1) * 2], 16) 69 | param_list.append(H) 70 | 71 | param_list.extend([0x0, 0x6, 0xB, 0x1C]) 72 | 73 | H = int(hex(unix), 16) 74 | 75 | param_list.append((H & 0xFF000000) >> 24) 76 | param_list.append((H & 0x00FF0000) >> 16) 77 | param_list.append((H & 0x0000FF00) >> 8) 78 | param_list.append((H & 0x000000FF) >> 0) 79 | 80 | eor_result_list = [] 81 | 82 | for A, B in zip(param_list, key): 83 | eor_result_list.append(A ^ B) 84 | 85 | for i in range(len): 86 | 87 | C = self.reverse(eor_result_list[i]) 88 | D = eor_result_list[(i + 1) % len] 89 | E = C ^ D 90 | 91 | F = self.rbit_algorithm(E) 92 | H = ((F ^ 0xFFFFFFFF) ^ len) & 0xFF 93 | eor_result_list[i] = H 94 | 95 | result = "" 96 | for param in eor_result_list: 97 | result += self.hex_string(param) 98 | 99 | return {"x-gorgon": ("0404b0d30000" + result), "x-khronos": str(unix)} 100 | 101 | def rbit_algorithm(self, num): 102 | result = "" 103 | tmp_string = bin(num)[2:] 104 | 105 | while len(tmp_string) < 8: 106 | tmp_string = "0" + tmp_string 107 | 108 | for i in range(0, 8): 109 | result = result + tmp_string[7 - i] 110 | 111 | return int(result, 2) 112 | 113 | def hex_string(self, num): 114 | tmp_string = hex(num)[2:] 115 | 116 | if len(tmp_string) < 2: 117 | tmp_string = "0" + tmp_string 118 | 119 | return tmp_string 120 | 121 | def reverse(self, num): 122 | tmp_string = self.hex_string(num) 123 | 124 | return int(tmp_string[1:] + tmp_string[:1], 16) 125 | 126 | 127 | class Xgorgon: 128 | digits = {c: i for i, c in enumerate("0123456789abcdefghijklmnopqrstuvwxyz")} 129 | HEX_STRS = [ 130 | [30, 0, 224, 220, 147, 69, 1, 200], 131 | [30, 0, 224, 236, 147, 69, 1, 200], 132 | [30, 0, 224, 228, 147, 69, 1, 208], 133 | [30, 60, 224, 244, 147, 69, 0, 216], 134 | [30, 64, 224, 228, 147, 69, 0, 216], 135 | [30, 0, 224, 227, 147, 69, 1, 213], 136 | [30, 64, 224, 210, 147, 69, 0, 160], 137 | [30, 64, 224, 203, 147, 69, 0, 150], 138 | [30, 64, 224, 211, 147, 69, 0, 167], 139 | [30, 64, 224, 228, 147, 69, 0, 156], 140 | [30, 64, 224, 216, 147, 69, 0, 216], 141 | [30, 64, 224, 226, 147, 69, 0, 205], 142 | [30, 64, 224, 214, 147, 69, 0, 176], 143 | [30, 64, 224, 217, 147, 69, 0, 180], 144 | [30, 64, 224, 240, 147, 69, 0, 213], 145 | [30, 64, 224, 210, 147, 69, 0, 216], 146 | [30, 64, 224, 235, 147, 69, 0, 192], 147 | [30, 64, 224, 234, 147, 69, 0, 193], 148 | [30, 64, 224, 234, 147, 69, 0, 186], 149 | [30, 64, 224, 171, 147, 69, 0, 136], 150 | [30, 64, 224, 103, 147, 69, 0, 166], 151 | [30, 64, 224, 167, 147, 69, 0, 15], 152 | [30, 64, 224, 139, 147, 69, 0, 182], 153 | [30, 64, 224, 194, 147, 69, 0, 84], 154 | [30, 64, 224, 183, 147, 69, 0, 170], 155 | [30, 64, 224, 205, 147, 69, 0, 125], 156 | [30, 64, 224, 138, 147, 69, 0, 175], 157 | [30, 64, 224, 229, 147, 69, 0, 12], 158 | [30, 64, 224, 163, 147, 69, 0, 26], 159 | [30, 64, 224, 105, 147, 69, 0, 35], 160 | [30, 64, 224, 167, 147, 69, 0, 24], 161 | ] 162 | LEN = 20 163 | 164 | def calculate( 165 | self, params: str, cookie: (bool or str) = None, body: (bool or str) = None # type: ignore 166 | ): 167 | 168 | self.hex_str = random.choice(self.HEX_STRS) 169 | hash = self.getGorgonHash(params, body, cookie) 170 | hexEncryption = self.encryption() 171 | gorgonHash = self.__init_hash(hash, hexEncryption) 172 | 173 | result = "" 174 | handle = self.__handle(gorgonHash["gorgon"]) 175 | 176 | for item in handle: 177 | result += self.__hex2str(item) 178 | 179 | hash_1 = self.__hex2str(self.hex_str[7]) 180 | hash_2 = self.__hex2str(self.hex_str[3]) 181 | hash_3 = self.__hex2str(self.hex_str[1]) 182 | hash_4 = self.__hex2str(self.hex_str[6]) 183 | 184 | return { 185 | "x-gorgon": "0404{}{}{}{}{}".format(hash_1, hash_2, hash_3, hash_4, result), 186 | "x-khronos": str(hash["time"]), 187 | } 188 | 189 | def charCodeAt(self, str, i): 190 | return self.get_bianma((str[i:1])) 191 | 192 | def encryption(self): 193 | tmp = A = B = C = D = None 194 | hexs = [] 195 | for i in range(256): 196 | hexs.append(i) 197 | 198 | for i in range(256): 199 | if i == 0: 200 | A = 0 201 | elif tmp is not None: 202 | A = tmp 203 | else: 204 | A = hexs[i - 1] 205 | B = self.hex_str[i % 8] 206 | if (A == 85) & (i != 1) & (tmp != 85): 207 | A = 0 208 | C = self.ensureMax(A + i + B) 209 | tmp = C if C < i else None 210 | D = hexs[C] 211 | hexs[i] = D 212 | return hexs 213 | 214 | def ensureMax(self, val, max=256): 215 | while val >= 256: 216 | val = val - 256 217 | return val 218 | 219 | def epoch(self): 220 | return int(round(time.time())) 221 | 222 | def convert_base(self, hex, base): 223 | return sum( 224 | self.digits[digit] * (base**i) 225 | for i, digit in enumerate(reversed(hex.lower())) 226 | ) 227 | 228 | def fromHex(self, hex): 229 | return self.convert_base(hex, int(16)) 230 | 231 | def getGorgonHash( 232 | self, 233 | url: str, 234 | data: (bool or str) = None, # type: ignore 235 | cookie: (bool or str) = None, # type: ignore 236 | encoding="UTF-8", 237 | ): 238 | gorgon = [] 239 | times = int(round(time.time())) 240 | hexTime = self.__to_hex(times) 241 | urlmd5 = hashlib.md5(url.encode("UTF-8")).hexdigest() 242 | 243 | rang = self.__ranges(start=4) 244 | for i in rang: 245 | gorgon.append(self.fromHex(urlmd5[i * 2 : 2 * i + 2])) 246 | 247 | gorgon = gorgon + self.__xgorgon_data(data, encoding) 248 | gorgon = gorgon + self.__xgorgon_cookie(cookie, encoding) 249 | 250 | for i in rang: 251 | gorgon.append(0) 252 | 253 | for i in rang: 254 | gorgon.append(self.fromHex(hexTime[i * 2 : 2 * i + 2])) 255 | 256 | return {"gorgon": gorgon, "time": times} 257 | 258 | def __handle(self, gorgonHash): 259 | rang = self.__ranges(self.LEN) 260 | for i in rang: 261 | A = gorgonHash[i] 262 | B = self.__reverse(A) 263 | C = int(gorgonHash[(i + 1) % self.LEN]) 264 | D = B ^ C 265 | E = self.__rbit(D) 266 | F = E ^ self.LEN 267 | G = ~F 268 | while G < 0: 269 | G += 4294967296 270 | 271 | a = self.__to_hex(G) 272 | offset = len(a) - 2 273 | 274 | H = self.fromHex(self.__to_hex(G)[offset:]) 275 | gorgonHash[i] = H 276 | 277 | return gorgonHash 278 | 279 | def __hex2str(self, num): 280 | tmp = self.__to_hex(num) 281 | if len(tmp) < 2: 282 | tmp = "0" + tmp 283 | return tmp 284 | 285 | def __init_hash(self, gorgonHash, hexEncryption): 286 | tmp_add = [] 287 | tmp_hex = [] + hexEncryption 288 | A = B = C = D = E = F = G = None 289 | rang = self.__ranges(self.LEN) 290 | for i in rang: 291 | A = gorgonHash["gorgon"][i] 292 | B = 0 if len(tmp_add) == 0 else tmp_add[-1] 293 | C = self.ensureMax(hexEncryption[i + 1] + int(B)) 294 | tmp_add.append(C) 295 | D = tmp_hex[C] 296 | tmp_hex[i + 1] = D 297 | E = self.ensureMax(D + D) 298 | F = tmp_hex[E] 299 | G = A ^ F 300 | gorgonHash["gorgon"][i] = G 301 | 302 | return gorgonHash 303 | 304 | def __ranges(self, start=0, stop=None, step=1): 305 | if stop is None: 306 | stop = start 307 | start = 0 308 | 309 | if ((step > 0) & (start >= stop)) or (step < 0) & (start <= stop): 310 | return [] 311 | 312 | result = [] 313 | 314 | for x in range(start, stop, step): 315 | result.append(x) 316 | 317 | return result 318 | 319 | def __rbit(self, num): 320 | result = "" 321 | tmp = format(num, "b") 322 | 323 | while len(tmp) < 8: 324 | tmp = "0" + tmp 325 | 326 | rang = self.__ranges(8) 327 | for i in rang: 328 | result += tmp[7 - i] 329 | return int(result, 2) 330 | 331 | def __reverse(self, num): 332 | tmp = self.__to_hex(num) 333 | if len(tmp) < 2: 334 | tmp = "0" + tmp 335 | 336 | return self.fromHex(tmp[1:10] + tmp[0:1]) 337 | 338 | def __to_hex(self, num): 339 | return format(int(num), "x") 340 | 341 | def __xgorgon_cookie(self, cookie: str, encoding="utf-8"): 342 | gorgon = [] 343 | rang = self.__ranges(4) 344 | if (cookie is None) or (len(cookie) == 0): 345 | for i in rang: 346 | gorgon.append(0) 347 | else: 348 | hashstr = hashlib.md5(cookie.encode()).hexdigest() 349 | for i in rang: 350 | gorgon.append(self.fromHex(hashstr[i * 2 : 2 * i + 2])) 351 | 352 | return gorgon 353 | 354 | def __xgorgon_data(self, data: str, encoding="utf-8"): 355 | gorgon = [] 356 | data_md5 = None 357 | 358 | if (data is None) or (len(data) == 0): 359 | rang = self.__ranges(4) 360 | for i in rang: 361 | gorgon.append(0) 362 | 363 | else: 364 | data_md5 = data 365 | 366 | if encoding == "octet": 367 | data_md5 = hashlib.md5(data.encode()).hexdigest() 368 | rang = self.__ranges(4) 369 | 370 | for i in rang: 371 | gorgon.append(self.fromHex(data_md5[i * 2 : 2 * i + 2])) 372 | 373 | return gorgon 374 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # This project is discontinued! 2 | For a simpler solution to generate TikTok stream keys check my other project [here](https://github.com/Loukious/StreamLabsTikTokStreamKeyGenerator) 3 | 4 | 5 | # TikTok Live Stream Key Generator for OBS Studio 6 | 7 | ## Description 8 | This Python script is a valuable tool for content creators looking to broadcast on TikTok's live streaming platform using OBS Studio, an alternative to TikTok LIVE Studio. The script's standout feature is generating a stream key, a capability typically restricted and highly sought after. This stream key enables users to stream via OBS Studio, offering more control and flexibility over their live broadcasts. Additionally, the script provides the base stream URL and a shareable URL for the stream. 9 | 10 | [!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/loukious) 11 | 12 | 13 | ## Features 14 | - Retrieve the base stream URL. 15 | - Generate a TikTok stream key. 16 | - Obtain a shareable URL for the TikTok live stream. 17 | - Support for specifying different topics including games, music, and more. 18 | - Spoofing support for users without TikTok LIVE Studio access (Currently broken don't use it). 19 | - Generate a fake device for spoofing. 20 | - Option to enable replay generation. 21 | - Option to close the room when the stream ends. 22 | - Option to choose region priority. 23 | - Option to mark the stream as mature content. 24 | - Button to end the stream. 25 | - Option to use custom thumbnail. 26 | 27 | ## Requirements 28 | - Python 3.6+ 29 | - Google Chrome browser 30 | - Game tag ID 31 | - Logged into TikTok LIVE studio at least once 32 | - Have TikTok LIVE studio access or Live access (use spoofing if you don't have access to TikTok LIVE studio) 33 | 34 | ## Installation 35 | Either download and use the provided exe from [here](https://github.com/Loukious/TikTokStreamKeyGenerator/releases/latest) or follow the steps below to run the script. 36 | Ensure you have Python and PIP working. 37 | In the command line, install the required packages using the following command (run the command in the same directory as the script): 38 | ```bash 39 | pip install -r requirements.txt 40 | ``` 41 | or if pip is not working, try: 42 | ```bash 43 | python -m pip install -r requirements.txt 44 | ``` 45 | 46 | ## Usage 47 | Simply run the script to open the GUI. 48 | 49 | ### Command Format 50 | ```bash 51 | python TikTokStreamKeyGenerator.py 52 | ``` 53 | 54 | Press the login button to login to TikTok. After logging in, you can enter the game tag ID, stream title, and other options. Press the go live button to generate the stream key. 55 | 56 | ## Output 57 | 58 | The script will output: 59 | - **Base stream URL:** The URL needed to connect to the TikTok live stream. 60 | - **Stream key for OBS Studio integration:** Stream key that that you can use in OBS Studio to stream to TikTok. 61 | - **Shareable URL for the live stream:** A URL that can be shared for others to view the live stream. 62 | 63 | ## FAQ 64 | ### I'm getting a `Please login first` error. What should I do? 65 | Try a different server from the one you're using. 66 | ### I'm getting a `Maximum number of attempts reached. Try again later.` error. What should I do? 67 | This error sometimes occurs when TikTok detects selenium. You can use this [extension](https://chromewebstore.google.com/detail/export-cookie-json-file-f/nmckokihipjgplolmcmjakknndddifde) to export your cookies and import them into the script. 68 | - Start by installing the above extension in your browser. 69 | - Log into TikTok in the browser (if not already logged in), then export the cookies using the extension (while being on TikTok's website). 70 | - After that, place the file in the same directory as the script and rename it to `cookies.json` then start the app. 71 | ### Do I need live access to use this script? 72 | Yes, you need to have access to TikTok LIVE to use this script. 73 | -------------------------------------------------------------------------------- /TiktokStreamKeyGenerator.py: -------------------------------------------------------------------------------- 1 | import hashlib 2 | import tkinter as tk 3 | from tkinter import ttk, messagebox, filedialog 4 | import json 5 | import os 6 | import threading 7 | import undetected_chromedriver as uc 8 | from selenium.webdriver.support.ui import WebDriverWait 9 | from selenium.webdriver.support import expected_conditions as EC 10 | import requests 11 | import time 12 | from urllib.parse import urlencode 13 | import urllib.parse 14 | from Libs.device import Device 15 | from Libs.device_gen import Applog, Xlog 16 | from Libs.xgorgon import Gorgon 17 | from Libs.signature import ladon_encrypt, get_x_ss_stub 18 | 19 | 20 | 21 | 22 | class Stream: 23 | def __init__(self): 24 | self.s = requests.session() 25 | with open("cookies.json", "r") as file: 26 | cookies_file = json.load(file) 27 | cookies = {} 28 | for cookie in cookies_file: 29 | cookies[cookie["name"]] = cookie["value"] 30 | self.s.cookies.update(cookies) 31 | # self.renewCookies() 32 | 33 | def __enter__(self): 34 | return self 35 | 36 | def __exit__(self, exc_type, exc_value, traceback): 37 | self.s.close() 38 | 39 | def getLiveStudioLatestVersion(self): 40 | url = "https://tron-sg.bytelemon.com/api/sdk/check_update" 41 | params = { 42 | "pid": "7393277106664249610", 43 | "uid": "7464643088460875280", 44 | "branch": "studio/release/stable", 45 | "buildId": "0" 46 | } 47 | try: 48 | with self.s.get(url, params=params) as response: 49 | return response.json()["data"]["manifest"]["win32"]["version"] 50 | except Exception as e: 51 | print(f"Failed to fetch latest version: {e}") 52 | return "0.99.0" 53 | 54 | 55 | def createStream( 56 | self, 57 | title, 58 | hashtag_id, 59 | game_tag_id="0", 60 | gen_replay=False, 61 | close_room_when_close_stream=True, 62 | age_restricted=False, 63 | priority_region="", 64 | spoof_plat=0, 65 | openudid = "", 66 | device_id = "", 67 | iid = "", 68 | thumbnail_path = "" 69 | ): 70 | base_url = self.getServerUrl() 71 | if spoof_plat == 1: 72 | self.s.headers = { 73 | "user-agent": "com.zhiliaoapp.musically/2023508030 (Linux; U; Android 14; en_US_#u-mu-celsius; M2102J20SG; Build/AP2A.240905.003; Cronet/TTNetVersion:f58efab5 2024-06-13 QuicVersion:5d23606e 2024-05-23)", 74 | } 75 | params = { 76 | # App ID for Tiktok Mobile App 77 | "aid": "1233", 78 | # App name for Tiktok Mobile App 79 | "app_name": "musical_ly", 80 | # Channel for Tiktok Mobile App 81 | "channel": "googleplay", 82 | "device_platform": "android", 83 | "iid": iid, 84 | "device_id": device_id, 85 | "openudid": openudid, 86 | "os": "android", 87 | "ssmix": "a", 88 | "_rticket": "1730304478660", 89 | "cdid": "1fb4eb4c-99f5-4534-a637-e3ac7d52fddb", 90 | "version_code": "370104", 91 | "version_name": "37.1.4", 92 | "manifest_version_code": "2024701040", 93 | "update_version_code": "2024701040", 94 | "ab_version": "37.1.4", 95 | "resolution": "1080*2309", 96 | "dpi": "410", 97 | "device_type": "M2102J20SG", 98 | "device_brand": "POCO", 99 | "language": "en", 100 | "os_api": "34", 101 | "os_version": "14", 102 | "ac": "wifi", 103 | "is_pad": "0", 104 | "current_region": "TN", 105 | "app_type": "normal", 106 | "sys_region": "US", 107 | "last_install_time": "1717207722", 108 | "mcc_mnc": "60501", 109 | "timezone_name": "Africa/Tunis", 110 | "carrier_region_v2": "605", 111 | "residence": "TN", 112 | "app_language": "en", 113 | "carrier_region": "TN", 114 | "ac2": "wifi5g", 115 | "uoo": "0", 116 | "op_region": "TN", 117 | "timezone_offset": "3600", 118 | "build_number": "37.1.4", 119 | "host_abi": "arm64-v8a", 120 | "locale": "en", 121 | "region": "US", 122 | "ts": "1730304477", 123 | "webcast_sdk_version": "3590", 124 | "webcast_language": "en", 125 | "webcast_locale": "en_US_#u-mu-celsius", 126 | "es_version": "2", 127 | "effect_sdk_version": "17.0.0", 128 | "current_network_quality_info": '{"tcp_rtt":64,"quic_rtt":64,"http_rtt":198,"downstream_throughput_kbps":31920,"quic_send_loss_rate":-1,"quic_receive_loss_rate":-1,"net_effective_connection_type":4,"video_download_speed":787}' 129 | } 130 | data = { 131 | "hashtag_id": hashtag_id, 132 | "hold_living_room": "1", 133 | "chat_sub_only_auth": "2", 134 | "community_flagged_chat_auth": "2", 135 | "ecom_bc_toggle": "3", 136 | "live_sub_only": "0", 137 | "overwrite_push_base_parameter": "false", 138 | "chat_l_2": "1", 139 | "caption": "0", 140 | "overwrite_push_base_min_bit_rate": "-1", 141 | "title": title, 142 | "live_sub_only_use_music": "0", 143 | "mobile_binded": "0", 144 | "create_source": "0", 145 | "spam_comments": "1", 146 | "commercial_content_promote_third_party": "false", 147 | "grant_level": "0", 148 | "screenshot_cover_status": "0", 149 | "overwrite_push_base_max_bit_rate": "-1", 150 | "enable_http_dns": "0", 151 | "mobile_validated": "0", 152 | "live_agreement": "0", 153 | "commercial_content_promote_myself": "false", 154 | "allow_preview_duration_exp": "0", 155 | "is_user_select": "0", 156 | "transaction_history": "1", 157 | "probe_recommend_resolution": "1", 158 | "chat_auth": "1", 159 | "disable_preview_sub_only": "0", 160 | "comment_tray_switch": "1", 161 | "overwrite_push_base_default_bit_rate": "-1", 162 | "overwrite_push_base_resolution": "1", 163 | "grant_group": "1", 164 | "gift_auth": "1", 165 | "star_comment_switch": "true", 166 | "has_commerce_goods": "false", 167 | "open_commercial_content_toggle": "false", 168 | "event_id": "-1", 169 | "star_comment_qualification": "false", 170 | "game_tag_id": game_tag_id, 171 | "community_flagged_chat_review_auth": "2", 172 | "age_restricted": "0", 173 | "group_chat_id": "0", 174 | "optout_gift_gallery": "false", 175 | "gen_replay": str(gen_replay).lower(), 176 | "shopping_ranking": "0" 177 | } 178 | 179 | elif spoof_plat == 2: 180 | self.s.headers = { 181 | "user-agent": "com.zhiliaoapp.musically/2023508030 (Linux; U; Android 14; en_US_#u-mu-celsius; M2102J20SG; Build/AP2A.240905.003; Cronet/TTNetVersion:f58efab5 2024-06-13 QuicVersion:5d23606e 2024-05-23)", 182 | } 183 | params = { 184 | # App ID for Tiktok Mobile App 185 | "aid": "1233", 186 | # App name for Tiktok Mobile App 187 | "app_name": "musical_ly", 188 | # Channel for Tiktok Mobile App 189 | "channel": "googleplay", 190 | "device_platform": "android", 191 | "iid": iid, 192 | "device_id": device_id, 193 | "openudid": openudid, 194 | "screen_shot": "1", 195 | "ac": "wifi", 196 | "version_code": "370104", 197 | "version_name": "37.1.4", 198 | "os": "android", 199 | "ab_version": "37.1.4", 200 | "ssmix": "a", 201 | "device_type": "M2102J20SG", 202 | "device_brand": "POCO", 203 | "language": "en", 204 | "os_api": "34", 205 | "os_version": "14", 206 | "manifest_version_code": "2023701040", 207 | "resolution": "1080*2309", 208 | "dpi": "410", 209 | "update_version_code": "2023701040", 210 | "_rticket": "1730306440278", 211 | "is_pad": "0", 212 | "current_region": "TN", 213 | "app_type": "normal", 214 | "sys_region": "US", 215 | "last_install_time": "1730305998", 216 | "mcc_mnc": "60501", 217 | "timezone_name": "Africa/Tunis", 218 | "carrier_region_v2": "605", 219 | "residence": "TN", 220 | "app_language": "en", 221 | "carrier_region": "TN", 222 | "ac2": "wifi5g", 223 | "uoo": "0", 224 | "op_region": "TN", 225 | "timezone_offset": "3600", 226 | "build_number": "37.1.4", 227 | "host_abi": "arm64-v8a", 228 | "locale": "en", 229 | "region": "US", 230 | "ts": "1730306440", 231 | "cdid": "bfe31618-558b-4e0d-a4e5-c4221be305a1", 232 | "webcast_sdk_version": "3490", 233 | "webcast_language": "en", 234 | "webcast_locale": "en_US_#u-mu-celsius", 235 | "es_version": "2", 236 | "effect_sdk_version": "17.0.0", 237 | "current_network_quality_info": '{"tcp_rtt":99,"quic_rtt":99,"http_rtt":203,"downstream_throughput_kbps":2734,"quic_send_loss_rate":-1,"quic_receive_loss_rate":-1,"net_effective_connection_type":4,"video_download_speed":7}' 238 | } 239 | data = { 240 | "hashtag_id": hashtag_id, 241 | "hold_living_room": "1", 242 | "chat_sub_only_auth": "2", 243 | "screen_shot": "1", 244 | "mute_duration": "1", 245 | "community_flagged_chat_auth": "2", 246 | "ecom_bc_toggle": "3", 247 | "live_sub_only": "0", 248 | "chat_l_2": "1", 249 | "caption": "0", 250 | "live_sub_only_use_music": "0", 251 | "mobile_binded": "0", 252 | "create_source": "0", 253 | "spam_comments": "1", 254 | "commercial_content_promote_third_party": "false", 255 | "grant_level": "0", 256 | "screenshot_cover_status": "1", 257 | "enable_http_dns": "0", 258 | "mobile_validated": "0", 259 | "live_agreement": "0", 260 | "orientation": "2", 261 | "commercial_content_promote_myself": "false", 262 | "allow_preview_duration_exp": "0", 263 | "transaction_history": "1", 264 | "chat_auth": "1", 265 | "disable_preview_sub_only": "0", 266 | "comment_tray_switch": "1", 267 | "grant_group": "1", 268 | "gift_auth": "1", 269 | "star_comment_switch": "true", 270 | "has_commerce_goods": "false", 271 | "open_commercial_content_toggle": "false", 272 | "event_id": "-1", 273 | "star_comment_qualification": "true", 274 | "game_tag_id": game_tag_id, 275 | "community_flagged_chat_review_auth": "2", 276 | "age_restricted": "0", 277 | "sdk_key": "hd", 278 | "live_room_mode": "4", 279 | "gen_replay": str(gen_replay).lower(), 280 | "shopping_ranking": "0" 281 | } 282 | else: 283 | version = self.getLiveStudioLatestVersion() 284 | self.s.headers = { 285 | "user-agent": f"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) TikTokLIVEStudio/{version} Chrome/108.0.5359.215 Electron/22.3.18-tt.8.release.main.44 TTElectron/22.3.18-tt.8.release.main.44 Safari/537.36", 286 | } 287 | params = { 288 | # App ID for TikTok Live Studio 289 | "aid": "8311", 290 | # App name for TikTok Live Studio 291 | "app_name": "tiktok_live_studio", 292 | # Channel for TikTok Live Studio 293 | "channel": "studio", 294 | "device_platform": "windows", 295 | # Priority region for the stream 296 | "priority_region": priority_region, 297 | "live_mode": "6", 298 | "version_code": version, 299 | "webcast_sdk_version": version.replace(".", "").replace("0", ""), 300 | "webcast_language": "en", 301 | "app_language": "en", 302 | "language": "en", 303 | "browser_version": "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) TikTokLIVEStudio/0.69.2 Chrome/108.0.5359.215 Electron/22.3.18-tt.8.release.main.44 TTElectron/22.3.18-tt.8.release.main.44 Safari/537.36", 304 | "browser_name": "Mozilla", 305 | "browser_platform": "Win32", 306 | "browser_language": "en-US", 307 | "screen_height": "1080", 308 | "screen_width": "1920", 309 | "timezone_name": "Africa/Lagos", 310 | "device_id": "7378193331631310352", 311 | "install_id": "7378196538524927745" 312 | } 313 | data = { 314 | "title": title, 315 | "live_studio": "1", 316 | "gen_replay": str(gen_replay).lower(), 317 | "chat_auth": "1", 318 | "cover_uri": "", 319 | "close_room_when_close_stream": str(close_room_when_close_stream).lower(), 320 | "hashtag_id": str(hashtag_id), 321 | "game_tag_id": str(game_tag_id), 322 | "screenshot_cover_status": "1", 323 | "live_sub_only": "0", 324 | "chat_sub_only_auth": "2", 325 | "multi_stream_scene": "0", 326 | "gift_auth": "1", 327 | "chat_l2": "1", 328 | "star_comment_switch": "true", 329 | "multi_stream_source": "1" 330 | } 331 | if age_restricted: 332 | data["age_restricted"] = "4" 333 | if thumbnail_path: 334 | uri = self.uploadThumbnail(thumbnail_path, base_url, params) 335 | data["cover_uri"] = uri 336 | # Signing is disabled for now 337 | # sig = Gorgon(urlencode(params, quote_via=urllib.parse.quote), urlencode(data, quote_via=urllib.parse.quote), urlencode(self.s.cookies, quote_via=urllib.parse.quote)).get_value() 338 | # self.s.headers.update(sig) 339 | # x_ss_stub = get_x_ss_stub(data) 340 | # self.s.headers.update(x_ss_stub) 341 | # if spoof_plat in [1, 2]: 342 | # self.s.headers.update(ladon_encrypt(sig["x-khronos"], 1611921764, 1233)) 343 | # else: 344 | # self.s.headers.update(ladon_encrypt(sig["x-khronos"], 1611921764, 8311)) 345 | 346 | streamInfo = self.s.post( 347 | base_url + "webcast/room/create/", 348 | params=params, 349 | data=data 350 | ).json() 351 | try: 352 | self.streamUrl = streamInfo["data"]["stream_url"][ 353 | "rtmp_push_url" 354 | ] 355 | split_index = self.streamUrl.rfind("/") 356 | self.baseStreamUrl = self.streamUrl[:split_index] 357 | self.streamKey = self.streamUrl[split_index + 1:] 358 | self.streamShareUrl = streamInfo["data"]["share_url"] 359 | return True 360 | except KeyError: 361 | messagebox.showerror( 362 | "Error", streamInfo["data"]["prompts"] 363 | ) 364 | return False 365 | 366 | def endStream(self): 367 | base_url = self.getServerUrl() 368 | params = { 369 | # App ID for TikTok Live Studio 370 | "aid": "8311", 371 | # App name for TikTok Live Studio 372 | "app_name": "tiktok_live_studio", 373 | # Channel for TikTok Live Studio 374 | "channel": "studio", 375 | "device_platform": "windows", 376 | "live_mode": "6", 377 | } 378 | streamInfo = self.s.post( 379 | base_url + "webcast/room/finish_abnormal/", 380 | params=params 381 | ).json() 382 | if "data" in streamInfo and "prompts" in streamInfo["data"]: 383 | messagebox.showerror( 384 | "Error", streamInfo["data"]["prompts"] 385 | ) 386 | return False 387 | return True 388 | 389 | def getServerUrl(self): 390 | url = ( 391 | "https://tnc16-platform-useast1a.tiktokv.com/get_domains/v4/?" 392 | "aid=8311&ttwebview_version=1130022001&device_platform=win" 393 | ) 394 | response = self.s.get(url).json() 395 | for data in response["data"]["ttnet_dispatch_actions"]: 396 | if "param" in data and "strategy_info" in data["param"] and "webcast-normal.tiktokv.com" in data["param"]["strategy_info"]: 397 | server_url = data['param']['strategy_info']['webcast-normal.tiktokv.com'] 398 | for data2 in response["data"]["ttnet_dispatch_actions"]: 399 | if "param" in data2 and "strategy_info" in data2["param"] and server_url in data2["param"]["strategy_info"]: 400 | server_url = data2['param']['strategy_info'][server_url] 401 | return f"https://{server_url}/" 402 | return f"https://{server_url}/" 403 | 404 | def uploadThumbnail( 405 | self, 406 | file_path, 407 | base_url, 408 | params 409 | ): 410 | files = { 411 | "file": (f"crop_{round(time.time() * 1000)}.png", open(file_path, "rb"), "multipart/form-data") 412 | } 413 | thumbnailInfo = self.s.post( 414 | base_url + "webcast/room/upload/image/", 415 | params=params, 416 | files=files 417 | ).json() 418 | return thumbnailInfo.get("data", {}).get("uri", "") 419 | 420 | def renewCookies(self): 421 | response = self.s.get("https://www.tiktok.com/foryou") 422 | if response.url == "https://www.tiktok.com/login/phone-or-email": 423 | messagebox.showerror( 424 | "Error", "Cookies are invalid. Please login again." 425 | ) 426 | cookies_status.config(text="No cookies found") 427 | go_live_button.config(state=tk.DISABLED) 428 | login_button.config(state=tk.NORMAL) 429 | os.remove("cookies.json") 430 | return False 431 | else: 432 | new_cookies = [] 433 | cookies = dict(self.s.cookies) 434 | for cookie in cookies: 435 | new_cookies.append( 436 | { 437 | "name": cookie, 438 | "value": cookies[cookie] 439 | } 440 | ) 441 | with open("cookies.json", "w") as file: 442 | json.dump(new_cookies, file) 443 | return True 444 | 445 | 446 | def save_config(): 447 | """Save entry values to a JSON file.""" 448 | if game_combobox.get() != "": 449 | game_id = [ 450 | game for game in games 451 | if games[game].lower() == game_combobox.get().lower() 452 | ][0] 453 | else: 454 | game_id = "" 455 | if topic_combobox.get() != "": 456 | topic_id = [ 457 | topic for topic in topics 458 | if topics[topic].lower() == topic_combobox.get().lower() 459 | ][0] 460 | else: 461 | topic_id = "" 462 | 463 | data = { 464 | "title": title_entry.get(), 465 | "game_tag_id": game_id, 466 | "hashtag_id": topic_id, 467 | "priority_region": region_entry.get(), 468 | "generate_replay": replay_var.get(), 469 | "spoof_plat": spoof_plat_var.get(), 470 | "close_room_when_close_stream": close_room_var.get(), 471 | "age_restricted": age_restricted_var.get(), 472 | "openudid": openudid_entry.get(), 473 | "device_id": device_id_entry.get(), 474 | "iid": iid_entry.get() 475 | } 476 | with open("config.json", "w") as file: 477 | json.dump(data, file) 478 | messagebox.showinfo("Success", "Config saved successfully.") 479 | return True 480 | 481 | 482 | def load_config(): 483 | """Load entry values from a JSON file.""" 484 | try: 485 | with open("config.json", "r") as file: 486 | data = json.load(file) 487 | title_entry.delete(0, tk.END) 488 | title_entry.insert(0, data.get("title", "")) 489 | topic_combobox.set(topics.get(data.get("hashtag_id", ""), "")) 490 | if topic_combobox.get() != "Gaming": 491 | game_combobox.grid_remove() 492 | game_label.grid_remove() 493 | else: 494 | game_combobox.set(games.get(data.get("game_tag_id", ""), "")) 495 | region_entry.set(data.get("priority_region", "")) 496 | replay_var.set(data.get("generate_replay", False)) 497 | spoof_plat_var.set(data.get("spoof_plat", 0)) 498 | openudid_entry.delete(0, tk.END) 499 | openudid_entry.insert(0, data.get("openudid", "")) 500 | device_id_entry.delete(0, tk.END) 501 | device_id_entry.insert(0, data.get("device_id", "")) 502 | iid_entry.delete(0, tk.END) 503 | iid_entry.insert(0, data.get("iid", "")) 504 | if spoof_plat_var.get() == 0: 505 | spoofing_frame.grid_remove() 506 | close_room_var.set(data.get("close_room_when_close_stream", True)) 507 | age_restricted_var.set(data.get("age_restricted", False)) 508 | except FileNotFoundError: 509 | print("Error loading config file.") 510 | 511 | 512 | def check_cookies(): 513 | """Update the label based on the existence of cookies.json.""" 514 | if os.path.exists("cookies.json"): 515 | cookies_status.config(text="Cookies are loaded") 516 | go_live_button.config(state=tk.NORMAL) 517 | login_button.config(state=tk.DISABLED) 518 | else: 519 | cookies_status.config(text="No cookies found") 520 | go_live_button.config(state=tk.DISABLED) 521 | login_button.config(state=tk.NORMAL) 522 | 523 | 524 | def wait_for_page_load(driver, timeout=30): 525 | """Wait for the page's load state to be 'complete'.""" 526 | return WebDriverWait(driver, timeout).until( 527 | lambda d: d.execute_script("return document.readyState") == "complete" 528 | ) 529 | 530 | 531 | def launch_browser(): 532 | """Launch Selenium to perform login and save cookies.""" 533 | driver = uc.Chrome() 534 | driver.get("https://www.tiktok.com/login?is_modal=1&hide_toggle_login_signup=1&enter_method=live_studio&enter_from=live_studio&lang=en") 535 | try: 536 | WebDriverWait(driver, 60).until( 537 | EC.url_contains("https://www.tiktok.com/foryou") 538 | ) 539 | cookies = driver.get_cookies() 540 | with open("cookies.json", "w") as file: 541 | json.dump(cookies, file) 542 | wait_for_page_load(driver) 543 | driver.quit() 544 | messagebox.showinfo( 545 | "Login Status", "Login Successful and cookies saved!" 546 | ) 547 | except Exception as e: 548 | error_message = f"Login Failed or Timed Out.\n" \ 549 | f"Error type: {type(e).__name__}, Message: {str(e)}" 550 | messagebox.showinfo("Login Status", error_message) 551 | finally: 552 | driver.quit() 553 | check_cookies() 554 | 555 | 556 | def enable_output_fields(): 557 | """Enable output fields after stream is generated.""" 558 | server_entry.config(state=tk.NORMAL) 559 | key_entry.config(state=tk.NORMAL) 560 | url_entry.config(state=tk.NORMAL) 561 | 562 | 563 | def disable_output_fields(): 564 | """Disable output fields when stream is not generated.""" 565 | server_entry.config(state=tk.DISABLED) 566 | key_entry.config(state=tk.DISABLED) 567 | url_entry.config(state=tk.DISABLED) 568 | 569 | 570 | def clear_output_fields(): 571 | """Clear output fields.""" 572 | server_entry.delete(0, tk.END) 573 | key_entry.delete(0, tk.END) 574 | url_entry.delete(0, tk.END) 575 | 576 | 577 | def end_stream(): 578 | """End the current stream.""" 579 | with Stream() as s: 580 | ended = s.endStream() 581 | if ended: 582 | messagebox.showinfo("Success", "Stream ended successfully.") 583 | enable_output_fields() 584 | clear_output_fields() 585 | disable_output_fields() 586 | 587 | 588 | def generate_stream(): 589 | """Function for stream key generation.""" 590 | if topic_combobox.get() != "": 591 | hashtag_id = [ 592 | topic for topic in topics 593 | if topics[topic].lower() == topic_combobox.get().lower() 594 | ][0] 595 | else: 596 | messagebox.showerror("Error", "Please select a topic.") 597 | return 598 | if hashtag_id == "5" and game_combobox.get() == "": 599 | messagebox.showerror("Error", "Please select a game tag.") 600 | return 601 | if hashtag_id != "5": 602 | game_id = "0" 603 | else: 604 | game_id = [ 605 | game for game in games 606 | if games[game].lower() == game_combobox.get().lower() 607 | ][0] 608 | with Stream() as s: 609 | created = s.createStream( 610 | title_entry.get(), 611 | hashtag_id, 612 | game_id, 613 | replay_var.get(), 614 | close_room_var.get(), 615 | age_restricted_var.get(), 616 | region_entry.get(), 617 | spoof_plat_var.get(), 618 | openudid_entry.get(), 619 | device_id_entry.get(), 620 | iid_entry.get(), 621 | thumbnail_path_var.get() 622 | ) 623 | if created: 624 | messagebox.showinfo("Success", "Stream created successfully.") 625 | enable_output_fields() 626 | clear_output_fields() 627 | server_entry.insert(0, s.baseStreamUrl) 628 | key_entry.insert(0, s.streamKey) 629 | url_entry.insert(0, s.streamShareUrl) 630 | disable_output_fields() 631 | 632 | 633 | def login_thread(): 634 | """Handle the login process in a separate thread to keep UI responsive.""" 635 | threading.Thread(target=launch_browser).start() 636 | 637 | 638 | def fetch_game_tags(): 639 | url = ( 640 | "https://webcast16-normal-c-useast2a.tiktokv.com/webcast/" 641 | "room/hashtag/list/" 642 | ) 643 | try: 644 | response = requests.get(url) 645 | game_tags = response.json()["data"]["game_tag_list"] 646 | return {game["id"]: game["show_name"] for game in game_tags} 647 | except Exception as e: 648 | print(f"Failed to fetch game tags: {e}") 649 | return {} 650 | 651 | 652 | def update_combobox_options(event): 653 | # Get current text in the combobox 654 | current_text = game_combobox.get() 655 | # Filter the games dictionary 656 | filtered_options = [ 657 | name 658 | for name in games.values() 659 | if name.lower().startswith(current_text.lower()) 660 | ] 661 | # Update the options displayed in the combobox 662 | game_combobox["values"] = filtered_options 663 | 664 | 665 | def check_selection(event): 666 | if topic_combobox.get() == "Gaming": 667 | game_combobox.grid(row=2, column=1, padx=5, pady=2, sticky="ew") 668 | game_label.grid(row=2, column=0, padx=5, pady=2, sticky="w") 669 | else: 670 | game_combobox.grid_remove() 671 | game_label.grid_remove() 672 | 673 | 674 | def on_spoof_plat_change(*args): 675 | selected_value = spoof_plat_var.get() 676 | if selected_value == 0: 677 | spoofing_frame.grid_remove() 678 | else: 679 | spoofing_frame.grid() 680 | 681 | def browse_image(): 682 | file_path = filedialog.askopenfilename( 683 | title="Select a Image", 684 | filetypes=[("PNG files", "*.png"), ("JPG files", "*.jpg"), ("JPEG files", "*.jpeg"), ("All files", "*.*")] 685 | ) 686 | if file_path: 687 | thumbnail_path_var.set(file_path) 688 | 689 | def generate_device(): 690 | device: dict = Device().create_device() 691 | device_id, install_id = Applog(device).register_device() 692 | Xlog(device_id).bypass() 693 | openudid_entry.delete(0, tk.END) 694 | openudid_entry.insert(0, device["openudid"]) 695 | device_id_entry.delete(0, tk.END) 696 | device_id_entry.insert(0, device_id) 697 | iid_entry.delete(0, tk.END) 698 | iid_entry.insert(0, install_id) 699 | 700 | 701 | 702 | topics = { 703 | "5": "Gaming", 704 | "6": "Music", 705 | "42": "Chat & Interview", 706 | "9": "Beauty & Fashion", 707 | "3": "Dance", 708 | "13": "Fitness & Sports", 709 | "4": "Food", 710 | "43": "News & Event", 711 | "45": "Education" 712 | } 713 | 714 | 715 | app = tk.Tk() 716 | app.title("TikTok Stream Key Generator") 717 | app.columnconfigure(0, weight=1) 718 | app.columnconfigure(1, weight=1) 719 | app.columnconfigure(2, weight=1) 720 | 721 | # Using LabelFrames for better organization 722 | input_frame = ttk.LabelFrame(app, text="Input") 723 | input_frame.grid(row=0, column=0, padx=10, pady=5, sticky="nsew") 724 | input_frame.columnconfigure(0, weight=1) 725 | 726 | # Input fields and labels inside the LabelFrame 727 | title_label = ttk.Label(input_frame, text="Title") 728 | title_label.grid(row=0, column=0, padx=5, pady=2, sticky="w") 729 | 730 | title_entry = ttk.Entry(input_frame) 731 | title_entry.grid(row=0, column=1, padx=5, pady=2, sticky="ew") 732 | 733 | topic_label = ttk.Label(input_frame, text="Topic") 734 | topic_label.grid(row=1, column=0, padx=5, pady=2, sticky="w") 735 | 736 | topic_combobox = ttk.Combobox(input_frame, values=list(topics.values())) 737 | topic_combobox.grid(row=1, column=1, padx=5, pady=2, sticky="ew") 738 | topic_combobox.bind('<>', check_selection) 739 | 740 | game_combobox = ttk.Combobox(input_frame) 741 | 742 | game_label = ttk.Label(input_frame, text="Game") 743 | game_label.grid(row=2, column=0, padx=5, pady=2, sticky="w") 744 | 745 | games = fetch_game_tags() 746 | game_combobox = ttk.Combobox(input_frame, values=list(games.values())) 747 | game_combobox.grid(row=2, column=1, padx=5, pady=2, sticky="ew") 748 | game_combobox.bind("", update_combobox_options) 749 | 750 | region_label = ttk.Label(input_frame, text="Region") 751 | region_label.grid(row=3, column=0, padx=5, pady=2, sticky="w") 752 | 753 | region_entry = ttk.Combobox( 754 | input_frame, 755 | values=[ 756 | "", "af", "ax", "al", "dz", "as", "ad", "ao", "ai", "aq", "ag", "ar", "am", "aw", "au", 757 | "at", "az", "bs", "bh", "bd", "bb", "by", "be", "bz", "bj", "bm", "bt", "bo", "bq", 758 | "ba", "bw", "bv", "br", "io", "bn", "bg", "bf", "bi", "cv", "kh", "cm", "ca", "ky", 759 | "cf", "td", "cl", "cn", "cx", "cc", "co", "km", "cg", "cd", "ck", "cr", "ci", "hr", 760 | "cu", "cw", "cy", "cz", "dk", "dj", "dm", "do", "ec", "eg", "sv", "gq", "er", "ee", 761 | "sz", "et", "fk", "fo", "fj", "fi", "fr", "gf", "pf", "tf", "ga", "gm", "ge", "de", 762 | "gh", "gi", "gr", "gl", "gd", "gp", "gu", "gt", "gg", "gn", "gw", "gy", "ht", "hm", 763 | "va", "hn", "hk", "hu", "is", "in", "id", "ir", "iq", "ie", "im", "il", "it", "jm", 764 | "jp", "je", "jo", "kz", "ke", "ki", "kp", "kr", "kw", "kg", "la", "lv", "lb", "ls", 765 | "lr", "ly", "li", "lt", "lu", "mo", "mg", "mw", "my", "mv", "ml", "mt", "mh", "mq", 766 | "mr", "mu", "yt", "mx", "fm", "md", "mc", "mn", "me", "ms", "ma", "mz", "mm", "na", 767 | "nr", "np", "nl", "nc", "nz", "ni", "ne", "ng", "nu", "nf", "mk", "mp", "no", "om", 768 | "pk", "pw", "ps", "pa", "pg", "py", "pe", "ph", "pn", "pl", "pt", "pr", "qa", "re", 769 | "ro", "ru", "rw", "bl", "sh", "kn", "lc", "mf", "pm", "vc", "ws", "sm", "st", "sa", 770 | "sn", "rs", "sc", "sl", "sg", "sx", "sk", "si", "sb", "so", "za", "gs", "ss", "es", 771 | "lk", "sd", "sr", "sj", "se", "ch", "sy", "tw", "tj", "tz", "th", "tl", "tg", "tk", 772 | "to", "tt", "tn", "tr", "tm", "tc", "tv", "ug", "ua", "ae", "gb", "um", "us", "uy", 773 | "uz", "vu", "ve", "vn", "vg", "vi", "wf", "eh", "ye", "zm", "zw" 774 | ], 775 | ) 776 | region_entry.grid(row=3, column=1, padx=5, pady=2, sticky="ew") 777 | 778 | 779 | spoof_plat_var = tk.IntVar() 780 | spoof_plat_var.set(0) 781 | spoof_plat_var.trace_add("write", on_spoof_plat_change) 782 | spoof_plat_radio1 = ttk.Radiobutton( 783 | input_frame, text="No Spoofing", variable=spoof_plat_var, value=0 784 | ) 785 | spoof_plat_radio1.grid(row=4, column=0, columnspan=1, padx=5, pady=2, sticky="w") 786 | 787 | spoof_plat_radio2 = ttk.Radiobutton( 788 | input_frame, text="Mobile Camera Stream (gets no traffic)", variable=spoof_plat_var, value=1 789 | ) 790 | spoof_plat_radio2.grid(row=4, column=1, columnspan=1, padx=5, pady=2, sticky="w") 791 | 792 | spoof_plat_radio3 = ttk.Radiobutton( 793 | input_frame, text="Mobile Screenshare (gets no traffic)", variable=spoof_plat_var, value=2 794 | ) 795 | spoof_plat_radio3.grid(row=4, column=2, columnspan=1, padx=5, pady=2, sticky="w") 796 | 797 | replay_var = tk.BooleanVar() 798 | replay_checkbox = ttk.Checkbutton( 799 | input_frame, text="Generate Replay", variable=replay_var 800 | ) 801 | replay_checkbox.grid(row=5, column=0, columnspan=2, padx=5, pady=2, sticky="w") 802 | 803 | close_room_var = tk.BooleanVar(value=True) 804 | close_room_checkbox = ttk.Checkbutton( 805 | input_frame, text="Close Room When Close Stream", variable=close_room_var 806 | ) 807 | close_room_checkbox.grid( 808 | row=6, column=0, columnspan=2, padx=5, pady=2, sticky="w" 809 | ) 810 | 811 | age_restricted_var = tk.BooleanVar() 812 | age_restricted_checkbox = ttk.Checkbutton( 813 | input_frame, text="Age Restricted", variable=age_restricted_var 814 | ) 815 | age_restricted_checkbox.grid( 816 | row=7, column=0, columnspan=2, padx=5, pady=2, sticky="w" 817 | ) 818 | 819 | # File input 820 | thumbnail_path_var = tk.StringVar() 821 | 822 | thumbnail_label = ttk.Label(input_frame, text="Selected Thumbnail:") 823 | thumbnail_label.grid(row=8, column=0, padx=5, pady=5, sticky="w") 824 | 825 | thumbnail_entry = ttk.Entry(input_frame, textvariable=thumbnail_path_var, width=50) 826 | thumbnail_entry.grid(row=8, column=1, padx=5, pady=5, sticky="ew") 827 | 828 | browse_button = ttk.Button(input_frame, text="Browse", command=browse_image) 829 | browse_button.grid(row=8, column=2, padx=5, pady=5, sticky="ew") 830 | 831 | # Using LabelFrames for better organization 832 | spoofing_frame = ttk.LabelFrame(app, text="Spoofing Info") 833 | spoofing_frame.grid(row=1, column=0, padx=10, pady=5, sticky="nsew") 834 | spoofing_frame.columnconfigure(1, weight=1) 835 | spoofing_frame.grid_remove() 836 | 837 | # Additional fields for Mobile Camera Stream and Mobile Screenshare 838 | openudid_label = ttk.Label(spoofing_frame, text="OpenUDID") 839 | openudid_label.grid(row=0, column=0, padx=5, pady=2, sticky="w") 840 | 841 | openudid_entry = ttk.Entry(spoofing_frame) 842 | openudid_entry.grid(row=0, column=1, padx=5, pady=2, sticky="ew") 843 | 844 | device_id_label = ttk.Label(spoofing_frame, text="Device ID") 845 | device_id_label.grid(row=1, column=0, padx=5, pady=2, sticky="w") 846 | 847 | device_id_entry = ttk.Entry(spoofing_frame) 848 | device_id_entry.grid(row=1, column=1, padx=5, pady=2, sticky="ew") 849 | 850 | iid_label = ttk.Label(spoofing_frame, text="IID") 851 | iid_label.grid(row=2, column=0, padx=5, pady=2, sticky="w") 852 | 853 | iid_entry = ttk.Entry(spoofing_frame) 854 | iid_entry.grid(row=2, column=1, padx=5, pady=2, sticky="ew") 855 | 856 | create_device_button = ttk.Button( 857 | spoofing_frame, text="Generate Device", command=generate_device 858 | ) 859 | create_device_button.grid(row=3, column=0, padx=10, pady=5, sticky="ew") 860 | 861 | 862 | cookies_frame = ttk.LabelFrame(app, text="Cookies Info") 863 | cookies_frame.grid(row=2, column=0, padx=10, pady=5, sticky="nsew") 864 | cookies_frame.columnconfigure(1, weight=1) 865 | 866 | # Cookies status 867 | cookies_status = ttk.Label(cookies_frame, text="Checking cookies...") 868 | cookies_status.grid(row=1, column=0, padx=10, pady=5, sticky="ew") 869 | 870 | # Buttons 871 | login_button = ttk.Button( 872 | app, text="Login", command=login_thread, state=tk.DISABLED 873 | ) 874 | login_button.grid(row=3, column=0, padx=10, pady=5, sticky="ew") 875 | 876 | go_live_button = ttk.Button( 877 | app, text="Go Live", command=generate_stream, state=tk.DISABLED 878 | ) 879 | go_live_button.grid(row=4, column=0, padx=10, pady=5, sticky="ew") 880 | 881 | end_live_button = ttk.Button( 882 | app, text="End Live", command=end_stream 883 | ) 884 | end_live_button.grid(row=5, column=0, padx=10, pady=5, sticky="ew") 885 | 886 | save_config_button = ttk.Button(app, text="Save Config", command=save_config) 887 | save_config_button.grid(row=6, column=0, padx=10, pady=5, sticky="ew") 888 | 889 | # Outputs 890 | output_frame = ttk.LabelFrame(app, text="Outputs") 891 | output_frame.grid(row=0, column=1, rowspan=5, padx=10, pady=5, sticky="nsew") 892 | output_frame.columnconfigure(0, weight=1) 893 | 894 | server_entry = ttk.Entry(output_frame, state="readonly") 895 | server_entry.grid(row=0, column=0, padx=5, pady=2, sticky="ew") 896 | 897 | key_entry = ttk.Entry(output_frame, state="readonly") 898 | key_entry.grid(row=1, column=0, padx=5, pady=2, sticky="ew") 899 | 900 | url_entry = ttk.Entry(output_frame, state="readonly") 901 | url_entry.grid(row=2, column=0, padx=5, pady=2, sticky="ew") 902 | 903 | 904 | def copy_to_clipboard(content): 905 | app.clipboard_clear() 906 | app.clipboard_append(content) 907 | messagebox.showinfo("Copied", "Content copied to clipboard!") 908 | 909 | 910 | # Copy buttons for each Entry 911 | copy_server_button = ttk.Button( 912 | output_frame, 913 | text="Copy", 914 | command=lambda: copy_to_clipboard(server_entry.get()), 915 | ) 916 | copy_server_button.grid(row=0, column=1, padx=5, pady=2) 917 | 918 | copy_key_button = ttk.Button( 919 | output_frame, 920 | text="Copy", 921 | command=lambda: copy_to_clipboard(key_entry.get()), 922 | ) 923 | copy_key_button.grid(row=1, column=1, padx=5, pady=2) 924 | 925 | copy_url_button = ttk.Button( 926 | output_frame, 927 | text="Copy", 928 | command=lambda: copy_to_clipboard(url_entry.get()), 929 | ) 930 | copy_url_button.grid(row=2, column=1, padx=5, pady=2) 931 | 932 | check_cookies() 933 | load_config() 934 | 935 | app.mainloop() 936 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests>=2.31.0 2 | selenium>=4.19.0 3 | undetected-chromedriver>=2.1.1 4 | pyinstaller>=6.7.0 5 | setuptools>=75.2.0 6 | pytz>=2024.1 7 | pycryptodome>=3.20.0 8 | python-dotenv>=1.0.1 9 | --------------------------------------------------------------------------------