大神论坛

找回密码
快速注册
查看: 328 | 回复: 0

[经验分享] WEB逆向之智慧职教 icve 课程接口逆向分析

主题

帖子

0

积分

初入江湖

UID
600
积分
0
精华
威望
0 点
违规
大神币
68 枚
注册时间
2023-09-16 15:13
发表于 2023-10-29 10:10
本帖最后由 blindcat 于 2023-10-29 10:10 编辑

最近学校要求看智慧职教,课程有60个学时,于是打算写一个小工具过掉他
由于我只是为了功能实现,就不一一获取Cookie了,不过他是从登录接口获取一个TOKen
有兴趣的可以去抓,我的目的是为了实现功能,能用就可以

首先我先寻找视频播放接口,我发现了这个接口,虽然每隔秒都在发起请求,

但是看完视频发送的请求不一样,于是我直接调用他发完请求的参数进行调试
“cellId”, id//课程Id
“learntime”, “121.8”//学习的时间,我这边直接用常量代替
“status”, “1”//1为完成视频状态
经过调试,课程进度成功增加了
使用易语言编写代码

.版本 2

.子程序 过课, 文本型
.参数 id, 文本型
.局部变量 局_网址, 文本型
.局部变量 局_方式, 整数型
.局部变量 ADD_数据包, 类_POST数据类
.局部变量 局_提交数据, 文本型
.局部变量 局_提交cookie, 文本型
.局部变量 ADD_协议头, 类_POST数据类
.局部变量 局_提交协议头, 文本型
.局部变量 局_结果, 字节集
.局部变量 局_返回, 文本型
.局部变量 json, 类_json
id = 文本_取出中间文本 (id, #常量1, #常量2)
局_网址 = “https://www.icve.com.cn/study/directory/updateStatus”
局_方式 = 1
ADD_数据包.添加 (“cellId”, id)
ADD_数据包.添加 (“learntime”, “121.8”)
ADD_数据包.添加 (“status”, “1”)
局_提交数据 = ADD_数据包.获取Post数据 ()
局_提交cookie = Cookie //全局变量
ADD_协议头.添加 (“Accept”, “*/*”)
ADD_协议头.添加 (“Accept-Language”, “zh-CN,zh;q=0.9”)
ADD_协议头.添加 (“Connection”, “keep-alive”)
ADD_协议头.添加 (“Content-Length”, “50”)
ADD_协议头.添加 (“Content-Type”, “application/x-www-form-urlencoded; charset=UTF-8”)
ADD_协议头.添加 (“Host”, “www.icve.com.cn”)
ADD_协议头.添加 (“Origin”, “https://www.icve.com.cn”)
ADD_协议头.添加 (“Sec-Fetch-Dest”, “empty”)
ADD_协议头.添加 (“Sec-Fetch-Mode”, “cors”)
ADD_协议头.添加 (“Sec-Fetch-Site”, “same-origin”)
ADD_协议头.添加 (“User-Agent”, “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36”)
ADD_协议头.添加 (“X-Requested-With”, “XMLHttpRequest”)
ADD_协议头.添加 (“sec-ch-ua-mobile”, “?0”)
局_提交协议头 = ADD_协议头.获取协议头数据 ()
局_结果 = 网页_访问_对象 (局_网址, 局_方式, 局_提交数据, 局_提交cookie, , 局_提交协议头, , , , , , , , , , , )
局_返回 = 到文本 (编码_编码转换对象 (局_结果))
返回 (局_返回)

用易语言写了一个子程序,由于后期使用json解析获取课程ID在课程ID前后有“”,这会影响我们视频进度的修改,
于是使用文本_取出中间文本 (id, #常量1, #常量2),将“”去除,只留下课程id

功能实现了,又有了一个新问题,一项科目有十几节甚至几十节课,
我们不可能一个个的复制粘贴id,于是我们需要写一个子程序获取课程Id并且调用过课子程序

我们在课程页面进行抓包,发现是一个接口返回的Json,这就简单了,生成一个获取Json子程序

.版本 2

.子程序 获取课程, 文本型
.参数 课程id
.局部变量 局_网址, 文本型
.局部变量 局_方式, 整数型
.局部变量 局_提交cookie, 文本型
.局部变量 ADD_协议头, 类_POST数据类
.局部变量 局_提交协议头, 文本型
.局部变量 局_结果, 字节集
.局部变量 局_返回, 文本型


局_网址 = “https://www.icve.com.cn/study/Directory/directoryList?courseId=” + 课程id
局_方式 = 0
局_提交cookie = Cookie
ADD_协议头.添加 (“Accept”, “*/*”)
ADD_协议头.添加 (“Accept-Language”, “zh-CN,zh;q=0.9”)
ADD_协议头.添加 (“Connection”, “keep-alive”)
ADD_协议头.添加 (“Content-Length”, “50”)
ADD_协议头.添加 (“Content-Type”, “application/x-www-form-urlencoded; charset=UTF-8”)
ADD_协议头.添加 (“Host”, “www.icve.com.cn”)
ADD_协议头.添加 (“Origin”, “https://www.icve.com.cn”)
ADD_协议头.添加 (“Referer”, “https://www.icve.com.cn/study/directory/dir_course.html?courseId=wa77apvwaretikfvq20vg&chapterId=ag77apvo65pr3dc7cehq&sort=0.001”)
ADD_协议头.添加 (“Sec-Fetch-Dest”, “empty”)
ADD_协议头.添加 (“Sec-Fetch-Mode”, “cors”)
ADD_协议头.添加 (“Sec-Fetch-Site”, “same-origin”)
ADD_协议头.添加 (“User-Agent”, “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36”)
ADD_协议头.添加 (“X-Requested-With”, “XMLHttpRequest”)
ADD_协议头.添加 (“sec-ch-ua-mobile”, “?0”)


局_提交协议头 = ADD_协议头.获取协议头数据 ()

局_结果 = 网页_访问_对象 (局_网址, 局_方式, , 局_提交cookie, , 局_提交协议头, , , , , , , , , , , )
局_返回 = 到文本 (编码_编码转换对象 (局_结果))
返回 (局_返回)

使用大课程的Id、获取课程里面所有的课程Json,随后我们该写一个解析Json并且调取过课

.版本 2
.支持库 spec

.子程序 子程序1
.参数 课程id, 文本型
.局部变量 bool, 逻辑型
.局部变量 json, 类_json
.局部变量 array, 类_json
.局部变量 n, 整数型
.局部变量 i, 整数型
.局部变量 y, 整数型

bool = json.解析 (到文本 (获取课程 (课程id)))
.如果 (bool)

.否则

.如果结束
array = json.取属性 (“directory”)
n = array.成员数 ()
.计次循环首 (n, i)

.计次循环首 (json.取属性 (“directory[” + 到文本 (i - 1) + “].chapters”).成员数 (), y)
调试输出 (json.取属性对象 (“directory[” + 到文本 (i - 1) + “].chapters[” + 到文本 (y - 1) + “].cells[0].Title”) + #换行符)
调试输出(json.取属性对象 (“directory[” + 到文本 (i - 1) + “].chapters[” + 到文本 (y - 1) + “].cells[0].Id”) + #换行符)
调试输出 (json.取属性对象 (“directory[” + 到文本 (i - 1) + “].chapters[” + 到文本 (y - 1) + “].cells[1].Title”) + #换行符)
调试输出 (json.取属性对象 (“directory[” + 到文本 (i - 1) + “].chapters[” + 到文本 (y - 1) + “].cells[1].Id”) + #换行符)
过课 (json.取属性对象 (“directory[” + 到文本 (i - 1) + “].chapters[” + 到文本 (y - 1) + “].cells[0].Id”))
过课 (json.取属性对象 (“directory[” + 到文本 (i - 1) + “].chapters[” + 到文本 (y - 1) + “].cells[1].Id”))
延迟 (到整数 (编辑框7.内容))
.计次循环尾 ()
.计次循环尾 ()

由于我的课程只有视频+PPT,我就只循环了cells[0],cells[1]的Id进行课程,如果有人想完善可以识别一下Json
我也没做课程的进度识别,运行就是从0刷到满,因为我只是为了实现功能,不是为了做一个所有人可以用的程序//主要还是懒

另外请谨慎使用我的方法,由于原本视频是每隔几秒调用一次Api,最后再发起一次API结束,我这种方法无疑后台肯定能监控到,我甚至将学习的时间设置为常量
仅供参考,我也是为了赶快刷完省事截个图才选择这种方法的,不排除后期对我的进度清零的可能

由于版规限制,就不提供软件了



注:若转载请注明大神论坛来源(本贴地址)与作者信息。

返回顶部