一个用于解析新版(≥6.1.x) WakeUp 课程表分享口令的 Python 脚本,无需抓包即可获取分享的课程表数据。
python3 -m pip install -r requirements.txt将 WakeUp 的 APK 文件放在脚本同目录下,然后运行:
python3 main.py --code <分享口令> --android-id 0000000000000000参数说明:
--code: WakeUp 分享口令(必需)--android-id: 曾经登录过 WakeUp 的设备 16位 Android ID(必需)
{
"shareData": "{\"courseLen\":50,\"id\":1,\"name\":\"默认\",\"sameBreakLen\":false,\"sameLen\":false,\"theBreakLen\":10}\n[{\"endTime\":\"08:50\",\"node\":1,\....{\"background\":\"\",\"courseTextColor\":-1,\"id\":6,\"itemAlpha\":80,\"itemHeight\":64,\"itemTextSize\":12,\"maxWeek\":20,\"nodes\":20,\"school\":\"家里蹲大学\",\"showOtherWeekCourse\":true,\"showSat\":true,\"showSun\":true,\"showTime\":false,\"startDate\":\"2026-8-31\",\"strokeColor\":-2130706433,\"sundayFirst\":false,\"tableName\":\"26秋\",\"textColor\":-16777216,\"tid\":\"c20f12bf-635d-41ec-bc53-60f78d4f6488\",\"timeTable\":1,\"type\":0,\"updateTime\":1785733794144,\"wid..."
}如解密失败,会输出原始响应体。
- 必须使用真实的 Android ID:需要提供一个曾经登录过 WakeUp 课程表的设备 Android ID,脚本不会生成或注册新设备
- 全0 Android ID 目前可用 即
0000000000000000(16*0) 但不确定后续是否会被WakeUp封禁
- 全0 Android ID 目前可用 即
- APK 文件:需要从官方渠道获取 WakeUp APK 文件以提取签名信息
可以根据需要自定义设备信息:
python3 main.py\
--code <分享口令> \
--android-id <android_id> \
--apk WakeUp.apk
--sdk 36 \
--device 24129PN74C \
--brand Xiaomi \
--screensize 2670x1200可选参数:
--apk: WakeUp APK 文件路径(默认 自动探测)--sdk: Android SDK 版本(默认 35)--device: 设备型号(默认 Pixel 7)--brand: 设备品牌(默认 google)--screensize: 屏幕分辨率(默认 1080x2400)--abis: CPU 架构(默认 arm64-v8a)
注:建议查看main.py的arg部分 我懒得写更多说明了
main.py: 主程序入口,负责参数解析、APK 信息收集和请求流程编排。WakeUp_share_sim.py: 协议层,负责标识符派生、签名、native DES/RC4 加解密、请求构造与响应处理。
大致工作链路:
- 读取 APK 固定信息:从 Manifest 取得包名与版本号,从
assets/channel读取渠道,提取 dex 内的 public token,并从签名证书计算应用签名 MD5。 - 构造设备标识:输入的 Android ID 会派生为
cuid和adid。did、deviceId、operatorid不会被脚本伪造,只会原样使用传入值,目前留空即可,服务端不校验。 - 从 antispam 获取 signB:生成一次性的 10 位
rand10,连同cuid和应用签名构造signA并请求/pluto/app/antispam;服务端返回signB后,脚本用本次rand10解密并提取 10 字节 token。 - 加密并签名分享请求:由 APK
versionCode和反垃圾 token 派生 RC4 key,将分享口令加密为data;再将排序后的请求参数、时间戳等计算 MD5sign,请求/share_schedule/getv2。 - 解密响应:使用同一个 RC4 key 解密服务端的
data字段,并输出课程表 JSON。
signA/signB 的 DES 结构、MAGIC、固定 key/salt、位序、填充、十六进制编码及请求签名逻辑均由对 libbaseutil.so 的静态分析得到。为WakeUp的私有DES算法。
cuid与adid均为androidid派生而来
cuid = MD5_UPPER("com.baidu" + android_id) + "|0"
MD5_UPPER 表示对 UTF-8 字节计算 MD5,并使用 32 位大写十六进制输出。因此 CUID 固定为 32 位十六进制字符加 |0 后缀。
prefix = MD5_LOWER("alpha.beta" + android_id)
checksum = LOWER_HEX_8(W0 XOR W1 XOR W2 XOR W3)
adid = prefix + checksum(prefix)
prefix 是 32 位小写 MD5。校验段将该 MD5 按顺序切为四个 32-bit 整数 W0、W1、W2、W3,再计算:
其中 LOWER_HEX_8 表示以 8 位小写十六进制输出,位数不足时左补零。最终 ADID 是 40 位小写十六进制字符;
adid也是WakeUp私有算法,非 Google Advertising ID。算法来源为dex反编译,直接搜
alpha.beta可定位到
did、deviceId、operatorid没有派生算法
失效时,可先考虑更换androidid,如仍不行再考虑换设备参数、传入新版apk;
如仍失效,则要考虑重新分析libbaseutil.so了。可能是key轮换了,也可能是算法又更改了。
欢迎任何人PR或提交issue。