微信跳一跳万分攻(作)略(弊)

原文:https://zhuanlan.zhihu.com/p/32473340

import requests
import json
import time
from Crypto.Cipher import AES
import base64

action_data = {
    "score": 10086,
    "times": 666,
    "game_data": "{}"
}

session_id = "5TrXoE7IXtM/Nr7vITnbU9bmR53VH0u8RkVnm6m/Fezg=="

aes_key = session_id[0:16]
aes_iv  = aes_key

cryptor = AES.new(aes_key, AES.MODE_CBC, aes_iv)

str_action_data = json.dumps(action_data).encode("utf-8")
print("json_str_action_data ", str_action_data)

#Pkcs7
length = 16 - (len(str_action_data) % 16)
str_action_data += bytes([length])*length

cipher_action_data = base64.b64encode(cryptor.encrypt(str_action_data)).decode("utf-8")
print("action_data ", cipher_action_data)

post_data = {
  "base_req": {
    "session_id": session_id,
    "fast": 1,
  },
  "action_data": cipher_action_data
}

headers = {
    "charset": "utf-8",
    "Accept-Encoding": "gzip",
    "referer": "https://servicewechat.com/wx7c8d593b2c3a7703/3/page-frame.html",
    "content-type": "application/json",
    "User-Agent": "MicroMessenger/6.6.1.1200(0x26060130) NetType/WIFI Language/zh_CN",
    "Content-Length": "0",
    "Host": "mp.weixin.qq.com",
    "Connection": "Keep-Alive"
}

url = "https://mp.weixin.qq.com/wxagame/wxagame_settlement"


response = requests.post(url, json=post_data, headers=headers)
print(json.loads(response.text))

依赖:

  1. requests
  2. pycrypto
  3. python3

食用方法:

抓包(小程序的https包,url包含wxagame,Android可用packet capture)获得session_id替换,修改action_data score字段。

python xxx.py


2018.1.1:

这个方法大概已经凉了,仅供参考,作弊需谨慎。楼主的大小号都已经不能正常更新成绩了。

赶完1 / N 的DDL,更新游戏(version 3/5)的分析。内容和下面的文章的差不多

爬虫:使用python对微信小游戏跳一跳刷分zhuanlan.zhihu.com

@爬虫

在微信(灰度)推送新版本的当天晚上,楼主宿舍4人齐齐耍起跳一跳。

耍了一阵室友们都跳过了100分,唯独楼主还在100以下挣扎。

这学期学的一门课程,恰好有一章关于游戏作弊,其中有内存修改器作弊和协议作弊,于是楼主“恶向胆边生”,决定作弊,弄个“大新闻”。

轻车熟路操起抓包工具,抓微信小程序的包,一番折腾之后有下面的发现。

v2-6613bdd7be8698fdf3061a6b2833d708_hd

这三个是跳一跳游戏启动时发的包,包的作用在url上已经自解释了。

第一个包的内容,可以看到小程序的id和版本,这个截图的截取时间是2018.1.1,版本已更新到5。

v2-9a13ddcdeedbf2420b4fdb94a2d20c15_hd

保持抓包,去游戏里面跳几下,然后抓到下面这个包:

v2-46ce4af6a16d9e192ea207cd34570ba4_hd
v2-93d83e5cd19eb3e6582ebb98bca3d1c3_hd
v2-2f3665c5cba5274cfe029c2013e9e423_hd

(…写到这里这里编辑器莫名其妙把我写的一大段整没了)

请求这个API 会上传手机的型号和一个report_list,report list内容不固定,上面那个包含了应该是一次游戏的信息,下面那个包括了scene(好像是分享按钮),观战信息(这个是在2018.1.1截取的,抓包的时候分享了游戏,顺便分析一下观战系统)。

要作弊必须知道成绩是如何上传的,到目前为止只发现了这个跟成绩有关的包。最简单的report list 只有best_score, score, break_record…这几个字段,所以楼主用抓包工具的重发功能,在重发之前拦截请求,把上面字段的值篡改掉,再发送请求。

经过几次尝试,虽然服务器返回了看似正常的值,游戏排行榜始终没有变化。

此处略过无数失败,包括用内存修改器改分数的尝试。

后来继续抓包,发现破纪录的游戏结束后会有向wxagame/wxagame_settlement的请求,随后的wxagame/wxagame_getfriendsscore 返回的myuserinfo已经包含更新后的记录。这里确定了新的目标是wxagame_settlement。

它长这样:

v2-c2fd2a79841436bd8fae47b6622b49ad_hd
v2-21f6b42e0235f97fe3b87f3e04eee862_hd

所以目标就在action_data里。

这个action_data比较长,并且应该经过了加密。现在目标又变成了找到加密的算法。凭空找是不存在的,找算法大概有两个途径,在二进制可执行文件里面找;在源代码里面找。

通过搜索引擎找到一些相关资源:

从微信小程序看前端代码安全
微信小程序包解析

照着找到的方法解包,找到了game.js,经过代码压缩和混淆(为了防止逆向,同时也为了压缩小程序的体积),格式化一下展开了两万多行代码。

v2-e576c79a7f9e8a0316aa7dcaa26de223_hd
v2-af9b9e3d364649f978e7626348e30a12_hd

可以看到确实如资料所说用了Three.js游戏引擎。

现在目标就是找到发请求的地方,搜索一下

v2-2a66d09e19b8612d777972cae0b925b6_hd

找到了。

然后就顺藤摸瓜吧,继续搜索。

最后就找到了加密算法,然后构造数据包发给服务器。

关于action_data,这里展示version3 解密后数据:

v2-b83b7bfd280167a81c99fb484d7c1326_hd

game_data 里面包括 action list 和 music list。

在js代码里面的来源:

v2-3f8565207e7a7ed9752e64b1c9b47d8f_hd
v2-02c7016d3ddca8159156ade25d5a097f_hd

关于观战系统:

分享观战卡片后会有这样的的请求。

v2-5aede01a03ecb8ac23deb8c14b824257_hd

js 内的一点相关代码:

v2-72665f24a6c3d2adfaa26da437ef71de_hd

观战的有关数据是通过 WebSocket发送的,楼主猜测action data里面的game_data在观战的时候被发送到观战的客户端。这里需要抓WebSocket的包,楼主没有这个条件没有进行下去。

全文完结。

PS :

1、评论提到了微信小游戏文档的数据加密部分。

用户数据的签名验证和加解密 · 小游戏mp.weixin.qq.com

2、今天发现了这个

v2-61f51e608463b23627a93e9dd330bee6_hd

关注我

我的微信公众号:前端开发博客,在后台回复以下关键字可以获取资源。

  • 回复「小抄」,领取Vue、JavaScript 和 WebComponent 小抄 PDF
  • 回复「Vue脑图」获取 Vue 相关脑图
  • 回复「思维图」获取 JavaScript 相关思维图
  • 回复「简历」获取简历制作建议
  • 回复「简历模板」获取精选的简历模板
  • 回复「加群」进入500人前端精英群
  • 回复「电子书」下载我整理的大量前端资源,含面试、Vue实战项目、CSS和JavaScript电子书等。
  • 回复「知识点」下载高清JavaScript知识点图谱

每日分享有用的前端开发知识,加我微信:caibaojian89 交流