微信跳一跳抓包修改分数-Java实现
原改分代码为Python代码,
#!/usr/bin/python # -*- coding: utf-8 -*- print("Hello World!") import requests import json import time from Crypto.Cipher import AES import base64 action_data = { "score": 100, "times": 123, "game_data": "{}" } session_id = "session_id" aes_key = session_id[0:16] aes_iv = aes_key print(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) print(length) 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/5/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,verify=False) print(json.loads(response.text))
以上代码来自https://zhuanlan.zhihu.com/p/32473340
考虑到很多同学没有Python环境,用起来并不是很方便,故参考此代码改写成Java版本。
另外简单写了个Web版提交工具,
http://java.zhaoxuyang.com/WxTyT/ (2018年1月3日 19:20,测试可用。)
但是不管哪种方法,都需要手动抓取微信跳一跳小游戏的session_id,抓包方法可以参考下面的或者自行搜索相关资料。
安卓抓包参考:安卓下使用Packet Capture抓取微信跳一跳小游戏的session_id值
iOS抓包参考:iOS下抓取微信跳一跳小游戏的session_id值
Java实现:
这里写了两个类,一个PKCS7加密的单独类,(参考自 WindCoder)
package com; import javax.crypto.Cipher; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.Arrays; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.Security; public class Pkcs7Encoder { // 算法名称 static final String KEY_ALGORITHM = "AES"; // 加解密算法/模式/填充方式 static final String algorithmStr = "AES/CBC/PKCS7Padding"; private static Key key; private static Cipher cipher; boolean isInited = false; //默认对称解密算法初始向量 iv static byte[] iv = { 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, 0x36, 0x30, 0x37, 0x30, 0x38 }; public static void init(byte[] keyBytes) { // 如果密钥不足16位,那么就补足. 这个if 中的内容很重要 int base = 16; if (keyBytes.length % base != 0) { int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0); byte[] temp = new byte[groups * base]; Arrays.fill(temp, (byte) 0); System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length); keyBytes = temp; } // 初始化 Security.addProvider(new BouncyCastleProvider()); // 转化成JAVA的密钥格式 key = new SecretKeySpec(keyBytes, KEY_ALGORITHM); try { // 初始化cipher cipher = Cipher.getInstance(algorithmStr, "BC"); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchProviderException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 加密方法 * --使用默认iv时 * @param content * 要加密的字符串 * @param keyBytes * 加密密钥 * @return */ public static byte[] encrypt(byte[] content, byte[] keyBytes) { byte[] encryptedText = encryptOfDiyIV(content,keyBytes,iv); return encryptedText; } /** * 解密方法 * --使用默认iv时 * @param encryptedData * 要解密的字符串 * @param keyBytes * 解密密钥 * @return */ public static byte[] decrypt(byte[] encryptedData, byte[] keyBytes) { byte[] encryptedText = decryptOfDiyIV(encryptedData,keyBytes,iv); return encryptedText; } /** * 加密方法 * ---自定义对称解密算法初始向量 iv * @param content * 要加密的字符串 * @param keyBytes * 加密密钥 * @param ivs * 自定义对称解密算法初始向量 iv * @return 加密的结果 */ public static byte[] encryptOfDiyIV(byte[] content, byte[] keyBytes, byte[] ivs) { byte[] encryptedText = null; init(keyBytes); try { cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(ivs)); encryptedText = cipher.doFinal(content); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return encryptedText; } /** * 解密方法 * * @param encryptedData * 要解密的字符串 * @param keyBytes * 解密密钥 * @param ivs * 自定义对称解密算法初始向量 iv * @return */ public static byte[] decryptOfDiyIV(byte[] encryptedData, byte[] keyBytes,byte[] ivs) { byte[] encryptedText = null; init(keyBytes); try { cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(ivs)); encryptedText = cipher.doFinal(encryptedData); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return encryptedText; } }
执行请求的工具类
package com; import okhttp3.*; import org.bouncycastle.util.encoders.Base64; import org.json.JSONObject; import java.io.IOException; import java.io.UnsupportedEncodingException; /** * @author: Seayon * @date: 2017/12/31 * @time: 21:11 */ public class Util { private static final MediaType JSON = MediaType.parse("application/json;charset=utf-8"); private static final String WXGAME_URL = "https://mp.weixin.qq.com/wxagame/wxagame_settlement"; public static final String SESSIONID_ERROR = "SESSIONID有误,请检查"; private static String getActionData(String sessionKey, String encryptedData, String iv) { byte[] sessionKeyBy = sessionKey.getBytes(); byte[] en = new byte[0]; try { en = encryptedData.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } byte[] ivBy = iv.getBytes(); byte[] enc = Pkcs7Encoder.encryptOfDiyIV(en, sessionKeyBy, ivBy); return new String(Base64.toBase64String(enc)); } public static String postData(String score, String times, String session_id) { String result = null; String content = "{\"score\": " + score + ", \"times\": " + times + "}"; String AES_KEY = null; try { AES_KEY = session_id.substring(0, 16); } catch (Exception e) { return SESSIONID_ERROR; } String AES_IV = AES_KEY; OkHttpClient okHttpClient = new OkHttpClient(); String actionData = Util.getActionData(AES_KEY, content, AES_IV); String json = "{\"base_req\":{\"session_id\":\"" + session_id + "\",\"fast\":1},\"action_data\":\"" + actionData + "\"}"; RequestBody requestBody = RequestBody.create(JSON, json); Request request = new Request.Builder() .url(WXGAME_URL) .header("Accept","*/*") .header("Accept-Language","zh-cn") .header("User-Agent","Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E304 MicroMessenger/6.6.1 NetType/WIFI Language/zh_CN") .header("Content-Length","680") .header("Content-Type","application/json") .header("Referer","https://servicewechat.com/wx7c8d593b2c3a7703/5/page-frame.html") .header("Host","mp.weixin.qq.com") .header("Connection","keep-alive") .post(requestBody) .build(); ResponseBody responseBody = null; try { responseBody = okHttpClient.newCall(request).execute().body(); result = responseBody.string(); } catch (IOException e) { e.printStackTrace(); } finally { if (responseBody != null) { responseBody.close(); } } return result; } }
执行测试
public class Main { public static void main(String[] args) { String sessionid = "=="; String score = "100"; String times = "700"; String result = Util.postData(score, times, sessionid); System.out.println(result); }
目前观察当执行errcode为0时代表成功,此时需要结束杀死微信的后台进程,重新进入微信,打开跳一跳小游戏,可以查看自己的分数,分数千万不要太高,我目前设置过的最高分是1024分,没有被封。
代码中使用到的依赖,Maven :
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.11</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-debug-jdk15on</artifactId> <version>1.55</version> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20171018</version> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.9.1</version> </dependency>
云服务器购买推荐 外星云服务器
炸了
2018年1月3日 下午6:47
太牛了,亲测,可以用,楼主很牛,而且很专业。我不懂的问他,他都给我搞定了。
路过
2018年1月3日 下午7:31
我设置了1万多一点,20多小时,暂时没有被封。
哈哈哈
2018年1月3日 下午8:23
我的10万都还在 很逗
哈哈哈哈哈哈
2018年1月3日 下午10:32
最大的数值貌似可以设置为:1999999999分。
小傻
2018年1月3日 下午7:40
Parse error: syntax error, unexpected ‘[‘ in /home/ftp/w/wmcms/wwwroot/tt.php on line 35
king
2018年1月3日 下午8:51
怎么转换成PHP代码?
涛
2018年1月3日 下午11:23
建议别刷了,刚刚输了个2018,结果只有自己看得到,别人看不到的,也就是被封了
阿佳
2018年1月4日 上午12:07
腾讯服务器返回的原始数据:
{“base_resp”:{“errcode”:-2}}
代表含义:数据组织的有错误,检查下session_id是不是复制错了,正常session_id中不应当有冒号,求大神我该怎么办
小马
2018年1月4日 上午10:18
这些代码怎么才能运行起来啊。。。我电脑有java环境了。。。。本人小白,求指教一下!
Seayon
2018年1月4日 上午10:19
到我 GitHub 找最新Java代码 https://github.com/Seayon
小白
2018年1月4日 上午10:23
下载了 还是不知道怎么跑起来…
瞬间的未来式
2018年1月4日 上午11:14
{“base_resp”:{“errcode”:108}}
隐身三娃
2018年1月4日 下午1:29
楼主,对加密解密这块有点蒙,看了晕乎乎的
dyhack
2018年1月4日 下午3:37
我刷着试,刷了12345分,现在又不能降分…,你们不会抓包吗?很简单的啊!我的是苹果机
ColorfulWind
2018年1月4日 下午4:00
非常有意思,提交118888结果刷到了100000,现在有的人能看到我的分,有的人不能看到,有的好友得分我也看不到,不知为何
系统@我
2018年1月4日 下午4:31
你Web版的可以哦,不过Java的结构都是{“base_resp”:{“errcode”:108}},而且抓包看到它提交数据的action_data内容非常多,有时候一次提交900多个字符,但是Java的这个每次提交的字符都很少,是不是加密方式换了?!(抓的是Android机)
炸了
2018年1月4日 下午5:04
5000分被封,别人看不到,自己能看到。。
baymax
2018年1月4日 下午7:21
现在网站没有了提交这个按钮
嘻嘻嘻
2018年1月4日 下午11:53
ID总是无效
eminem
2018年1月5日 上午12:01
为什么显示id无效啊、大神
斯莱德
2018年1月5日 上午12:15
又凉了
求救
杨小穆
2018年1月5日 上午9:53
凉了跳一跳刷不了了
黑暗之魂
2018年1月5日 上午9:57
返回“errcode: 0”,感觉并没有提交成功
套套
2018年1月5日 下午12:20
是不是不行了?
李大大
2018年1月5日 下午1:18
提交了 但是分数没有更新
非人
2018年1月5日 下午2:52
是不是腾讯把提交成绩的服务器ip封了?要不挂个http代理或者换服务器试试?
测试
2018年1月5日 下午3:13
https://zhuanlan.zhihu.com/p/32594563?utm_source=com.daimajia.gold&utm_medium=social
可以参考下这个解密方法
昨儿
2018年1月5日 下午6:17
已经凉了!
张欠欠✌
2018年1月5日 下午10:03
sessionID在哪里可以看
章
2018年1月6日 上午12:08
2.0版本好像还是不行,2018.01.06.00:08
大
2018年1月6日 下午2:17
楼主 为啥用你的web可以修改成功 跑java就返回 errcode -1呢?
ID_A7en0
2018年1月6日 下午4:02
大佬 官方增加了点击记录对吗?
RT
2018年1月7日 下午5:22
领红包鼓励一下这个按钮,在微信里点不开。
Seayon阿阳
2018年1月11日 下午3:11
这个现在微信封了,只能在浏览器和QQ空间里打开了,感谢支持
Yuhin
2018年1月8日 上午10:05
都刷点红包啊,,不然博主花自己的时间搞这个图啥啊,,我们也帮不上什么忙
kenzie
2018年1月8日 下午2:20
。。1月8日想来WEB版,改一改称霸朋友圈的,结果凉了么?
Lzzie
2018年1月8日 下午4:23
现在1月8日16:23,JAVA代码本周会更新吗?
Ming
2018年1月9日 上午7:15
服务器错误
noone
2018年1月9日 上午11:23
老铁,服务器错误啊
noone
2018年1月9日 下午9:56
好像没有用了,刚刚试了一下,返回刷成功了。但是微信没反应。
A
2018年1月15日 上午8:59
腾讯服务器返回的原始数据:
{“base_resp”:{“errcode”:0,”ts”:” “}}
代表含义:数据已经发送
这是什么意思?排行榜没变化
B
2018年1月18日 下午11:33
我也是这样
晨曦微露
2018年1月21日 下午10:53
带走了,去发文章了
xiaoma
2018年1月24日 下午12:15
at Main.main(Main.java:19)
叶
2018年1月26日 下午3:44
博主现在代码 还不能用吗
......
2018年11月21日 下午5:08
Charles可以直接修改分数然后提交吗?
服务器出错
2019年1月14日 下午2:19
服务器错误了。
侵权
2020年6月16日 上午5:24
博主 方便加个v或q么 v18885188864 Q 5757134 寻找技术