作者: icer233 协作者: Alex
[TOC]
网络部分
登陆
获得登陆界面背景图
通过 GET 方法获得登陆界面背景图
GET https://wwwr.aiwenyun.cn/static/yxt/image/loginBg_new2.jpg
我们可以劫持这个包, 实现如下效果:

检测用户是否使用了虚拟机
通过 POST 获得 screenRecordList
POST https://www.aiwenyun.cn/yxt/servlet/antiScreenRecord/nct/getScreenRecordList
其中携带请求体为
{
"os" : "virtualMachine"
}
代表请求得到的是虚拟机进程列表
随后得到回应为虚拟机程序的进程名和窗口名, 爱问云会在检测到这些进程时黑屏提示
可以通过网络劫持, 修改检测列表来阻止爱问云检测
{
"code" : 0,
"execTime" : 3,
"obj" : [
{
"applicationName" : "VirtualBox",
"id" : 201,
"os" : "virtualMachine",
"processName" : "virtualbox"
},
{
"applicationName" : "vmware",
"id" : 202,
"os" : "virtualMachine",
"processName" : "vmware"
},
{
"applicationName" : "bochs",
"id" : 204,
"os" : "virtualMachine",
"processName" : "bochs"
},
{
"applicationName" : "KVM",
"id" : 205,
"os" : "virtualMachine",
"processName" : "qemu"
},
{
"applicationName" : "parallels",
"id" : 206,
"os" : "virtualMachine",
"processName" : "parallels"
},
{
"applicationName" : "xen",
"id" : 207,
"os" : "virtualMachine",
"processName" : "xen"
}
],
"reqId" : "1738390617177_0.5372871354588453",
"reqTime" : 1738390617177
}
登录
通过 POST 进行用户登录, 请求用户信息
POST https://www.aiwenyun.cn/custom/usr/doLogin
携带了用户名, 密码等信息
{
"clientVersion" : "爱问云客户端版本",
"deviceId" : "设备ID",
"deviceName" : "设备名称",
"loginName" : "用户名",
"name" : "用户名",
"osInfo" : "系统信息, 如CPU, 系统版本等",
"passwd" : "密码的MD5",
"rawName" : "用户名",
"role" : 1, // 推测1表示学生, 可能有其他身份如老师, 管理员等
"systemInfo" : "系统信息",
"version" : "系统版本信息"
}
其中密码是原密码的MD5
回应得到
{
"code" : 0,
"execTime" : 54,
"mytype" : 1,// 对应请求体中的role
"obj" : {
"LoginUserType" : 1,// 对应请求体中的role
"access_token" : "12345-6-7890123-abcde12345fghij67890klmno12345pq12.0.18_5.51.182-PC-ai",// access-token
"active" : 1,
"country" : "CN",// 国家代码, 与语言相关
"createAt" : "2023-06-14 10:23:51 +08:00",// 账户创建时间
"createId" : -1,
"expire_date" : 4842431999000,// 过期时间(时间戳)
"externalId" : "xxxxxxxx",// 唯一的ID, 类似UUID
"externalLoginName" : "xxxx"// 第二用户名
"followFlag" : 0,
"formalFlag" : 1,
"grade" : 123,// 年级
"hasPopQr" : 0,
"id" : 1234567,// 用户ID
"lastLogin" : 1234567890000,// 最后登录时间(时间戳)
"loginMobile" : "12345",// 绑定的手机号
"loginName" : "xxxxx",// 用户名
"loginname" : "xxxxx",// 用户名
"mCode" : "",
"matchedOrgs" : [// 机构信息
{
"loginId" : 1234567,// 用户ID
"loginName" : "xxxxx",// 用户名
"loginType" : 1,// role
"myid" : 12345,// 机构ID
"name" : "xxxx",// 校区
"oemName" : "xxxx"// 机构名称
}
],
"mobile" : "xxxx",// 绑定手机号
"myFav" : "123abc",
"myFile" : "123abc",
"myMini" : "123abc",
"myOrg" : {// 管理员信息
"attribute" : 10,
"code" : "1651806498446",
"expire_date" : 1123451199000,// 过期时间(时间戳)
"formal_limitaccount" : 1,
"name" : "xxxx",// 校区
"ownerMobile" : "12345678901",// 管理员手机号
"ownerName" : "xxx",// 管理员姓名
"parentId" : 12345,
"platform" : "ai",// 平台爱问云
"service_phone" : "",
"shortName" : "xxxx"// 机构名
},
"myid" : 1234567,// 用户ID
"mytype" : 1,
"name" : "xxx",// 真实名字
"org_id" : 12345,// 机构ID
"plasoCoin" : 0,
"profile" : "xxx",
"register_from" : 9,
"school" : "xxx",// 学校
"score" : 45000,// 分数
"serviceFlag" : 1,
"sex" : 0,// 性别
"subscribeFlag" : 0,
"supportParent" : 0,
"tempProfile" : "xxx",
"totalGetScore" : 12345,
"totaloutScore" : 0,
"userLevel" : 1,
"userType" : 1,
"validTimeInterval" : 10
},
"reqId" : "1738390619603_0.5484605022893401",
"reqTime" : 1234567890123 //请求时间, 时间戳
}
其中access-token是最为重要的, 用这个可以获得用户的回放视频的信息
获取机构信息
POST https://www.aiwenyun.cn/yxt/servlet/org/getOrgConfig
请求体为
{
"orgId": 12345 //即上一节获得的机构ID
}
可以获得该机构的一些自定义内容, 如头图, 等级划分, 支付方式, 一些设置
最重要的是, 这个请求里包含了课程的水印设置!
[!CAUTION]
遗憾的是, 经过实践,修改水印相关的部分并不能去水印,但是可以使水印缩小等.
是否显示水印可能被包含在其他地方,如 "xxOption" 里.
值得注意的是,这些 Option 的数字代表的应该是一些数字的和,每个选项用一个2的幂来表示,机构开启了哪些选项,Option 的值就是这些选项代表的数字之和.
例如 A:1, B:2, C:4, D:8
我想开启AC选项,那就是5,开启BCD选项,就是15.
如果你要问我是怎么想到的?一是MC物品指令里的HideFlags键就是用的这个方式,好巧不巧,物品格式也是json。二是看到了"studentInfoEditOptions":127, 127是什么? 127=128-1=1+2+4+8+16+32+64, 这代表了学生信息编辑方面, 机构打开了所有权限, 事实也正是如此.
由此, 你就可以通过修改这些Option的值来用类似控制变量的方法试出每个值代表的意义.
以上是笔者根据获得的信息直接结合经验进行猜测分析.
如果你想测试出每个值代表的功能, 可以去爱问云官网的帮助手册中关于后台操作指南的部分, 或许会有所帮助.(后台设置使用指南 | 云学堂帮助中心)
{
"code" : 0,
"execTime" : 10,
"obj" : {
"_base" : 123,
"_content" : 123,
"_liveClass" : 123,
"_liveClass_v2" : 3,
"_mall" : 1234,
"_mini" : 1,
"admin_test_center" : true,
"androidLabOption" : 0,
"androidMigrate" : false,
"androidMigrateTip" : "感谢您的信任与使用,为保障您的安全,请下最新版本",
"baseOption" : 0,
"blackList" : [],
"classOption" : 123,
"d_canvasHeightCounts" : 123,
"d_dataIsolatedByClass" : 0,//每节课的数据分开储存,类似MC的版本隔离
"d_enableLiveTestPoints" : 0,
"delayEndLiveclass" : {
"delayEnd" : 1234,
"delayEndTimes" : 1,
"enable" : true
},
"disableAiSkip" : false,
"enableClientMessageCenter" : true,
"enableCollect3DMusic" : false,
"enableHighSpeedMode" : 0,
"enableInfiAnnotation" : false,
"enableNewClassExam" : 0,
"enableOpenLocation" : false,
"enablePcClientLearning" : true,
"enableRTC3A" : true,
"enableRobotPen" : 0,
"enableSmallWindowDisplay" : true,
"enterLiveclassEarly" : {//提前进入课堂时间(秒)
"admin" : 600,
"assistant" : 600,
"enable" : true,
"student" : 300,// 学生只能提前5分钟
"teacher" : 600
},
"gradeConfig" : [ "优秀", "良好", "不错", "过关", "努力" ],
"group" : 31,
"innerWaterMarkStyle" : {//课程水印设置,可以劫持修改水印,具体内容见帮助文档
"depth" : 22,
"enhanced" : 1,
"file" : true,
"size" : 18,
"type" : 1
},
"isNewPlayer" : true,
"labOption" : 9,
"limitSourceWatchTimes" : {},
"liveRecordExpireTime" : -1,//回放过期时间,-1表示不会过期
"liveclassRecordOption" : 3,
"manyDeliverGood" : false,
"orgId" : 12345,
"orgOption" : 123,
"payProvider" : [ "WEIXIN", "ALIPAY" ],
"refundCheck" : false,
"sepLiveMsg" : false,
"showHisChatMsg" : true,//显示历史聊天记录
"showParentLearningProgress" : 1,
"studentInfoEditOptions" : 127,
"supportHDImage" : 0,
"theme" : {
"_id" : "67a2f1868f0489a2f72f80ac",
"banner" : "https://abc.com/1.blob",// 机构头图,爱问云随后会Get这个地址,可以劫持
"color" : 0,
"text" : ""
},
"upimeTeacherTool" : 123,
"videoISP" : "POLYV",
"videoProvide" : "ossvideo",
"whiteList" : []
},
"reqId" : "1234512345289_0.020347557364628344",
"reqTime" : 1234512345289
}
获取菜单信息
POST https://www.aiwenyun.cn/yxt/servlet/org/menu
请求得到爱问云客户端界面中菜单上的各语言文本内容
{
"code" : 0,
"execTime" : 11,
"obj" : {
"menu" : {
"de" : {
"course" : "Lehrplan",
"exam" : "Prüfung",
"group" : "Klasse",
"homepage" : "Startseite",
"homework" : "Nach der Klassenkonsolidierung",
"learn" : "Lernzentrum",
"liveclass" : "Echtzeitunterricht",
"market" : "Einkaufszentrum",
"qa" : "Tutor",
"textbook" : "Lehrplan",
"train" : "Praxis"
},
"en" : {
"course" : "Course",
"exam" : "Quiz",
"group" : "Class",
"homepage" : "Home",
"homework" : "Task",
"learn" : "Study",
"liveclass" : "Live Class",
"market" : "Mall",
"qa" : "Tutoring",
"textbook" : "course",
"train" : "Exercise"
},
"ja" : {
"course" : "カリキュラム",
"exam" : "テスト",
"group" : "クラス",
"homepage" : "トップページ",
"homework" : "授業後の強化",
"learn" : "勉強",
"liveclass" : "リアルタイムクラス",
"market" : "ショッピングモール",
"qa" : "の助言を仰ぐ",
"textbook" : "カリキュラム",
"train" : "練習する"
},
"ko" : {
"course" : "과정",
"exam" : "퀴즈",
"group" : "학급",
"homepage" : "첫 페이지",
"homework" : "방과 후 공고화",
"learn" : "학습 센터",
"liveclass" : "실시간 교실",
"market" : "상점",
"qa" : "지도",
"textbook" : "과정",
"train" : "연습"
},
"zh" : {
"course" : "课程",
"exam" : "测验",
"group" : "班级",
"homepage" : "首页",
"homework" : "课后巩固",
"learn" : "学习中心",
"liveclass" : "实时课堂",
"market" : "商城",
"qa" : "辅导",
"textbook" : "课程",
"train" : "练习"
}
},
"quickLinks" : {
"help_link" : "https://help.aiwenyun.cn/",
"platform" : "ai",
"survey_link" : "https://www.xmplus.cn/lite/7446908185921536",
"upgrade_link" : "https://help.aiwenyun.cn/new-features/9993"
}
},
"reqId" : "1738390620222_0.23449369846215995",
"reqTime" : 1738390620222
}
可以劫持修改:

在线课堂
没有内容显示的图片
GET https://wwwr.aiwenyun.cn/static/yxt/image/theme/aiblue/noContent.png
获取课表
POST https://www.aiwenyun.cn/gt/servlet/timeTable/getTimeTable
标头中携带
{
...
"access-token": "xxx"
...
}
请求体携带
{
"hasReachBottom" : true,// 受否达到课表底部
"pageSize" : 20,// 一页显示课程数量
"pageStart" : 0,// 第几页
"startTime" : 1738392424866,// 起始日期(时间戳)
"taskType" : [ 1, 2 ]
}
获取历史课堂信息
POST https://www.aiwenyun.cn/liveclassgo/api/v1/history/listRecord
标头中携带同上, 最为重要的仍然是 access-token
请求体携带
{
"dateFrom" : 1730390400000,// 起始日期(时间戳)
"dateTo" : 1738425599000,// 结束日期(时间戳)
"indexStart" : 0,// 起始页码
"pageSize" : 50// 单页显示数量
}
响应得到
{
"code" : 0,
"msg" : "success",
"obj" : {
"list" : [
{
...
}
]
}
其中 list 里面是每节课的信息
{
"_id" : "12345abcde",// 课程唯一ID
"assistant" : 0,// 猜测:助教
"availWatchTimes" : -1,// 允许观看次数, -1代表无限制
"createTime" : 1737624607777,// 创建时间(时间戳)
"duration" : 10752,// 总时长(秒)
"fileCommon" : {
"_id" : "67890fghijk",// 回放文件ID
"aiStatus" : 0,
"cover" : "",// 封面
"createTime" : 1737624769030,// 创建时间(时间戳)
"duration" : 10752,// 总时长(秒)
"location" : "orgid/1245_1245t1_ab1",// 回放文件路径2
"locationPath" : "liveclass",// 回放文件路径1
"name" : "课程A", // 课程名称
"type" : 4,
"uploadToOrg" : false
},
"fileId" : "abcd123",// 文件ID
"gone" : false,
"isEvaluated" : false,
"listenerCount" : 1,
"liveclass" : 18037900,
"longDesc" : "",
"orgId" : 12345,// 机构ID
"recordOption" : 0,
"shortDesc" : "课程A",// 课程名称
"teacher" : 114514,// 教师ID
"teacherName" : "A老师",// 教师名字
"totalCount" : 100,// 学生人数
"uploadToOrg" : false,
"userCount" : 3,
"validTime" : 5000000000000,// 保质期
"watchProgress" : 53// 观看进度(百分比)
}
获得教师信息
POST https://www.aiwenyun.cn/yxt/servlet/user/nc/getTeacherInfo
标头同上
请求体携带
{
"userId" : [ 114514 ]// 教师ID列表
}
响应体
{
"code" : 0,
"execTime" : 9,
"obj" : [
{
"active" : 1,
"id" : 114514,// 教师ID
"loginName" : "abc123",// 教师用户名
"name" : "A老师"// 教师名字
}
],
"reqId" : "1738392437616_0.7790627685618978",
"reqTime" : 1738392437616
}
获取观看限制
POST https://www.aiwenyun.cn/course/api/v1/nct/m/package/task/getFileWatchLimit
标头是 access-token, 请求体是这节课的 fileId
响应体是
{
"code" : 0,
"msg" : "success",
"obj" : {
"availWatchTimes" : -1
}
}
获取回放文件信息
POST https://www.aiwenyun.cn/yxt/servlet/file/getfileinfo
标头是 access-token, 请求体是这节课的 fileId
响应得到这节课的一些信息, 前面基本都有, 不做赘述
再次获取录屏进程列表
通过 POST 获得 screenRecordList
POST https://www.aiwenyun.cn/yxt/servlet/antiScreenRecord/nct/getScreenRecordList
其中携带请求体为
{
"os" : "windows"
}
代表请求得到的是Windows中的常见录屏软件
随后得到响应为这些录屏软件的进程名和窗口名, 爱问云会在检测到这些进程时黑屏提示
可以通过网络劫持, 修改检测列表来阻止爱问云检测
响应得到
[
{
"id": 7,
"processName": "captura.exe",
"os": "windows",
"applicationName": "Captura"
},
{
"id": 8,
"processName": "EVCapture.exe",
"os": "windows",
"applicationName": "EV录屏"
},
{
"id": 9,
"processName": "oCam.exe",
"os": "windows",
"applicationName": "oCam"
},
{
"id": 10,
"processName": "GifCam.exe",
"os": "windows",
"applicationName": "GifCam"
},
{
"id": 11,
"processName": "bdcam.exe",
"os": "windows",
"applicationName": "Bandicam"
},
{
"id": 12,
"processName": "FoxitREC.exe",
"os": "windows",
"applicationName": "福昕录屏大师"
},
{
"id": 13,
"processName": "KK.exe",
"os": "windows",
"applicationName": "KK录像机"
},
{
"id": 14,
"processName": "PotPlayerMini64.exe",
"os": "windows",
"applicationName": "PotPlayer"
},
{
"id": 15,
"processName": "PotPlayerMini.exe",
"os": "windows",
"applicationName": "PotPlayer"
},
{
"id": 19,
"processName": "RecordIt.exe",
"os": "windows",
"applicationName": "Recordit"
},
{
"id": 20,
"processName": "ApowerREC.exe",
"os": "windows",
"applicationName": "傲软录屏(ApowerREC)"
},
{
"id": 26,
"processName": "ScreenRecord.exe",
"os": "windows",
"applicationName": "迅捷视频剪辑软件"
},
{
"id": 27,
"processName": "screcorder.exe",
"os": "windows",
"applicationName": "迅捷视频剪辑软件"
},
{
"id": 31,
"processName": "WeLook.exe",
"os": "windows",
"applicationName": "华为智慧快录"
},
{
"id": 34,
"processName": "Monosnap.exe",
"os": "windows",
"applicationName": "Monosnap"
},
{
"id": 42,
"processName": "HiRecMaster.exe",
"os": "windows",
"applicationName": "嗨格式录屏大师"
},
{
"id": 86,
"processName": "JiSuRecorder.exe",
"os": "windows",
"applicationName": "开心录屏"
},
{
"id": 88,
"processName": "ScreenRecord.exe",
"os": "windows",
"applicationName": "风云录屏"
},
{
"id": 91,
"processName": "screen_recorder.exe",
"os": "windows",
"applicationName": "金飞翼屏幕录像大师"
},
{
"id": 94,
"processName": "ScreenRecorder.exe",
"os": "windows",
"applicationName": "迅捷屏幕录像工具/超级录屏"
},
{
"id": 106,
"processName": "XELive.exe",
"os": "windows",
"applicationName": "小鹅通"
},
{
"id": 107,
"processName": "小鹅通助手.exe",
"os": "windows",
"applicationName": "小鹅通助手"
},
{
"id": 124,
"processName": "Screencast.exe",
"os": "windows",
"applicationName": "录猎2"
},
{
"id": 126,
"processName": "Action.exe",
"os": "windows",
"applicationName": "Action"
},
{
"id": 128,
"processName": "FineScreenRecorder.exe",
"os": "windows",
"applicationName": "精细屏幕录制"
},
{
"id": 129,
"processName": "RecForth.exe",
"os": "windows",
"applicationName": "RecForth"
},
{
"id": 130,
"processName": "screenbits.exe",
"os": "windows",
"applicationName": "screenbits"
},
{
"id": 131,
"processName": "screenmix.exe",
"os": "windows",
"applicationName": "screenmix"
},
{
"id": 132,
"processName": "Vidline.exe",
"os": "windows",
"applicationName": "Vidline"
},
{
"id": 133,
"processName": "recbutton.exe",
"os": "windows",
"applicationName": "recbutton"
},
{
"id": 134,
"processName": "overspeed.exe",
"os": "windows",
"applicationName": "overspeed"
},
{
"id": 135,
"processName": "debut.exe",
"os": "windows",
"applicationName": "debut"
},
{
"id": 136,
"processName": "DemoCreatorCN.exe",
"os": "windows",
"applicationName": "万兴录演"
},
{
"id": 138,
"processName": "heyubao.exe",
"os": "windows",
"applicationName": " 和育宝"
},
{
"id": 162,
"processName": "FSCapture.exe",
"os": "windows",
"applicationName": "faststone2"
},
{
"id": 165,
"processName": "录屏软件【点我启动】.exe",
"os": "windows",
"applicationName": "录屏软件"
},
{
"id": 194,
"processName": "WeMeetApp.exe",
"os": "windows",
"applicationName": "腾讯会议"
},
{
"id": 195,
"processName": "RecorderPro.exe",
"os": "windows",
"applicationName": "飞思录屏"
},
{
"id": 196,
"processName": "AirPlayer.exe",
"os": "windows",
"applicationName": "AirPlayer"
},
{
"id": 198,
"processName": "wemeetapp.exe",
"os": "windows",
"applicationName": "腾讯会议 "
},
{
"id": 200,
"processName": "VsoDownloader.exe",
"os": "windows",
"applicationName": "VSO视频下载软件"
}
]
评论区
点开视频或者哪里有一个请求可以获得评论区的信息
包括该信息内容、发出者的名字、用户名、发出信息内容等
回放视频链接
回放视频是一个m3u8链接, 它由三部分组成
第一部分是 https://filecdn.plaso.cn/liveclass/plaso/
第二部分时每个视频的 location orgid/xxxxxxxxxxxxxxx
第三部分是一个后缀, 例如 /ts1/t.m3u8
前两部分在前文已经研究得比较通透了, 第三部分是请求plist等等, 参数是和服务器, 也就是阿里云的储存桶等相关的, 参考这几篇文章:
https://help.aliyun.com/zh/oss/developer-reference/common-http-headers
https://help.aliyun.com/zh/oss/developer-reference/add-signatures-to-urls?spm=a2c4g.11186623.0.0.24635f92lNzztY
https://www.alibabacloud.com/help/tc/oss/developer-reference/add-signatures-to-urls
我还没有研究, 各位有空可以试一试.
[!TIP]
研究不出来怎么办?
手动抓一次m3u8不就知道了吗!
一个机构应该都是一样的!
本地部分
历史课堂
反截屏
在打开一个回放视频时, 爱问云会调用 Windows API SetWindowDisplayAffinity()
这个函数可以指定窗口内容的显示位置.
[!NOTE]
语法
BOOL SetWindowDisplayAffinity(
[in] HWND hWnd,
[in] DWORD dwAffinity
);
参数
[in] hWnd
类型:HWND
顶级窗口的句柄。 窗口必须属于当前进程。
[in] dwAffinity
类型:DWORD
指定窗口内容的显示位置的显示相关性设置。
此参数的取值可为下列值之一:
[table]
[tr]
值[/td]
含义[/td]
[/tr]
[tr]
[td]WDA_NONE
0x00000000