pc端小程序抓包修改数据相关记录

看了很多关于小程序抓包的 废话不多说直接演示

一、小程序抓包

1.所需要的工具 官网下载即可:
https://www.charlesproxy.com/latest-release/download.do
我这里用的 Charles-proxy-4.6.6-win64

需要中文破解参考
https://www.jianshu.com/p/4d67dbbf2f6a

2、破解使用,在线生成 注册名和注册秘钥
工具地址:https://www.zzzmode.com/mytools/charles/
用工具生成 随意输入名称
在这里插入图片描述

下载完成点开后 点击help菜单的register charles 将生成的名称和密钥输入

3、安装https证书
点击help菜单 点击SSL proxying 点击install charles Root Certificate
下载完成双击安装到本地计算机
在这里插入图片描述
4、设置HTTPS端口

菜单栏 Proxy -> SSL Proxying Settings 打开 SSL Proxying Settings配置面板
我这里抓包的是次神的游戏小程序 我这里直接填了相关的主域名 抓所有域名可以用 * 号代替
在这里插入图片描述
勾选上windows proxy
完成后可以启动小程序
接口数据

{
	"track": "133:127:315501608:1721726225",
	"result": {
		"code": 0,
		"userId": 67759270,
		"appId": 9999,
		"purl": "https://thirdwx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTKqzZkhQUUedrdnsA1G94gQqU6Jz7kcgufiaSiaZHfBuibMjNBhT3Hodxal2yMEdvPkau6LEcaiciaMVJg/132",
		"authorCode": "eyJ1aWQiOiA2Nzc1OTI3MCwgInVuYW1lIjogIlx1N2IxOVx1NGViYSIsICJlbWFpbCI6ICIiLCAiY29pbiI6IDAsICJhcHBJZCI6IDk5OTksICJjbGllbnRJZCI6ICJINV81LjJfd2VpeGluLndlaXhpbi4wLWhhbGwyMDU1MS53ZWl4aW4uZ3Vhbmd6angyIiwgImNsaWVudElwIjogIjExMy4xMDYuODcuMTg2IiwgInV0b2tlbiI6ICIyMDI0LTA3LTIzIDA4OjE0OjA3LjExMDc2NSIsICJ1dGltZSI6ICIyMDI0LTA3LTIzIDE3OjE3OjA1LjkzNTc1MyIsICJzaWduIjogIjc1ZjIwNjYzY2VhYzEyY2QyY2M3MjJiN2QwMzY5OGIwIiwgIm1fc2lnbiI6ICJlZGMyMzFjNDQyZDQxMzg3ZDU3OTA0ZWRlNGY2MzhjYiJ9",
		"userName": "\u7b19\u4eba",
		"userEmail": "",
		"isCreate": 0,
		"userType": 4,
		"snsId": "wxapp:oHqqn5CpW03iudjGxJbcBrtS0klg",
		"userPwd": "ef29642cd1afc49accf5cfd1a26e1cc5e3c7fdd6153522db9c0384247e383dec",
		"mobile": "",
		"changePwdCount": 0,
		"log_report": 0,
		"exception_report": 0,
		"360.vip": 0,
		"connectTimeOut": 35,
		"heartBeat": 6,
		"tcpsrv": {
			"ip": "133-slm-wss-online.tytuyoo.com",
			"port": 6001,
			"wsport": 443
		},
		"logclient": {
			"logreporturl": "",
			"loguploadurl": ""
		},
		"authInfo": "{\"authcode\": \"eyJ1aWQiOiA2Nzc1OTI3MCwgInVuYW1lIjogIlx1N2IxOVx1NGViYSIsICJlbWFpbCI6ICIiLCAiY29pbiI6IDAsICJhcHBJZCI6IDk5OTksICJjbGllbnRJZCI6ICJINV81LjJfd2VpeGluLndlaXhpbi4wLWhhbGwyMDU1MS53ZWl4aW4uZ3Vhbmd6angyIiwgImNsaWVudElwIjogIjExMy4xMDYuODcuMTg2IiwgInV0b2tlbiI6ICIyMDI0LTA3LTIzIDA4OjE0OjA3LjExMDc2NSIsICJ1dGltZSI6ICIyMDI0LTA3LTIzIDE3OjE3OjA1LjkzNTc1MyIsICJzaWduIjogIjc1ZjIwNjYzY2VhYzEyY2QyY2M3MjJiN2QwMzY5OGIwIiwgIm1fc2lnbiI6ICJlZGMyMzFjNDQyZDQxMzg3ZDU3OTA0ZWRlNGY2MzhjYiJ9\", \"account\": \"\", \"uid\": 67759270, \"usercode\": \"\"}",
		"token": "f80ae534-e617-4049-8ee8-1ab550082cd7",
		"jwttoken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjAifQ.eyJzb21lIjp7InVpZCI6Njc3NTkyNzAsImNsaWVudElkIjoiSDVfNS4yX3dlaXhpbi53ZWl4aW4uMC1oYWxsMjA1NT
	}
}

在这里插入图片描述
这里已经正常捉包了
但是这里发现 所有数据传输都走的websocket连接
这里我们想修改数据 只能截取会话模拟客户端和服务端的交互

二、mitmproxy监听会话数据修改

1、mitmproxy安装
pip install mitmproxy

2、编写修改脚本

这里的数据都是二进制流处理 我加上的数据都是基础属性

from mitmproxy import ctx, websocket


import logging
import warnings

# 忽略所有 UserWarning 警告
warnings.filterwarnings("ignore", category=UserWarning)

# 1、设置全局的日志格式和级别
logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s',
                    datefmt='%m/%d/%Y %H:%M:%S',
                    level=logging.INFO)

# 2、获取logger (给日志器起个名字 "__name__")
logger = logging.getLogger(__name__)# __name__内置变量模块名称,轻松地识别出哪个模块产生了哪些日志消息(主程序模块)

# 3、创建文件处理器,指定日志文件和日志级别(局部)---文件输出FileHandle(输出到指定文件)
file_handler = logging.FileHandler('app.log') #指定日志文件名application.log,默认在当前目录下创建
file_handler.setLevel(logging.INFO) # 设置日志级别(只输出对应级别INFO的日志信息)
# 设置日志格式
file_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s', '%m/%d/%Y %H:%M:%S'))

# 4、添加文件处理器到logger
logger.addHandler(file_handler)

# 训练模型的代码
epoch = 7
# 记录日志信息
logger.info("Get better performance at epoch {}".format(epoch))



class WebSocketModifier:
    def websocket_message(self, flow: websocket.WebSocketFlow):
        try:
            message = flow.messages[-1]
            if message.from_client:
                logger.info("客户端发送数据--------------------------------")
                # 检查消息类型
                if message.type == 2:
                    # 打印原始客户端二进制消息
                    logger.info(f"Original client binary message: {message.content}")


                    # cs
                    c = b'\n\tWSPingReq'
                    if c in message.content:
                        # 构建新的消息
                        modified_content = b'\x1d\x00\x00\x00\x03\x00\x00\x00\x00x`\xfe\x8fA\x94\xce\x03\xff\xcc\x0f\xaaAttackProp\x01\x00'
                        logger.info(f"------------------找到以指定的字节开头--------------------: {message.content}")
                        # 替换消息内容
                        message.content = modified_content

                        # 打印修改后的消息
                        logger.info(f"Modified client binary message: {message.content}")


                    # 检查消息是否以指定的字节开头
                    if message.content.startswith(b'\x19\x00\x00\x00\x03\x00\x00\x00\x00x`\xfe\x8fA\x94\xce\x03\xff\xcc\x0f\xa6HpProp\x01\x00'):

                        # 构建新的消息
                        modified_content = b'\x1d\x00\x00\x00\x03\x00\x00\x00\x00x`\xfe\x8fA\x94\xce\x03\xff\xcc\x0f\xaaAttackProp\x01\x00'
                        modifined_str = b'\r\x00\x00\x00a\x14\x00\x00\x00x`\xfe\x8fA\x92\x01\n'
                        logger.info(f"------------------找到以指定的字节开头--------------------: {message.content}")
                        # 替换消息内容
                        message.content = modifined_str

                        # 打印修改后的消息
                        logger.info(f"Modified client binary message: {message.content}")
            else:

                # 需要修改的原始数据
                logger.info("服务端发送数据--------------------------------")
                original_data = b'\xafnot enouth item'

                # 新的数据
                new_data = b'\x0f\x00\x00\x00\xb1\xeb\x00\x00\x00x`\xfe\x8fA\x92\x00\xa2OK'

                a = b'\xafitem not enough\xc4\x01\x80\xc4\x01\x80'

                b = b'\xa1\x00\x00\x00\x9f\xeb\x00\x00\x00x`\xfe\x8fA\x94\x00\xa2OK\xc4y\x86\x00\x83\x00\xce\x00\xa8\xea;\x01\xcb@$\x00\x00\x00\x00\x00\x00\x02\x00\x01\x83\x00\xce\x00\xa9\x15)\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x02\x83\x00\xce\x00\xa8.\xb9\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x03\x83\x00\xce\x00\xa8\x03\xbb\x01\xcb@I\x00\x00\x00\x00\x00\x00\x02\x00\x04\x83\x00\xce\x00\xa9\xe0]\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x05\x83\x00\xce\x00\xa8.\xb9\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\xc4\x15\x81\x00\x83\x00\xce\x00\xa8\x03\xba\x01\xcbQ\xb1\xa0\xaf\xf8\x86P\xc6\x02\x00'
                b2 = b'\x00\x01\x00\x00\x18\xfc\x00\x00\x00x`\xfe\x8fA\x91\x83\x17\x85\xce\x00\xa8.\xb9\x81\x01\xcb@\x00\x00\x00\x00\x00\x00\x00\xce\x00\xab4"\x81\x01\xcb@r \x00\x00\x00\x00\x00\xce\x00\xa8\xea;\x81\x01\xcb@\x94\xb8\x00\x00\x00\x00\x00\xce\x00\xa8\x03\xba\x81\x01\xcbQ\xd6"\x1b\x0c\xe5E\x08\xce\x00\xa8\x03\xbb\x81\x01\xcb@\xb5\x9a\x00\x00\x00\x00\x00\x1d\x8e\xce\x03\x0b\x9a\xe9\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xeb\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xec\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xed\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xee\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xef\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf0\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf1\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf2\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf3\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf4\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf5\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf6\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf7\x81\x01\xcd\x01"N\x82\x01\x81\x01\x81\x00\xcd\x02\xf9\x00\x81\xce\x00\xa9\xe0]\x81\x02\x02'

                b3 = b'8\x03\x00\x00\x9f\xeb\x00\x00\x00x`\xfe\x8fA\x94\x00\xa2OK\xc4\xc9\x8a\x00\x83\x00\xce\x00\xa8\xea2\x01\xcb@\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x83\x00\xce\x00\xa8*\xc9\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x02\x83\x00\xce\x00\xa8*\xcb\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x03\x83\x00\xce\x00\xa8\xea3\x01\xcb@\x00\x00\x00\x00\x00\x00\x00\x02\x00\x04\x83\x00\xce\x00\xb7\x1bn\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x05\x83\x00\xce\x00\xa9\xe0q\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x06\x83\x00\xce\x00\xa8*\xc9\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x07\x83\x00\xce\x00\xa8\xea;\x01\xcb@$\x00\x00\x00\x00\x00\x00\x02\x00\x08\x83\x00\xce\x00\xa8\xea2\x01\xcb@\x00\x00\x00\x00\x00\x00\x00\x02\x00\t\x83\x00\xce\x00\xa9\xe4O\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\xc5\x02[\xde\x00\x1e\x00\x83\x00\xce\x00\xa8U\xca\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x01\x83\x00\xce\x00\xa8Q\xe9\x01\xcb@\x08\x00\x00\x00\x00\x00\x00\x02\x00\x02\x83\x00\xce\x00\xa8U\xcf\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x03\x83\x00\xce\x00\xa8U\xd1\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x04\x83\x00\xce\x00\xa8U\xd3\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x05\x83\x00\xce\x00\xa8Q\xe7\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x06\x83\x00\xce\x00\xa8U\xcb\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x07\x83\x00\xce\x00\xa8Q\xe0\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x08\x83\x00\xce\x00\xa8U\xd0\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\t\x83\x00\xce\x00\xa8Q\xe8\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\n\x83\x00\xce\x00\xa8Q\xea\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x0b\x83\x00\xce\x00\xa8U\xcd\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x0c\x83\x00\xce\x00\xa8Q\xec\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\r\x83\x00\xce\x00\xa8\xa0\x03\x01\xcb@\x00\x00\x00\x00\x00\x00\x00\x02\x00\x0e\x83\x00\xce\x00\xa8\xa0\x06\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x0f\x83\x00\xce\x00\xa8\xa0\x02\x01\xcb@\x00\x00\x00\x00\x00\x00\x00\x02\x00\x10\x83\x00\xce\x00\xa8\x9f\xfb\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x11\x83\x00\xce\x00\xa8\x9f\xfc\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x12\x83\x00\xce\x00\xa8\xa0\x04\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x13\x83\x00\xce\x00\xa8\xa0\x00\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x14\x83\x00\xce\x00\xa8\x9f\xfd\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x15\x83\x00\xce\x00\xa8x\xec\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x16\x83\x00\xce\x00\xa8x\xff\x01\xcb@\x00\x00\x00\x00\x00\x00\x00\x02\x00\x17\x83\x00\xce\x00\xa8x\xea\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x18\x83\x00\xce\x00\xa8x\xf5\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x19\x83\x00\xce\x00\xa8x\xfd\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x1a\x83\x00\xce\x00\xa8x\xfb\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x1b\x83\x00\xce\x00\xa8y\x00\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x1c\x83\x00\xce\x00\xa8x\xfe\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x1d\x83\x00\xce\x00\xa8x\xef\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00'




                # logger.info(f"####################### Original data : {message.content}")

                if a in message.content:

                    logger.info(f"okkkkkkkk Data modified successfully.")

                    # 新的多条消息
                    new_messages = [
                        b'\xa1\x00\x00\x00\x9f\xeb\x00\x00\x00x`\xfe\x8fA\x94\x00\xa2OK\xc4y\x86\x00\x83\x00\xce\x00\xa8\xea;\x01\xcb@$\x00\x00\x00\x00\x00\x00\x02\x00\x01\x83\x00\xce\x00\xa9\x15)\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x02\x83\x00\xce\x00\xa8.\xb9\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x03\x83\x00\xce\x00\xa8\x03\xbb\x01\xcb@I\x00\x00\x00\x00\x00\x00\x02\x00\x04\x83\x00\xce\x00\xa9\xe0]\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\x05\x83\x00\xce\x00\xa8.\xb9\x01\xcb?\xf0\x00\x00\x00\x00\x00\x00\x02\x00\xc4\x15\x81\x00\x83\x00\xce\x00\xa8\x03\xba\x01\xcbQ\xb1\xa0\xaf\xf8\x86P\xc6\x02\x00',
                        b'\x00\x01\x00\x00\x18\xfc\x00\x00\x00x`\xfe\x8fA\x91\x83\x17\x85\xce\x00\xa8.\xb9\x81\x01\xcb@\x00\x00\x00\x00\x00\x00\x00\xce\x00\xab4"\x81\x01\xcb@r \x00\x00\x00\x00\x00\xce\x00\xa8\xea;\x81\x01\xcb@\x94\xb8\x00\x00\x00\x00\x00\xce\x00\xa8\x03\xba\x81\x01\xcbQ\xd6"\x1b\x0c\xe5E\x08\xce\x00\xa8\x03\xbb\x81\x01\xcb@\xb5\x9a\x00\x00\x00\x00\x00\x1d\x8e\xce\x03\x0b\x9a\xe9\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xeb\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xec\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xed\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xee\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xef\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf0\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf1\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf2\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf3\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf4\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf5\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf6\x81\x01\xcd\x01"\xce\x03\x0b\x9a\xf7\x81\x01\xcd\x01"N\x82\x01\x81\x01\x81\x00\xcd\x02\xf9\x00\x81\xce\x00\xa9\xe0]\x81\x02\x02',
                        b'\n\x0eNewMessagePush\x12\xc7\x02\nu\n`\x08\x01\x12%C10050_serverId_C10050_partitionId_81\x1a"\xe6\x8d\xa2\xe5\x8d\xa1\xef\xbc\x8c\xe5\xa4\x9a\xe7\xba\xa2\xe6\xa1\x839\xef\xbc\x8c\xe7\xbc\xba\xe5\xa4\xa7\xe5\xb0\x8f\xe7\x8e\x8b \x01(\x86\xbb\xb8\xc8\x8e20\xbc\xa6\x83 @\xd4\x0cP\x00\x12\x11\x08\x93\x8d\xe7\xba\xef\xa3\x91\xb4!\x10\xcd\xbd\xb8\xc8\x8e2\x12\xcd\x01\x08\xbc\xa6\x83\x12\xc5\x01\x08\xbc\xa6\x83 \x12\x0c\xe5\xa4\xaa\xe4\xb8\x8a\xe5\x8d\x81\xe6\x88\x92\x18\xd4\x0c"\x02zh(\x01R\x06321505Z\x06\xe6\xb8\x85\xe9\x85\x92`\x01\xa2\x01\x0819010012\xa2\x06\x85\x01\x89\xa8userName\xac\xe5\xa4\xaa\xe4\xb8\x8a\xe5\x8d\x81\xe6\x88\x92\xa8playerId\xce\x04\x00\xd3<\xa7userPic\xa819010012\xa9guildName\xa6\xe6\xb8\x85\xe9\x85\x92\xaduserHeadFrame\xce\x00\xa9\xff\x88\xa5title\x00\xa6bubble\xce\x00\xaa\x07X\xa2fp\xcbG\xde:\x96\xce\xdd\xd6b\xa8serverId\xcd\x06T\xb2\x06\x00\x18\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01'

                    ]

                    # 删除原始消息
                    flow.messages.pop()

                    # 发送多条新消息
                    for new_message in new_messages:
                        # 创建新消息并设置内容
                        new_msg = websocket.WebSocketMessage(
                            type=2,  # 二进制消息类型
                            from_client=False,
                            content=new_message,

                        )
                        # 发送消息
                        flow.messages.append(new_msg)
                    logger.info("Data modified and split into multiple messages successfully.")


                if original_data in message.content:
                    logger.info("Original data found, modifying...")
                    modified_message = new_data
                    message.content = modified_message
                    logger.info(f"Data modified successfully.: {message.content}")



        except AttributeError as e:
            ctx.log.error(f"AttributeError: {e}")
        except Exception as e:
            ctx.log.error(f"Unexpected error: {e}")

    def websocket_error(self, flow: websocket.WebSocketFlow):
        # 处理 WebSocket 错误
        ctx.log.error(f"WebSocket error: {flow}")
        ctx.log.error(f"Messages: {flow.messages}")

addons = [
    WebSocketModifier()
]

3、安装证书
浏览器访问http://mitm.it/

4、修改计算机代理
在这里插入图片描述

5、启动
在目录的命令行中 执行
mitmdump -s mx5.py
在这里插入图片描述
完成后可在命令行看数据过程

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值