- 反编译班牌家长端 App 得到 Http 中加密参数的获取方法
- 模拟客户端向服务器发送请求并被接受
- 获取Token, 注册账号接口完成
- 暴力破解所有班级邀请码(多线程), 共计 5541 个班级
待办: 完成其他接口(e.g., 发送消息, 绑定学生)的 Python API.
逆向 Token 过程:
使用 jadx 逆向班牌 APP.
全局搜索 token, 发现如下代码.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20TreeMap treeMap3 = new TreeMap();
treeMap3.put("systemid", "parent");
String str7 = Constants.PARAM_ACCESS_TOKEN;
treeMap3.put("grant_type", "password");
treeMap3.put("username", string);
treeMap3.put("inch_timestamp", valueOf);
StringBuilder sb = new StringBuilder();
sb.append((String) treeMap3.get("inch_timestamp"));
Request request2 = request;
sb.append(f.b(8));
treeMap3.put("nonce", sb.toString());
StringBuffer stringBuffer2 = new StringBuffer();
for (String str8 : treeMap3.keySet()) {
stringBuffer2.append(str8);
stringBuffer2.append("=");
stringBuffer2.append((String) treeMap3.get(str8));
stringBuffer2.append(a.f1270b);
}
stringBuffer2.append("aef2890665d884a3080971b4eca594d7");相关方法太多了不一一列出, 但可以发现思路大致就是将所有 Http 请求的参数放入 TreeMap 中, 然后再拼接成字符串取 MD5. 查询 Java 官方文档发现 TreeMap 是基于红黑树实现, iterator 默认按照键的自然顺序排序.
写成 Python 代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 经反编译得到的 inch_sign 生成方法
temp = dict()
temp['access_token'] = self.token
try:
for i in params:
temp[i] = params[i]
except Exception as e:
pass
temp['inch_timestamp'] = int(round(time.time() * 1000))
temp['nonce'] = str(temp['inch_timestamp']) + str((random.random() + random.randint(1,9)) * 100000000)[:8]
temp2 = ''
for i in sorted(temp.keys()):
temp2 += str(i) + "=" + str(temp[i]) + "&"
temp2 += "aef2890665d884a3080971b4eca594d7"
sign = hashlib.md5(temp2.encode("utf-8")).hexdigest().upper()
本文采用 CC BY-NC-SA 4.0 许可协议发布.
作者: lyc8503, 文章链接: https://blog.lyc8503.net/post/incich-second-1/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬