查看: 144|回复: 0

探讨关于整个字节全息的X-bogus和A-bogus

 荐 [复制链接]

2

主题

0

回帖

20

积分

版主

积分
20
发表于 2026-8-17 01:29:45 | 显示全部楼层 |阅读模式
探讨关于整个字节全系的X-bogus和A-bogus。算了直接给代码了:
  1. import hashlib
  2. import random
  3. from time import time
  4. from urllib.parse import urlencode

  5. # SM3 哈希(Python 3.11+ 标准库支持;更低版本可装 gmssl 替代)
  6. def sm3_hex(data: bytes) -> str:
  7.     return hashlib.new('sm3', data).hexdigest()


  8. def sm3_to_array(data) -> list:
  9.     """把 str/list 做 sm3 后输出 32 字节的 int 列表"""
  10.     if isinstance(data, str):
  11.         b = data.encode('utf-8')
  12.     else:
  13.         b = bytes(data)
  14.     h = sm3_hex(b)
  15.     return [int(h[i:i + 2], 16) for i in range(0, len(h), 2)]


  16. class ABogus:
  17.     __end_string = "cus"
  18.     __str = {
  19.         "s0": "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
  20.         "s1": "Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=",
  21.         "s2": "Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=",
  22.         "s3": "ckdp1h4ZKsUB80/Mfvw36XIgR25+WQAlEi7NLboqYTOPuzmFjJnryx9HVGDaStCe",
  23.         "s4": "Dkdpgh2ZmsQB80/MfvV36XI1R45-WUAlEixNLwoqYTOPuzKFjJnry79HbGcaStCe",
  24.     }

  25.     def __init__(self, user_agent: str = "", platform: str = None):
  26.         self.user_agent = user_agent
  27.         self.ua_code = self.generate_ua_code(user_agent)
  28.         self.browser = self.generate_browser_info(platform)
  29.         self.browser_len = len(self.browser)
  30.         self.browser_code = self.char_code_at(self.browser)

  31.     # ---------- UA 指纹 ----------
  32.     def generate_ua_code(self, user_agent: str) -> list:
  33.         numbers = [0.00390625, 1, 14]
  34.         key_string = ''.join(chr(int(num)) for num in numbers)
  35.         return sm3_to_array(self.generate_result(self.rc4_encrypt(user_agent, key_string), "s3"))

  36.     # ---------- 随机列表 ----------
  37.     def list_1(self, a=170, b=85, c=45) -> list:
  38.         return self.random_list(a, b, 1, 2, 5, c & a)

  39.     def list_2(self, a=170, b=85) -> list:
  40.         return self.random_list(a, b, 1, 0, 0, 0)

  41.     def list_3(self, a=170, b=85) -> list:
  42.         return self.random_list(a, b, 1, 0, 5, 0)

  43.     def random_list(self, b=170, c=85, d=0, e=0, f=0, g=0) -> list:
  44.         r = random.random() * 10000
  45.         v = [r, int(r) & 255, int(r) >> 8]
  46.         v.append(v[1] & b | d)
  47.         v.append(v[1] & c | e)
  48.         v.append(v[2] & b | f)
  49.         v.append(v[2] & c | g)
  50.         return v[-4:]

  51.     def from_char_code(self, *args):
  52.         return "".join(chr(code) for code in args)

  53.     def generate_string_1(self):
  54.         return (self.from_char_code(*self.list_1())
  55.                 + self.from_char_code(*self.list_2())
  56.                 + self.from_char_code(*self.list_3()))

  57.     # ---------- 参数指纹 ----------
  58.     def generate_string_2(self, url_params: str, method="GET") -> str:
  59.         a = self.generate_string_2_list(url_params, method)
  60.         e = self.end_check_num(a)
  61.         a.extend(self.browser_code)
  62.         a.append(e)
  63.         return self.rc4_encrypt(self.from_char_code(*a), "y")

  64.     def generate_string_2_list(self, url_params: str, method="GET") -> list:
  65.         start_time = int(time() * 1000)
  66.         end_time = start_time + random.randint(4, 8)
  67.         params_array = self.generate_params_code(url_params)
  68.         method_array = self.generate_method_code(method)
  69.         return self.list_4(
  70.             (end_time >> 24) & 255,
  71.             params_array[21],
  72.             self.ua_code[23],
  73.             (end_time >> 16) & 255,
  74.             params_array[22],
  75.             self.ua_code[24],
  76.             (end_time >> 8) & 255,
  77.             (end_time >> 0) & 255,
  78.             (start_time >> 24) & 255,
  79.             (start_time >> 16) & 255,
  80.             (start_time >> 8) & 255,
  81.             (start_time >> 0) & 255,
  82.             method_array[21],
  83.             method_array[22],
  84.             int(end_time / 256 / 256 / 256 / 256) >> 0,
  85.             int(start_time / 256 / 256 / 256 / 256) >> 0,
  86.             self.browser_len,
  87.         )

  88.     def list_4(self, a, b, c, d, e, f, g, h, i, j, k, m, n, o, p, q, r) -> list:
  89.         return [
  90.             44, a, 0, 0, 0, 0, 24, b, n, 0, c, d, 0, 0, 0, 1, 0, 239, e, o, f, g, 0, 0,
  91.             0, 0, h, 0, 0, 14, i, j, 0, k, m, 3, p, 1, q, 1, r, 0, 0, 0]

  92.     def end_check_num(self, a: list):
  93.         r = 0
  94.         for i in a:
  95.             r ^= i
  96.         return r

  97.     # ---------- base64 变体 ----------
  98.     def generate_result(self, s, e="s4"):
  99.         r = []
  100.         for i in range(0, len(s), 3):
  101.             if i + 2 < len(s):
  102.                 n = (ord(s[i]) << 16) | (ord(s[i + 1]) << 8) | ord(s[i + 2])
  103.             elif i + 1 < len(s):
  104.                 n = (ord(s[i]) << 16) | (ord(s[i + 1]) << 8)
  105.             else:
  106.                 n = ord(s[i]) << 16
  107.             for j, k in zip(range(18, -1, -6), (0xFC0000, 0x03F000, 0x0FC0, 0x3F)):
  108.                 if j == 6 and i + 1 >= len(s):
  109.                     break
  110.                 if j == 0 and i + 2 >= len(s):
  111.                     break
  112.                 r.append(self.__str[e][(n & k) >> j])
  113.         r.append("=" * ((4 - len(r) % 4) % 4))
  114.         return "".join(r)

  115.     def generate_method_code(self, method: str = "GET") -> list:
  116.         return sm3_to_array(sm3_to_array(method + self.__end_string))

  117.     def generate_params_code(self, params: str) -> list:
  118.         return sm3_to_array(sm3_to_array(params + self.__end_string))

  119.     # ---------- 浏览器指纹 ----------
  120.     def generate_browser_info(self, platform: str = "Win32") -> str:
  121.         inner_width = random.randint(1280, 1920)
  122.         inner_height = random.randint(720, 1080)
  123.         outer_width = random.randint(inner_width, 1920)
  124.         outer_height = random.randint(inner_height, 1080)
  125.         screen_x = 0
  126.         screen_y = random.choice((0, 30))
  127.         value_list = [
  128.             inner_width, inner_height, outer_width, outer_height,
  129.             screen_x, screen_y, 0, 0,
  130.             outer_width, outer_height, outer_width, outer_height,
  131.             inner_width, inner_height, 24, 24, platform,
  132.         ]
  133.         return "|".join(str(i) for i in value_list)

  134.     def char_code_at(self, s):
  135.         return [ord(char) for char in s]

  136.     # ---------- rc4 ----------
  137.     def rc4_encrypt(self, plaintext, key):
  138.         s = list(range(256))
  139.         j = 0
  140.         for i in range(256):
  141.             j = (j + s[i] + ord(key[i % len(key)])) % 256
  142.             s[i], s[j] = s[j], s[i]
  143.         i = 0
  144.         j = 0
  145.         cipher = []
  146.         for k in range(len(plaintext)):
  147.             i = (i + 1) % 256
  148.             j = (j + s[i]) % 256
  149.             s[i], s[j] = s[j], s[i]
  150.             t = (s[i] + s[j]) % 256
  151.             cipher.append(chr(s[t] ^ ord(plaintext[k])))
  152.         return ''.join(cipher)

  153.     # ---------- 对外接口 ----------
  154.     def generate_a_bogus(self, url_params: dict | str) -> str:
  155.         if isinstance(url_params, dict):
  156.             url_params = urlencode(url_params)
  157.         string_1 = self.generate_string_1()
  158.         string_2 = self.generate_string_2(url_params)
  159.         string = string_1 + string_2
  160.         return self.generate_result(string, "s4")


  161. if __name__ == "__main__":
  162.     bogus = ABogus("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36")
  163.     print(bogus.generate_a_bogus({"aweme_id": "7400044629845970202", "cursor": "0", "count": "20"}))
复制代码
这是X-bogus:
  1. import hashlib
  2. import random


  3. def rc4_bytes(key: bytes, data: bytes) -> bytes:
  4.     S = list(range(256))
  5.     j = 0
  6.     for i in range(256):
  7.         j = (j + S[i] + key[i % len(key)]) % 256
  8.         S[i], S[j] = S[j], S[i]
  9.     i = j = 0
  10.     result = bytearray()
  11.     for byte in data:
  12.         i = (i + 1) % 256
  13.         j = (j + S[i]) % 256
  14.         S[i], S[j] = S[j], S[i]
  15.         k = S[(S[i] + S[j]) % 256]
  16.         result.append(byte ^ k)
  17.     return bytes(result).decode('iso-8859-1')


  18. qlist = {'bogusIndex': 0, 'envcode': 1}
  19. ucode = {'ubcode': 0}


  20. def action_valid():
  21.     bits = [random.getrandbits(1) for _ in range(8)]
  22.     ucode['ubcode'] = bits[0] | bits[1] | bits[2] | bits[3] | bits[4] | bits[5] | bits[6] | bits[7]
  23.     ucode['ubcode'] &= ~126


  24. def xbogus_fun(protocol, revent_flag, arg3, in_salt, data):
  25.     """生成 X-Bogus。data 是 query 字符串的 md5 字节"""
  26.     action_valid()
  27.     in_salt = in_salt or ''
  28.     in_salt_md5 = hashlib.md5(in_salt.encode('utf-8')).digest()
  29.     if data is None:
  30.         data = b'00000000000000000000000000000000'

  31.     uArray = bytearray(9)
  32.     pad_string = (protocol << 6) | (revent_flag << 5) | ((int(random.random() * 100) & 1) << 4) | 0
  33.     qlist['bogusIndex'] += 1
  34.     bogusIndex = qlist['bogusIndex'] & 0x3f
  35.     uArray[0] = (arg3 << 6) | bogusIndex
  36.     uArray[1] = (qlist['envcode'] >> 8) & 255
  37.     uArray[2] = qlist['envcode'] & 255
  38.     uArray[3] = ucode['ubcode']
  39.     in_salt_md5_md5 = hashlib.md5(in_salt_md5).digest()
  40.     uArray[4] = in_salt_md5_md5[14]
  41.     uArray[5] = in_salt_md5_md5[15]
  42.     data_md5 = hashlib.md5(data).digest()
  43.     uArray[6] = data_md5[14]
  44.     uArray[7] = data_md5[15]
  45.     uArray[8] = int(random.random() * 255) & 255
  46.     return xcrypto(pad_string, uArray)


  47. def xcrypto(pad_string, ostring):
  48.     length = len(ostring)
  49.     uarray = bytearray(length + 1)
  50.     ieor = 0
  51.     for i in range(length):
  52.         uarray[i] = ostring[i]
  53.         ieor ^= ostring[i]
  54.     uarray[length] = ieor
  55.     random_key = random.randint(0, 255)
  56.     crypted_text = rc4_bytes(bytes([random_key]), bytes(uarray))
  57.     result = chr(pad_string) + chr(random_key) + crypted_text
  58.     return dy_base64(result, 's1')


  59. def dy_base64(data: str, mindex: str, pad: str = "=") -> str:
  60.     letters = {
  61.         "s1": "Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=",
  62.         "s4": "Dkdpgh2ZmsQB80/MfvV36XI1R45-WUAlEixNLwoqYTOPuzKFjJnry79HbGcaStCe",
  63.     }
  64.     ua_table = letters[mindex]
  65.     data_bytes = data.encode('iso-8859-1')
  66.     out = ""
  67.     i = 0
  68.     while i < len(data_bytes):
  69.         c1 = data_bytes[i]; i += 1
  70.         c2 = data_bytes[i] if i < len(data_bytes) else None; i += 1
  71.         c3 = data_bytes[i] if i < len(data_bytes) else None; i += 1
  72.         combined = ((c1 & 0xff) << 16) | ((c2 & 0xff) << 8 if c2 is not None else 0) | (c3 & 0xff if c3 is not None else 0)
  73.         out += ua_table[(combined >> 18) & 0x3f]
  74.         out += ua_table[(combined >> 12) & 0x3f]
  75.         out += ua_table[(combined >> 6) & 0x3f] if c2 is not None else pad
  76.         out += ua_table[combined & 0x3f] if c3 is not None else pad
  77.     return out


  78. def generate(params: dict) -> str:
  79.     """便捷接口:传入参数字典,返回 X-Bogus"""
  80.     query = '&'.join(f'{k}={v}' for k, v in params.items())
  81.     data_md5 = hashlib.md5(query.encode()).digest()
  82.     return xbogus_fun(1, False, 0, None, data_md5)


  83. if __name__ == "__main__":
  84.     print(generate({'device_platform': 'android', 'aid': '6383', 'count': '1'}))
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖
关注公众号
返回顶部