目前网上已经有模拟发包上传分数和图像识别模拟操作的方案了,这里分享一下另一种作弊方案:修改源码.
1.抓包
抓包通常可以用Charles或者Fiddler抓小程序https数据,这里说下另一种方法,从安卓代码入手,找到https明文发包点截取封包.
从微信的log中看到,每次游戏发包时都会打印"AppBrandNetworkRequest",从Tag命名上猜测这是小程序代码通过微信sdk发包的接口,反编译微信根据该关键词定位到负责小程序https通信的类是Lcom/tencent/mm/plugin/appbrand/i/c;,分析下代码可以发现最后使用过Lcom/tencent/mm/sdk/f/e;->post发包的,打印调用这行代码的函数的各个参数就可以截取小程序通过https发送的json明文数据了.
2.改包
在1中明文发包点可以直接修改发送的数据,但是敏感数据是加密通信的,比如上传分数的接口https://mp.weixin.qq.com/wxagame/wxagame_settlement中action_data字段就是在小程序内加密后再通过微信发出去的.既然数据是在本地加密的,加密算法肯定也在本地可以找到,所以"跳一跳"作弊的关键就是找到小程序源码.
3.寻找小程序源码
从微信小程序文档中可以知道,小程序的核心逻辑通常是用js写的.搜索手机中的文件并没有找到后缀为".js"的源码,源码只能从内存中dump了.
微信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/mm/plugin/appbrand/appcache/ai;
分析代码可知该类下的public static String a(e eVar, String str)方法返回的就是js源码,把返回字串dump下来得到"跳一跳"核心源码game.js.
4.实现作弊功能
有了源码,就可以根据上传分数的相关代码模拟上报分数了:
{
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 === t.statusCode ? 0 === t.data.base_resp.errcode ? !0 : !1 : !1)
},
fail: function(t) {
i(!1)
}
})
} else i(!1)
}
},
加密部分:
e.encrypt = function(t, e) {
var e = e.slice(0, 16),
i = n.default.enc.Utf8.parse(e),
r = n.default.enc.Utf8.parse(e),
a = t;
a = JSON.stringify(a);
var o = n.default.AES.encrypt(a, i, {
iv: r,
mode: n.default.mode.CBC,
padding: n.default.pad.Pkcs7
});
return o = o.toString()
};
既然源码在手,直接修改源码就可以实现作弊功能了.实现的方法是修改3中的js源码载入函数的返回字符串,替换相应js代码。
比如修改每次跳跃加分32:把"this.score+=t"替换成"this.score+=32"等等.
5.后记
直接修改超级高分是无效的,因为玩家永远想象不到腾讯会用什么样奇葩的方式检测作弊.作弊功能的实现只是万里长征第一步,过检测才是永恒的主题.
[课程]Linux pwn 探索篇!