🚧 WIP
- 运行一次可以成功登录
- 监控并自动登录
- 校本部
- 深圳校区
- 没有认识的威海同学, 欢迎PR
- 在可执行文件路径下创建
config.toml
文件, 将name
,password
填入 - 深圳校区使用
demo_config/shenzhen.toml
作为模板, 校本部使用demo_config/harbin.toml
作为模板 - 运行
main.py
即可
如果对登录结果不自信, 可解注释basicConfig(level=INFO)
查看网络请求的结果
2023/12 实测哈尔滨校区可用
2024/2 实测深圳校区登陆可用
目前仅仅实现了运行后能完成登录的功能
初步计划实现后台检测连接校园网, 当连接上HIT-WLAN且不能连接的时候自动执行登录的过程
- 聪明的NetworkManager认证窗口不能记住密码
- 动手练习编程寄巧
- 考完计网比较闲
- 对自己动手能力过分自信
2023年12月, 当nzg在某个下午再次因为不想输网络认证密码时, 他决定不再忍气吞声, 他成功说服了自己的电脑和GPT同他一起踏上开发自动登录脚本的道路, 他持非常乐观的态度向它们描绘最多半个小时就可以解决这个问题的美好前景, 随后花了一个晚上
对于试图实现类似功能的人也可以作为参考
认证过程大致如下
- 客户端发起
get_challenge
请求, 请求服务器提供token
- 客户端根据服务器提供的
token
, 计算密码的HMAC-MD5值, 计算整个请求的checksum
, 以及一个info
签名 - 客户端组装一个包含上面字段的查询, 服务器收到后验证正确性并准予使用网络
两次
get_challenge
请求callback
请求
个人水平所限, 没有看出xEncode
的作用, 所以只能用python重新实现了这个函数
一开始也没有看出来s
和l
的作用, 于是也尝试实现, 然而这两个函数巧妙地利用了很多JS特性做了一些Trick, 导致实现的时候颇有坎坷
后知后觉发现就是一个简单的字节流转换成int类型的过程, 于是用py自带的函数完成了这个功能, 对应main.py
中byte2arr
和arr2byte
请注意这份代码跟源代码并不等价, 当
flag=True
处理UTF-8字符串的时候会导致结果不一样 但是作为计算的字段里面只包含了用户名, 密码, IP地址, 以及两个固定的常量值, 它们出现UTF字符的概率不大, 所以并不影响正确性
tldr: 认证端使用的base64编码有问题, 用现成的库算不出它需要的编码
- 有人上来非常自信地调了库, 并相信这肯定是没有问题的
- 随后发现原网页中base64还偷偷改了字母表, 做了二次映射, 于是写了个mapping验证了一下, 在网页控制台和python反复比对, 再次确认没有问题
- 然后调试的时候就发现
info
的值计算出来始终不对, 而每个函数看起来结果都一样, 就是组装起来结果不对
网页端里面的base64编码:
for (i = 0; i < imax; i += 3) {
b10 = (getbyte(s, i) << 16) | (getbyte(s, i + 1) << 8) | getbyte(s, i + 2);
x.push(ALPHA.charAt(b10 >> 18));
x.push(ALPHA.charAt((b10 >> 12) & 63));
x.push(ALPHA.charAt((b10 >> 6) & 63));
x.push(ALPHA.charAt(b10 & 63));
}
这个base64编码当且仅当单字节编码的时候是对的
所以手动实现这个错误的base64编码 :)