微信小游戲跳一跳作弊方法
本實現(xiàn)方法代碼來源:https://zhuanlan.zhihu.com/p/32473340
原理粗解
微信小游戲跳一跳综芥,本質(zhì)上時一個半離線游戲蹈集,它的與服務(wù)器的通信其實是在于或者在達(dá)到某些超越好友的時候回下載頭像信息蚣抗,或者是在最終游戲結(jié)束之后返回游戲結(jié)果給服務(wù)器趴久,或者是獲取現(xiàn)有的排行榜的時候才會向服務(wù)器要信息。所以說整個游戲并不是時時與服務(wù)器通信苍在,也就是意味著雙方溝通上下文關(guān)聯(lián)不強(qiáng)塘辅,我們可以從中加入我們想要修改的數(shù)據(jù)晃虫,欺騙服務(wù)器,然后成功刷分扣墩。
那么這里就存在著這樣一個漏洞哲银,如果我知道它返回的數(shù)據(jù)的加密方式,獲取到它原有的包的格式設(shè)置呻惕,那么我可以仿照這個包的格式盘榨,修改其返回內(nèi)容(也就是最終我們記錄刷新之后的數(shù)據(jù)包)
這里需要欺騙服務(wù)的一個關(guān)鍵就在于獲取到這個session_id,也就是服務(wù)器判斷用戶身份的憑證蟆融,另一方面微信在公眾號平臺的第三方信息管理那邊給出了它們的通信加密方式是AES草巡,那么再將數(shù)據(jù)經(jīng)過AES加密傳給服務(wù)器,那就達(dá)到了欺騙服務(wù)器修改游戲記錄數(shù)據(jù)的目的。
Packet Capture抓包
作者在原文中說是用fiddler來抓包的山憨,這個需要手機(jī)和電腦在同一個網(wǎng)絡(luò)下查乒,比較麻煩,我這里用的是Packet Capture郁竟,這個app 可以針對一個應(yīng)用進(jìn)行抓包玛迄,比較方便。
然后抓包之后棚亩,找到我們想要的那個包蓖议,注意要用到的包是類似這樣的:
其實上面的抓包有用的就最上面那兩個,第一個是給了我們它的通信的結(jié)構(gòu)體讥蟆,另一個就給了我們它的session_id.
然后我們就可以把這些信息放回我們在最上面鏈接里給出的代碼勒虾,然后就可以執(zhí)行。
代碼運(yùn)行環(huán)境要求
Python 3.5?
requests?
pycrypto
我實在Linux上跑的瘸彤,應(yīng)該windows也可以修然。
代碼塊
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))
注釋:
注意上面的程序中是用在Wifi環(huán)境下的,它的User-Agent已經(jīng)給了我們质况,如果你不是的話愕宋,可以根據(jù)抓來的包對headers這一個結(jié)構(gòu)的內(nèi)容進(jìn)行修改。
另外注意分?jǐn)?shù)超過一萬已經(jīng)被微信禁止了结榄,過高的數(shù)據(jù)會因為異常而刪除中贝,一千以內(nèi)現(xiàn)在還可以。