gorgon.py

 avatar
user_5449590
python
a year ago
11 kB
7
Indexable
import hashlib
import random
import struct
import json
import time

class Gorgon:
    def init(self, params: str, data: str, cookies: str) -> None:

        self.params  = params
        self.data    = data
        self.cookies = cookies

    def hash(self, data: str) -> str:
        _hash = str(
            hashlib.md5(
                data.encode()
            ).hexdigest()
        )

        return _hash

    def get_base_string(self) -> str:
        base_str = self.hash(self.params)
        base_str = (
            base_str + self.hash(self.data)
            if self.data
            else base_str + str(
                "0" 
                * 
                32
            )
        )
        base_str = (
            base_str + self.hash(self.cookies)
            if self.cookies
            else base_str + str(
                "0" 
                * 
                32
            )
        )

        return base_str

    def get_value(self) -> json:
        base_str = self.get_base_string()

        return self.encrypt(base_str)

    def encrypt(self, data: str) -> json:
        unix = int(time.time())
        len = 0x14
        key = [
            0xDF,
            0x77,
            0xB9,
            0x40,
            0xB9,
            0x9B,
            0x84,
            0x83,
            0xD1,
            0xB9,
            0xCB,
            0xD1,
            0xF7,
            0xC2,
            0xB9,
            0x85,
            0xC3,
            0xD0,
            0xFB,
            0xC3,
        ]

        param_list = []

        for i in range(0, 12, 4):
            temp = data[8 * i : 8 * (i + 1)]
            for j in range(4):
                H = int(temp[j * 2 : (j + 1) * 2], 16)
                param_list.append(H)

        param_list.extend([0x0, 0x6, 0xB, 0x1C])

        H = int(hex(unix), 16)

        param_list.append(
            (
                H & 0xFF000000
                ) 
            >> 24
        )
        param_list.append(
            (
                H & 0x00FF0000
                ) 
            >> 16
        )
        param_list.append(
            (
                H & 0x0000FF00
                )
            >> 8
        )
        param_list.append(
            (
                H & 0x000000FF
                )
            >> 0
        )

        eor_result_list = []

        for A, B in zip(param_list, key):
            eor_result_list.append(A ^ B)

        for i in range(len):

            C = self.reverse(eor_result_list[i])
            D = eor_result_list[
                (
                    i + 1
                    ) 
                % len
            ]
            E = C ^ D

            F = self.rbit_algorithm(E)
            H = (
                (
                    F ^ 0xFFFFFFFF
                    ) 
                ^ len
            ) & 0xFF
            eor_result_list[i] = H

        result = ""
        for param in eor_result_list:
            result += self.hex_string(param)

        return {
            "X-Gorgon": (
                "0404b0d30000" 
                + result
            ), 
            "X-Khronos": str(unix)
        }

    def rbit_algorithm(self, num):
        result = ""
        tmp_string = bin(num)[2:]

        while len(tmp_string) < 8:
            tmp_string = (
                "0" 
                + tmp_string
            )

        for i in range(0, 8):
            result = (
                result 
                + tmp_string[
                    7 - i
                ]
            )

        return int(result, 2)

    def hex_string(self, num):
        tmp_string = hex(num)[2:]

        if len(tmp_string) < 2:
            tmp_string = "0" + tmp_string

        return tmp_string

    def reverse(self, num):
        tmp_string = self.hex_string(num)

        return int(tmp_string[1:] + tmp_string[:1], 16)

class Xgorgon:
    digits = {c: i for i, c in enumerate("0123456789abcdefghijklmnopqrstuvwxyz")}
    HEX_STRS = [
        [30, 0, 224, 220, 147, 69, 1, 200],
        [30, 0, 224, 236, 147, 69, 1, 200],
        [30, 0, 224, 228, 147, 69, 1, 208],
        [30, 60, 224, 244, 147, 69, 0, 216],
        [30, 64, 224, 228, 147, 69, 0, 216],
        [30, 0, 224, 227, 147, 69, 1, 213],
        [30, 64, 224, 210, 147, 69, 0, 160],
        [30, 64, 224, 203, 147, 69, 0, 150],
        [30, 64, 224, 211, 147, 69, 0, 167],
        [30, 64, 224, 228, 147, 69, 0, 156],
        [30, 64, 224, 216, 147, 69, 0, 216],
        [30, 64, 224, 226, 147, 69, 0, 205],
        [30, 64, 224, 214, 147, 69, 0, 176],
        [30, 64, 224, 217, 147, 69, 0, 180],
        [30, 64, 224, 240, 147, 69, 0, 213],
        [30, 64, 224, 210, 147, 69, 0, 216],
        [30, 64, 224, 235, 147, 69, 0, 192],
        [30, 64, 224, 234, 147, 69, 0, 193],
        [30, 64, 224, 234, 147, 69, 0, 186],
        [30, 64, 224, 171, 147, 69, 0, 136],
        [30, 64, 224, 103, 147, 69, 0, 166],
        [30, 64, 224, 167, 147, 69, 0, 15],
        [30, 64, 224, 139, 147, 69, 0, 182],
        [30, 64, 224, 194, 147, 69, 0, 84],
        [30, 64, 224, 183, 147, 69, 0, 170],
        [30, 64, 224, 205, 147, 69, 0, 125],
        [30, 64, 224, 138, 147, 69, 0, 175],
        [30, 64, 224, 229, 147, 69, 0, 12],
        [30, 64, 224, 163, 147, 69, 0, 26],
        [30, 64, 224, 105, 147, 69, 0, 35],
        [30, 64, 224, 167, 147, 69, 0, 24],
    ]
    LEN = 20

    def calculate(
        self, params: str, cookie: (bool or str) = None, body: (bool or str) = None
    ):

        self.hex_str = random.choice(self.HEX_STRS)
        hash = self.getGorgonHash(params, body, cookie)
        hexEncryption = self.encryption()
        gorgonHash = self.init_hash(hash, hexEncryption)

        result = ""
        handle = self.handle(gorgonHash["gorgon"])

        for item in handle:
            result += self.hex2str(item)

        hash_1 = self.hex2str(self.hex_str[7])
        hash_2 = self.hex2str(self.hex_str[3])
        hash_3 = self.hex2str(self.hex_str[1])
        hash_4 = self.hex2str(self.hex_str[6])

        return {
            "X-Gorgon": "0404{}{}{}{}{}".format(hash_1, hash_2, hash_3, hash_4, result),
            "X-Khronos": str(hash["time"]),
        }

    def charCodeAt(self, str, i):
        return self.get_bianma((str[i:1]))

    def encryption(self):
        tmp = A = B = C = D = None
        hexs = []
        for i in range(256):
            hexs.append(i)

        for i in range(256):
            if i == 0:
                A = 0
            elif tmp is not None:
                A = tmp
            else:
                A = hexs[i - 1]
            B = self.hex_str[i % 8]
            if (A == 85) & (i != 1) & (tmp != 85):
                A = 0
            C = self.ensureMax(A + i + B)
            tmp = C if C < i else None
            D = hexs[C]
            hexs[i] = D
        return hexs

    def ensureMax(self, val, max=256):
        while val >= 256:
            val = val - 256
        return val

    def epoch(self):
        return int(round(time.time()))

    def convert_base(self, hex, base):
        return sum(
            self.digits[digit] * (base**i)
            for i, digit in enumerate(reversed(hex.lower()))
        )

    def fromHex(self, hex):
        return self.convert_base(hex, int(16))

    def getGorgonHash(
        self,
        url: str,
        data: (bool or str) = None,
        cookie: (bool or str) = None,
        encoding="UTF-8",
    ):
        gorgon = []
        times = int(round(time.time()))
        hexTime = self.to_hex(times)
        urlmd5 = hashlib.md5(url.encode("UTF-8")).hexdigest()

        rang = self.ranges(start=4)
        for i in rang:
            gorgon.append(self.fromHex(urlmd5[i * 2 : 2 * i + 2]))

        gorgon = gorgon + self.xgorgon_data(data, encoding)
        gorgon = gorgon + self.xgorgon_cookie(cookie, encoding)

        for i in rang:
            gorgon.append(0)

        for i in rang:
            gorgon.append(self.fromHex(hexTime[i * 2 : 2 * i + 2]))

        return {"gorgon": gorgon, "time": times}

    def handle(self, gorgonHash):
        rang = self.ranges(self.LEN)
        for i in rang:
            A = gorgonHash[i]
            B = self.reverse(A)
            C = int(gorgonHash[(i + 1) % self.LEN])
            D = B ^ C
            E = self.rbit(D)
            F = E ^ self.LEN
            G = ~F
            while G < 0:
                G += 4294967296

            a = self.to_hex(G)
            offset = len(a) - 2

            H = self.fromHex(self.to_hex(G)[offset:])
            gorgonHash[i] = H

        return gorgonHash

    def hex2str(self, num):
        tmp = self.to_hex(num)
        if len(tmp) < 2:
            tmp = "0" + tmp
        return tmp

    def init_hash(self, gorgonHash, hexEncryption):
        tmp_add = []
        tmp_hex = [] + hexEncryption
        A = B = C = D = E = F = G = None
        rang = self.ranges(self.LEN)
        for i in rang:
            A = gorgonHash["gorgon"][i]
            B = 0 if len(tmp_add) == 0 else tmp_add[-1]
            C = self.ensureMax(hexEncryption[i + 1] + int(B))
            tmp_add.append(C)
            D = tmp_hex[C]
            tmp_hex[i + 1] = D
            E = self.ensureMax(D + D)
            F = tmp_hex[E]
            G = A ^ F
            gorgonHash["gorgon"][i] = G

        return gorgonHash

    def ranges(self, start=0, stop=None, step=1):
        if stop is None:
            stop = start
            start = 0

        if ((step > 0) & (start >= stop)) or (step < 0) & (start <= stop):
            return []

        result = []

        for x in range(start, stop, step):
            result.append(x)

        return result

    def rbit(self, num):
        result = ""
        tmp = format(num, "b")

        while len(tmp) < 8:
            tmp = "0" + tmp

        rang = self.ranges(8)
        for i in rang:
            result += tmp[7 - i]
        return int(result, 2)

    def reverse(self, num):
        tmp = self.to_hex(num)
        if len(tmp) < 2:
            tmp = "0" + tmp

        return self.fromHex(tmp[1:10] + tmp[0:1])

    def to_hex(self, num):
        return format(int(num), "x")

    def xgorgon_cookie(self, cookie: str, encoding="utf-8"):
        gorgon = []
        rang = self.ranges(4)
        if (cookie is None) or (len(cookie) == 0):
            for i in rang:
                gorgon.append(0)
        else:
            hashstr = hashlib.md5(cookie.encode()).hexdigest()
            for i in rang:
                gorgon.append(self.fromHex(hashstr[i * 2 : 2 * i + 2]))

        return gorgon

    def xgorgon_data(self, data: str, encoding="utf-8"):
        gorgon = []
        data_md5 = None

        if (data is None) or (len(data) == 0):
            rang = self.ranges(4)
            for i in rang:
                gorgon.append(0)

        else:
            data_md5 = data

            if encoding == "octet":
                data_md5 = hashlib.md5(data.encode()).hexdigest()
            rang = self.ranges(4)

            for i in rang:
                gorgon.append(self.fromHex(data_md5[i * 2 : 2 * i + 2]))

        return gorgonxagrp