女朋友教务系统抢课老抢不上,写个代码解决这个问题

查看 89|回复 9
作者:shiyier   
某方正教务系统登陆加密破解
前言
过完年慢慢出成绩了,每天打开看成绩实在麻烦,索性写了一个自动登录的程序,用来每天微信提醒上课以及成绩推送。
功能
已实现:
[ol]
  • 破解登录密码加密,实现自动登录。
    [/ol]
    可实现:
    [ol]
  • 获取课表,每日推送。
  • 抢课快人一步。
  • 成绩推送。
  • 方正教务系统各个功能都有api,可以自动化各种功能。
  • 飞扬的思想来创造吧
    [/ol]
    分析网页
    打开方正教务系统首页随便输入账号密码点击登录,会发现有一个post请求是发送登录信息的,点开Payload发现传入了四个参数。

    yhm是明文显示的,可以忽略。
    剩下的就是csrftoken、mm了。mm传入了两次,但是两次的值是一样的,这个时候直接打开搜索框进行搜索。
    csrftoken值获取
    首先搜索csrftoken的值,发现出现了两个链接,第二个是html页面,一眼就看到了csrftoken。我们点进去看看。

    点开一看发现csrftoken是写在网页里面的,这就很好办了,写代码的时候请求网页用ButifulSoul库解析获取一下就行,现在我们来关注一下请求里面的mm。

    csrftoken获取代码:
    def getpage(self):
        # 获取教务系统网站
        self.session.headers.update({
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36",
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
            "Accept-Encoding": "gzip, deflate",
            "Accept-Language": "zh-CN,zh;q=0.9",
            "Cache-Control": "max-age=0",
            "Connection": "keep-alive",
            "Referer": 'https://jwxt.xjau.edu.cn/jwglxt/xtgl/login_slogin.html?time=' + str(int(time.time())),
            "Upgrade-Insecure-Requests": "1"
        })
        self.response = self.session.get('https://jwxt.xjau.edu.cn/jwglxt/xtgl/login_slogin.html?time=' + str(int(time.time()))).content.decode("utf-8")
        data = BeautifulSoup(self.response, 'lxml')
        self.csrftoken = data.find('input', id='csrftoken')['value']
    mm加密分析
    我尝试了“mm:”、“mm=”、“mm = ”这几个关键字,什么都搜不到,继续搜索mm这个关键字,出现了一大堆,看着就头疼。但是咱们有敏锐的洞察力,一眼就看到了关键字眼:hex2b64(rsaKey.ecvrypt(***))。这不就是rsa非堆成加密嘛,功夫不负有心人,找到了加密方式就很好破解了,我们点击进去看看。

    观察了一下这一块,有个if...else...。在else里面就是mm的加密方式了。总共有三行,很典型的RSA非对称加密。其中先定义了rsakey这个变量,然后用setPublic方法来加密密钥。
    因为是RSA非对称加密,所以“modulus”和“exponent”一定有方法获取到。我们来搜索一下

    搜索到了“modulus”和“exponent”的定义方式在第48行。发现是是请求了一个链接,链接返回的是json格式的数据,我们返回Network找找看。

    果然找到了,请求的时候加上时间戳就可以直接获取了。我们现在返回加密那块。

    我们点击函数hex2b64,他跳转到了一个新的js页面,这个页面只有72行,应该就是hex2b64的加密代码了。

    搜索一下b64tohex,发现有一个function b64tohex(s){}函数,不用想,这个肯定就是b64tohex的加密代码了。是和hex2b64在一个js文件。

    再搜一下encrpt,发现有一个js文件是名字就叫rsa.js。也不用想,肯定就是 RSAEncrypt的加密了。

    这些都找到了,我们就把代码扣下来,写到js文件里面。同时要在js文件里写一个函数,用来调用获取加密密码。
    function getpwd(mm, modulus, exponent) {
    var rsaKey = new RSAKey();
    rsaKey.setPublic(b64tohex(modulus), b64tohex(exponent));
    var enPassword = hex2b64(rsaKey.encrypt(mm));
    return enPassword
    }
    js代码写好后运行一下,提示登陆成功!

    到这里登陆就搞定了。后面获取课程表抢课,成绩推送直接调用接口就可以了。观察了一下所有功能都可以通过调用接口来实现。剩下的就是大家飞扬思想了。
    点击这里下载源码:

    教务, 代码

  • hellopolly   

    代码有了。女朋友在哪里?忘了。我已是两个儿的爸爸了
    shiyier
    OP
      


    当初遇你时 发表于 2023-1-27 21:26
    把里面的网址替换成自己学校的,然后第39行报错simplejson.errors.JSONDecodeError: Expecting value: line ...

    39那里的函数是获取rsa的modulus和exponent,可能你们学校教务系统的json数据格式不太一样
    AsuraSong   

    谢谢楼主分享,思路清晰方便学习
    最新的   

    有你这样的男朋友,你女朋友肯定很幸福
    ManaCola   

    python做小工具确实很方便啊
    lang123   

    谢谢楼主分享,帮助很大,真的厉害!
    YFxbxb888   

    还好还好,大四了,一学期只有一门课
    canxued   

    感谢大佬,马上就可以用了
    当初遇你时   

    把里面的网址替换成自己学校的,然后第39行报错simplejson.errors.JSONDecodeError: Expecting value: line 3 column 1 (char 4)网站系统版本都是一样的。
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部