微信 “跳一跳” 分析笔记

小微 科技微信 “跳一跳” 分析笔记已关闭评论106字数 1648阅读模式
摘要0x00 引子目前网上已经有模拟发包上传分数的方案了,图形识别和人肉丈量都是不错的选择,此外,也有基于安卓 adb 实现的。下面给出一些这方面的分析,没别的意思,就是纯粹好玩。0x...

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

继续阅读
 
小微
  • 版权声明: 本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们(管理员邮箱:81118366@qq.com),情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!
  • 转载请务必保留本文链接:https://93wg.com/16210.html