吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 13059|回复: 127
收起左侧

[Web逆向] [2022.9.28]羊了个羊协议分析

  [复制链接]
124630608 发表于 2022-9-24 15:54
本帖最后由 124630608 于 2022-9-29 16:09 编辑

本文需要3个前提
  • 会使用https抓包工具
  • 小程序wxapkg解密和解包工具 解密工具很多 解包推荐wxappUnpacker
  • 一定编程基础,用自己编程语言实现

协议分析
1. 地图信息 https://cat-match.easygame2021.com/sheep/v1/game/map_info_ex?matchType=3
  关于http头t字段 登录小程序得到的账号信息
  {"err_code":0, "err_msg":"", "data":{"map_seed":[533201918,662591713,712900982,353412173], "map_seed_2":"1666869550", "map_md5":["046ef1bab26e5b9bfe2473ded237b572", "b5b742de1506849f1c1cf2fd2d10dfce"]}}
  map_seed 游戏初始化随机数种子
  map_md5 两关配置数据md5值
  map_seed_2 游戏结束用到

2. 第二张地图配置 https://cat-match-static.easygame2021.com/maps/b5b742de1506849f1c1cf2fd2d10dfce.txt
  {"widthNum":8,"heightNum":10,"levelKey":90024,"blockTypeData":{"1":4,"2":4,"3":4,"4":4,"5":5,"6":5,"7":4,"8":4,"9":4,"10":4,"11":4,"12":4,"13":4,"14":5,"16":5},"levelData":{"1":[{"id":"1-28-32","type":0,"rolNum":28,"rowNum":32,"layerNum":1,"moldType":1,"blockNode":null},}}
  levelKey 关卡id
  blockTypeData 方块类型:消除组数 *3 三个消除
    "blockTypeData": {
        "1": 4,  //"1":4 表示小草 4组 4*3 12个块
        "2": 4, //"2":4 表示胡萝卜 4组 4*3 12个块
        "3": 4,
        "4": 4,
        "5": 5,
        "6": 5,
        "7": 4,
        "8": 4,
        "9": 4,
        "10": 4,
        "11": 4,
        "12": 4,
        "13": 4,
        "14": 5,
        "16": 5
    },  levelData layerNum层 rolNum列 rowNum行 type类型 24号总192个消除块类型全部是随机 根据map_seed随机数种子初始化地图
    "0": "随机",
    "1": "小草",
    "2": "胡萝卜",
    "3": "玉米",
    "4": "树桩",
    "5": "叉子",
    "6": "白菜",
    "7": "饭团",
    "8": "刷子",
    "9": "剪刀",
    "10": "牛奶",
    "11": "脸盆",
    "12": "手套",
    "13": "铃铛",
    "14": "火苗",
    "15": "毛线",
    "16": "草堆",
    "17+": "白板"

3. 游戏结束发送请求 POST https://cat-match.easygame2021.com/sheep/v1/game/game_over_ex?
{"rank_score":1,"rank_state":1,"rank_time":233,"rank_role":2,"skin":1,"MatchPlayInfo":"...","MapSeed2":"...","Version":"0.0.1"}
rank_score: 1固定
rank_state: 1过关 2失败
rank_time: 游戏时间秒
rank_role: 1未使用道具 2使用过道具
skin: 1 换装皮肤id
MapSeed2:  第一个包中的map_seed_2
Version: 25号新增,固定
MatchPlayInfo: base64编码protobuf 即游戏点击记录 移出道具 多3个操作 撤销道具 多1个操作
proto数据定义
message MatchPlayInfo {
    message MatchStepInfo {
        required int32 chessIndex = 1;
        required int32 timeTag = 2;
    }
    required  int32 gameType = 1;
    optional  int32 mapId = 2;
    optional  int32 mapSeed = 3;
    repeated MatchStepInfo stepInfoList = 4;
}
只用到2个字段 gameType 和 stepInfoList
gameType: 3每日挑战 0GAMEMAIN 1GAMETOMB 2过关挑战 4话题挑战
stepInfoList 列表 chessIndex 块id 从第1层0开始编号
timeTag 之前是操作间隔毫秒 24号改成type即方块初始化后的类型

MatchPlayInfo google protobuf to json数据如下
{
  "gameType": 3,
  "stepInfoList": [
    {
      "chessIndex": 176,
      "timeTag": 2
    },
......
  ]
}

(觉的是游戏更新操作加了Version之后失效 游戏可以过关 不加次数 当天不能玩) 思路通过blockTypeData和levelData 生成stepInfoList即操作记录 即先0开始编号chessIndex并按-layerNum,type,moldType字段升序排序  再把type=0类型按blockTypeData结构中的类型和数量顺序修改,最后结果发送到服务器即可过关

回复讨论协议更好的思路, 不要涉及工具使用 礼貌回帖 zsbd
protobuf python 实现 论坛jingtai123
道具操作的id含义
-1 移出道具
-2 撤回道具
-3 洗牌道具
-4 复活道具

附件nodejs功能根据随机初始化种子跟游戏一样游戏初始化 有点复杂说不清楚了 看附件源码 附件地图是28号的

思路在游戏图上递归找出游戏的一个解退出 解就是路径 搜索树 (计算机系的可以当一道ACM题来解 算法好的大神可以科普更优算法)
覆盖 块有没有覆盖只需上面的层判断行列值的绝对值差小于8 就是被覆盖  块的逻辑宽高是8
当前可以操作的块列表 即没有被覆盖的所有块
复活道具=满了撤回道具+移出道具
移出道具移除3个块 叠的位置是固定 往上层
伪代码:
递归函数(图状态, 消除块id)
    消除操作更新状态
    无解使用道具更新图状态
    判断游戏结束退出
    找出当前可以操作块列表可消对优先,循环操作块列表
           递归函数(图状态, 消除块id)

不使用道具消除142块后一直计算  用道具157  差45 穷举深度100多层速度已经很慢了
可以不使用道具提示前140+ 后面自己操作看看
===============================
写一个软件分析下算法操作记录的 用着发现可以天眼看全图 分析底层块分布 抓包修改sheeps.js map_info_ex和LevelMapData可以跟手机或电脑同步

52仅3M软件太大了无法上传
链接:https://pan.baidu.com/s/1hftmbwk2F4iHOCZX8KXWdg
提取码:5252

看标题操作

看标题操作

手机

手机

免费评分

参与人数 11吾爱币 +16 热心值 +11 收起 理由
小白33421 + 1 + 1 大神,网盘连接挂了
sunlewuyou + 1 + 1 用心讨论,共获提升!
snailcn + 1 + 1 用心讨论,共获提升!
J0nny + 1 + 1 大神,网盘连接挂了
yecedo + 1 + 1 链接没有了。
q132130 + 1 + 1 有没有手动通的抓包数据发来分析分析
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
covfefe + 1 + 1 用心讨论,共获提升!
gugouo163 + 1 + 1 用心讨论,共获提升!
Mr_huang + 1 用心讨论,共获提升!
jianghj + 1 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ljq8896 发表于 2022-9-27 15:00
本帖最后由 ljq8896 于 2022-9-27 15:01 编辑
SunerC 发表于 2022-9-26 19:40
没看懂你那个思路,能举个例子吗?  

我也有个方法 在personal_info那个请求中修改里面win_count的返回 ...

小游戏的排行榜数据存储在微信服务器上,不在小游戏开发者服务器,小程序从开发者服务器获取win_count后使用wx.setUserCloudStorage(Object object)向微信托管存储上传得分,然后用wx.getFriendCloudStorage(Object object)获取用户朋友的openid、昵称、头像、得分。
所以只需修改返回值,程序就会把修改后的值上传到托管CloudStorage,从而改变排行榜。
隐私保护使开发者不能获取到微信的朋友关系uid,只能获取openid,开发者没有必要保存朋友关系,而应该时刻请求微信服务器返回。
一种办法是向微信请求用户朋友的openid、头像、昵称,然后根据openid在开发者服务器查得分,这种方式产生2次请求,所以微信提供了UserGameData托管存储,方便开发者直接获取朋友的得分。
getFriendCloudStorage参考:https://developers.weixin.qq.com/minigame/dev/api/open-api/data/wx.getFriendCloudStorage.html
SunerC 发表于 2022-9-26 19:40
没看懂你那个思路,能举个例子吗?  

我也有个方法 在personal_info那个请求中修改里面win_count的返回值就能直接出现在朋友圈排行榜中,别人也能看到,但我一直没弄明白为什么修改返回值能影响服务器的数据
ljq8896 发表于 2022-9-27 18:30
本帖最后由 ljq8896 于 2022-9-27 18:47 编辑
124630608 发表于 2022-9-27 18:14
道具也记录操作记录了
-1 移除道具
-2 撤回道具

现在有几个问题不明确,
1.map_map_seed的4个值会影响排序么,服务器在下发map时是否可以计算chessindex和type的关系;
2.服务器能否计算出组chessindex必须在另一组chessindex后;
3.常规情况下的顺序中任意15张卡至少有3个一样,使用移出/复活后,包含移出/复活的连续18张卡至少有3个一样,使用移出+复活时,包含移出/复活的连续21张卡至少3个一样。
如果服务器按上述方式判断,那么提交就变为了求解问题,而多数时候是无解的,只能不停请求服务器map_seed。
tianchining 发表于 2022-9-27 21:24
SunerC 发表于 2022-9-27 20:36
哦哦,感谢大佬,终于解开困扰了我一晚上的问题

除了http 还有websocket 除了羊了羊自己服务器的消息 还有微信服务器的通信 别的可以含有的
yupeng123 发表于 2022-9-26 21:36
SunerC 发表于 2022-9-26 21:28
理论上确实只能自己看,但是实际别人也能看到,我现在没搞明白为什么,你可以试试

听别人说是用了微信得缓存框架,别人拉排行榜的时候是从缓存拉取的,person_info的值会放到缓存里
jianghj 发表于 2022-9-26 11:17
感谢分享
zixudaoxian 发表于 2022-9-26 11:24
尝试过一次这个游戏,简直坑死人。
gugouo163 发表于 2022-9-26 11:24
谢谢分享,今天可以通关了
kiss米粒 发表于 2022-9-26 11:26
该怎么快速通过呢
snailcn 发表于 2022-9-26 12:12
谢谢分享,就是看不懂
huluiid 发表于 2022-9-26 12:13
有storm代码嘛!
guanzekuan 发表于 2022-9-26 12:19
看不懂啊
不见123 发表于 2022-9-26 12:26
大佬牛逼 分析的很到位 学习了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-22 00:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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