0x00 引子
目前网上已经有摹拟发包上传分数的方案了,图形辨认以及人肉测量都是不错的选择,另外,也有基于安卓 adb 实现的。下面给出一些这方面的分析,没别的意思,就是纯洁好玩。文章源自微观生活(93wg.com)微观生活-https://93wg.com/16210.html
0x01 抓包文章源自微观生活(93wg.com)微观生活-https://93wg.com/16210.html
抓包通常可以用 Charles 或者 Fiddler 抓小程序 https 数据,这里说下另外一种办法,从安卓代码入手,找到 https 明文发包点截取封包。文章源自微观生活(93wg.com)微观生活-https://93wg.com/16210.html
从微信的 log 中看到,每一次游戏发包时都会打印 \"AppBrandNetworkRequest\",从 Tag 命名上猜测这是小程序代码通过微信 sdk 发包的接口,反编译微信依据该关键词定位到负责小程序 https 通讯的类是 Lcom/tencent/妹妹/plugin/appbrand/i/c;。文章源自微观生活(93wg.com)微观生活-https://93wg.com/16210.html
分析下代码可以发现最后使用过 Lcom/tencent/妹妹/sdk/f/e;->post 发包的,打印调用这行代码的函数的各个参数就能够截取小程序通过 https 发送的 json 明文数据了。文章源自微观生活(93wg.com)微观生活-https://93wg.com/16210.html
0x02 改包文章源自微观生活(93wg.com)微观生活-https://93wg.com/16210.html
在 1 中明文发包点可以直接修改发送的数据,然而敏感数据是加密通讯的,比如上传分数的接口 https://mp.weixin.qq.com/wxagame/wxagame_settlement 中 action_data 字段就是在小程序内加密后再通过微信发出去的。文章源自微观生活(93wg.com)微观生活-https://93wg.com/16210.html
既然数据是在本地加密的,加密算法确定也在本地可以找到,所以\"跳一跳\"做弊的关键就是找到小程序源码。文章源自微观生活(93wg.com)微观生活-https://93wg.com/16210.html
0x03 寻觅小程序源码文章源自微观生活(93wg.com)微观生活-https://93wg.com/16210.html
从微信小程叙文档中可以知道,小程序的核心逻辑一般为用 js 写的。搜寻手机中的文件并无找到后缀为 \".js\" 的源码,源码只能从内存中 dump 了。文章源自微观生活(93wg.com)微观生活-https://93wg.com/16210.html
微信 log 中搜寻 \".js\",可以发现有如下 log 打印:
I/MicroMsg.WxaPkgRuntimeReader(12426): [, , 12554]:openRead, appId = wx7c8d593b2c3a7703, reqURL = /game.js, null(FALSE), type = java.lang.String, cost = 6ms
从关键词 WxaPkgRuntimeReader 可以猜测这是 wxapp 源码加载的相关代码,通过该关键词反编译微信定位到加载 js 代码的类:Lcom/tencent/妹妹/plugin/appbrand/appcache/ai;
分析代码可知该类下的 public static String a(e eVar, String str) 办法返回的就是js源码,把返回字串 dump 下来得到 \"跳一跳\" 核心源码 game.js。
0x04 实现做弊功能
有了源码,就能够依据上传分数的相关代码摹拟上报分数了:
{
key: \"requestSettlement\",
value: function() {
var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0,
e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0,
i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : function() {},
n = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : {};
if (a.default.sessionId) {
var r = {
score: t,
times: e,
game_data: JSON.stringify(n)
},
o = {
base_req: {
session_id: a.default.sessionId,
fast: 1
},
action_data: (0, s.encrypt)(r, a.default.sessionId)
};
wx.request({
url:
h.AJAX_URL + \"/wxagame/wxagame_settlement\",
method: \"POST\",
data: o,
success: function(t) {
i(200
评论