用https原理来打败微信跳一跳的好友们

本篇不再讲解https基本的概念和证书校验的原理;感兴趣的可以参看我的另外一篇文章 给你的博客上一把锁
本文目的是简要介绍下密码学的几种应用场景, 这里重点是分析了为何要使用加密算法,以及解决了什么现实问题;最后介绍了https攻击的几种方案,并使用跳一跳刷分来试验了下https中间人证书欺骗的方法。本文由我sheldoncui版权所有,未经许可不可转载;对于文中小游戏的刷分方法仅供学习研究。

本篇涉及到的对称加密和非对称加密知识属于密码学领域的概念,不会过多深究,如果需要深入研究,则可以以这篇知乎作为引子不断深入挖掘https://www.zhihu.com/question/25912483

先来一发跳一跳的排名结果镇楼:

charles的https抓包原理及修改跳一跳小游戏

charles解析https抓包的原理其实就是https的中间人攻击手法,只是我们作为开发人员,故意连接charles作为代理,哪怕它给我浏览器返回了一个假的证书(但我还是在浏览器装上了charles根证书来信任他)。 其原理如下图所示:

charles配置

下面就说下如何使用charles抓包:

  1. 首先下载charles
  2. 然后配置charles的代理

由于公司内网只能使用8080,所以我把mac上的监听端口设置为8080

  1. 然后让charles启动的代理作为我们手机的正向代理。只需在手机设置中将wifi配置代理ip为我们的mac IP,端口为charles监听的端口
    注意这一步需要手机跟mac处在同一个局域网中

  2. 配置完成后,手机网络访问其实已经被代理了,但此时还无法解析https包

  3. 在charles的Proxy菜单下找到SSL Proxy Setting. 配置上自己希望抓包的https域名。如果不配置的话,charles默认是不解析https包的.

  1. 由于charles的https抓包基于中间人劫持的原理,所以我们手机端需要添加charles根证书;

    点击图中的install on mobile device, charles会提示你如何进行安装:

charles代理服务器的证书正是由该根证书进行签名而来。 要注意这里有个坑: 由于不是系统默认支持的根证书,所以手机端需要将证书设置为信任(具体操作是在 ‘设置->关于本机->证书信任设置->证书信任’, 不会的可以参考其他网友的教程)

  1. 证书安装完成之后就可以在charles里对https请求进行抓包了

其实通过charles代理和抓包,分析app的包内容之后,我们还可以写脚本来爬取某些app的数据库信息。

跳一跳改分原理

其实改分的原理就是在小程序上传你跳的结果分数的那一步,拦截本地请求,改掉分数再发送出去。 实际上可以演变为这样的步骤:

  1. 拦截微信小程序用户与微信服务器进行通讯的session_id
  2. 找到小程序上传服务器最终成绩时的数据
  3. 修改分数数据(可能需要找到小程序对数据的加密方式,才能对发送的数据进行正确的加密)
  4. 利用之前获取的session_id,将修改后的分数(加密后)发送给服务器

跳一跳会话抓包

上述步骤中,有一项session_id是需要抓包来获得。小程序与服务器的通信,其实是走的https协议。上面我们已经讲了charles,所以我们可以通过charles对小程序与服务器的通信进行抓包分析。安卓系统中的抓包可以不这么复杂,可直接在手机上装上Packet Capture 之类的抓包工具进行抓包。

请求接口:

最终你会发现,在你分数打破记录后,会发送一个 wxagame_settlement的请求,将本次的成绩上传. 只不过这个请求中对数据进行了加密.

寻找小程序客户端Post数据的加密方法

得益于小程序的包wxpkg在客户端没有进行任何的压缩和加密,所以虽然小程序定义了一种自己的文件格式wxpkg,但是还是非常容易就被网上的逆向大神们分析出小程序包结构:
从微信小程序看前端代码安全

如果你想把小程序的包搞下来,也很简单,只需要执行:

1
2
wget https://servicewechat.com/weapp/release/{appid}/{version_num}.wxapkg
// {appid} 为小程序码, {version_num} 为 版本号

至于如何解包,可以参考这篇gist: https://gist.github.com/feix/32ab8f0dfe99aa8efa84f81ed68a0f3e

当然,尽管小程序包没有进行压缩,但包里面的js等资源文件还是压缩了的。不过大家也知道,前端的js哪怕压缩了,展开之后还是可以大概看出代码含义的:
解析后的跳一跳小程序的源码文件

解包之后,网上的大神们分析出了wxagame_settlement的实现,即发送这个请求时,POST数据中的action_data是加密传输的,小程序是在JS中使用AES加密后对数据进行传输(这个在微信公众平台文档中也有讲到了)。(AES是一个对称密码,旨在取代DES成为广泛使用的标准.)

模拟发送请求

有了加密方法,我们就可以对POST的分数数据进行加密并模拟发送了.

服务器返回:

1
{"myUserInfo":{"history_best_score":985,"times":1564,"headimg":"http://wx.qlogo.cn/mmhead/GhXrItMH8e6ud0UUkm72jYiafujcSgBB8lGSiaFwYJuao/96","week_best_score":985,"grade":5,"nickname":"sheldon","score_info":[],"hongbao_list":[]},"TecentInfo":{"base_resp":{"errcode":0,"ts":"1515477217926"}},"version":"2.0"}

参考python的实现而来,我提供了Node.js的实现:

欢迎使用我提供的Web版本进行修改: https://game.limefe.com/

杀进程,重进小程序

改分请求提交后,需要重新关掉小程序或微信,再次进入才能看到修改后的成绩。可能因为你一直处在小程序中,就不会触发拉取最新的成绩了。

除了抓包的办法之外,你还可以使用真正的高科技AI的方式(又叫外挂…)来玩转跳一跳;这个就有点技巧了,您可参考: https://zhuanlan.zhihu.com/p/32452473 https://github.com/wangshub/wechat_jump_game

Java 破解腾讯微信跳一跳 几乎每次命中中心点

Refer

图解 HTTPS:Charles 捕获 HTTPS 的原理
letsencrype
微信跳一跳刷分攻略
使用移动应用抓包神器
全站 HTTPS 与 CDN 加速如何完美共存
我们真的有必要全站 HTTPS 么?
手动获取我们所感兴趣网站的公钥证书
IOS手机https抓包
android手机https抓包
wistle完成简单的https抓包
微信跳一跳万分攻(作)略(弊)
Charles工具抓包(HTTP或HTTPS)
使用Charles进行HTTPS抓包
抓取手机app的数据(摩拜单车)
安卓手机直接抓包方法
微信逆向:微信小程序源码阅读笔记
微信小程序wxapkg文件格式解析程序
解析后的跳一跳小程序的源码文件
使用python对微信小游戏跳一跳刷分
iOS下抓取微信跳一跳小游戏的session_id值
微信跳一跳抓包修改分数-Java实现
微信小程序包解析
使用移动应用抓包利器Charles Proxy分析微信小游戏「跳一跳」
iOS 10.3下解决Charles抓包ssl证书信任问题
跳一跳终极攻略 (App辅助版)