Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

WakeUp 课程表分享口令解析器

一个用于解析新版(≥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封禁
  • 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 加解密、请求构造与响应处理。

大致工作链路:

  1. 读取 APK 固定信息:从 Manifest 取得包名与版本号,从 assets/channel 读取渠道,提取 dex 内的 public token,并从签名证书计算应用签名 MD5。
  2. 构造设备标识:输入的 Android ID 会派生为 cuidadiddiddeviceIdoperatorid 不会被脚本伪造,只会原样使用传入值,目前留空即可,服务端不校验。
  3. 从 antispam 获取 signB:生成一次性的 10 位 rand10,连同 cuid 和应用签名构造 signA 并请求 /pluto/app/antispam;服务端返回 signB 后,脚本用本次 rand10 解密并提取 10 字节 token。
  4. 加密并签名分享请求:由 APK versionCode 和反垃圾 token 派生 RC4 key,将分享口令加密为 data;再将排序后的请求参数、时间戳等计算 MD5 sign,请求 /share_schedule/getv2
  5. 解密响应:使用同一个 RC4 key 解密服务端的 data 字段,并输出课程表 JSON。

signA/signB 的 DES 结构、MAGIC、固定 key/salt、位序、填充、十六进制编码及请求签名逻辑均由对 libbaseutil.so 的静态分析得到。为WakeUp的私有DES算法。

关于 CUID / ADID

cuidadid均为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 整数 W0W1W2W3,再计算:

其中 LOWER_HEX_8 表示以 8 位小写十六进制输出,位数不足时左补零。最终 ADID 是 40 位小写十六进制字符;

adid也是WakeUp私有算法,非 Google Advertising ID。算法来源为dex反编译,直接搜alpha.beta可定位到

diddeviceIdoperatorid 没有派生算法

备注

失效时,可先考虑更换androidid,如仍不行再考虑换设备参数、传入新版apk;

如仍失效,则要考虑重新分析libbaseutil.so了。可能是key轮换了,也可能是算法又更改了。

欢迎任何人PR或提交issue。

License

Apache License 2.0

About

新版(≥6.1.x)WakeUP课程表 分享口令解析

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages