看了很多关于小程序抓包的 废话不多说直接演示
一、小程序抓包
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
完成后可在命令行看数据过程