调用博主最近登录时间
生活中的HYGGE
Js解密学习通视频秒过请求

Js解密学习通视频秒过请求

hygge
2022-08-28 / 4 评论 / 1,285 阅读 / 正在检测是否收录...

前言

之前在github找到一个python selenium刷视频和做测验的源码,挂服务器上问题太多了,最近闲下来破解一下网络请求版的刷视频和做测验。
效果图:
l7dcscvl.png
学习通担心的主要是秒过视频会造成学习时长过短的情况,为此没有使用秒过 而是持续请求模拟真实进度,虽然和selenium版的时长差不多,但是更稳定和便捷。
l7dd3xpy.png
视频时长都是完整的有计算的。

视频播放解密

先抓到记录视频播放的请求
l7dd7vhy.png

GET 请求
参数全在URL里,rt,isdrag,_t 这几个参数没什么作用,不发送也可以获得响应
除了enc外的参数都可以在其他请求中获得,本文重点分析enc

首先找切入点,这个请求的构造是由播放器产生的,就会存在参数拼接的情况。
我选择参数名isdrag全局搜索(当然要选特殊的啦,越特殊重复的结果就越少)
l7ddgltb.png

_0x473cb3 = [_0x16dd5d[_0x5d818d(0x242)], '/', _0x16dd5d[_0x5d818d(0x1ee)], _0x5d818d(0x44c), _0x16dd5d[_0x5d818d(0x3af)], _0x5d818d(0x26d), _0x1d0594, _0x5d818d(0x396), _0x16dd5d[_0x5d818d(0x2e2)], _0x5d818d(0x20e), _0x8e40c2, _0x5d818d(0x437), _0x16dd5d['objectId'], _0x5d818d(0x36a), _0x16dd5d[_0x5d818d(0x20c)], _0x5d818d(0x3b1), _0x16dd5d[_0x5d818d(0x3ba)], _0x5d818d(0x1ca), _0x16dd5d[_0x5d818d(0x3bd)], '&isdrag=', _0x9aa55, '&view=pc', _0x5d818d(0x1ef), md5(_0x5dcd20), _0x5d818d(0x1ff), _0x16dd5d['rt'], _0x5d818d(0x2d3), _0x5d818d(0x2ab), new Date()[_0x5d818d(0x1d6)]()][_0x5d818d(0x3d8)]('');

按照对应位置的话更直观一点

'&isdrag=', _0x9aa55, '&view=pc', _0x5d818d(0x1ef), md5(_0x5dcd20),
'&isdrag=',    3    , '&view=pc',       '&enc',     md5(_0x5dcd20),
// enc = f60c04f7cf2820976479ba3758b7d142,  
// 32位,典型的md5加密,所以enc=md5(_0x5dcd20)

继续查看_0x5dcd20

var _0x5dcd20 = Ext[_0x5d818d(0x2a0)][_0x5d818d(0x3ae)](_0x56986f, _0x16dd5d[_0x5d818d(0x3af)], _0x16dd5d[_0x5d818d(0x3bd)], _0x16dd5d[_0x5d818d(0x3ba)] || '', _0x16dd5d[_0x5d818d(0x246)], _0x3a88e3, _0x5d818d(0x24b), _0x16dd5d[_0x5d818d(0x2e2)] * 0x3e8, _0x8e40c2)
// 分析: Ext的二维对象里面是一个方法 小括号后面全是参数

打个断点看一下
l7ddsj9l.png
在511行停下后转去控制台打印一下坐标和索引分别是什么
l7ddtopv.png

String format [{0}][{1}][{2}][{3}][{4}][{5}][{6}][{7}] 59831731 199369846 154762960473479 85bf18fc7d1a0e4707c8b4c771580a53 0 d_yHJ!$pdA~5 767000 0_767
// 这里就很明显了,_0x5dcd20就是将一些参数填充到这个字符串的占位符中
// 如下:
Ext[_0x5d818d(0x2a0)][_0x5d818d(0x3ae)](_0x56986f, _0x16dd5d[_0x5d818d(0x3af)], _0x16dd5d[_0x5d818d(0x3bd)], _0x16dd5d[_0x5d818d(0x3ba)] || '', _0x16dd5d[_0x5d818d(0x246)], _0x3a88e3, _0x5d818d(0x24b), _0x16dd5d[_0x5d818d(0x2e2)] * 0x3e8, _0x8e40c2)
'[59831731][199369846][154762960473479][85bf18fc7d1a0e4707c8b4c771580a53][0][d_yHJ!$pdA~5][767000][0_767]'

这个字符串中的参数,有些是固定不变的,会变动的是取这个_0x16dd5d数组的成员,基本都是可以在其他请求中取到的,没有加密信息。
l7ddz645.png

对这个字符串进行md5加密就可以得到enc

解决无限debugger

我们在对一些网站进行JS逆向分析过程中,很有可能会遇到网站禁止开发人员使用F12进行网页调试,如果你打开就会遇到无限debugger的这个情况,当我们遇到这种情况,我们该如何进行避免无限debugger弹出呢?

解决方法:

可以直接在控制台输入以下代码,可以有效的跳过无限debugger(Chrome浏览器)

Function.prototype.constructor = function(){}

核心代码

while (currentProgress <= video_info.duration)
{
    string enc = $"[{CurrentCourse.ClassId}][{vav.defaults.userid}][{point.jobid}][{point.objectId}][{currentProgress}000][d_yHJ!$pdA~5][{video_info.duration}000][0_{video_info.duration}]";
    enc = GetMD5(enc);// 32位md5加密

    string requestBody = $"clazzId={CurrentCourse.ClassId}&playingTime={currentProgress}&duration={video_info.duration}" +
        $"&clipTime=0_{video_info.duration}&objectId={vav.attachments[0].property.objectid}&otherInfo={vav.attachments[0].otherInfo}" +
        $"&courseId={CurrentCourse.CourseId}&jobid={vav.attachments[0].property.jobid}&userid={vav.defaults.userid}&view=pc&enc={enc}&dtype=Video";
    // 跳过视频
    VideoProgressVo jumpVideoResponse = await ($"https://mooc1.chaoxing.com/multimedia/log/a/{vav.defaults.cpi}/{video_info.dtoken}?{requestBody}")
        .WithHeader("Referer", "https://mooc1.chaoxing.com/ananas/modules/video/index.html")
        .WithHeader("User-Agent", "apifox/1.0.0 (https://www.apifox.cn)")
        .WithHeader("Content-Type", "application/json")
        .WithCookies(Cookies)
        .GetJsonAsync<VideoProgressVo>();
    Log($"当前进度值:{currentProgress},总长度:{video_info.duration},状态:{jumpVideoResponse.isPassed}");
    if (!jumpVideoResponse.isPassed)
    {
        if(currentProgress + 60 > video_info.duration)
        {
            currentProgress = video_info.duration;
        }else if(currentProgress == video_info.duration)
        {
            currentProgress += 1;
        }else
        {
            currentProgress += 60;
        }
    }else
    {
        Log("该视频已完成");
        currentProgress = video_info.duration + 1;
    }
    await Task.Delay(60 * 1000);
}

引用

1.JS调试的时候遇到无限debugger怎么办? : https://blog.csdn.net/qq_19309473/article/details/120573903

2

评论 (4)

取消
  1. 头像
    冷曦
      Windows 10 x64 Edition Windows 10 x64 Edition  /  Google Chrome 106.0.0.0 Google Chrome 106.0.0.0

    牛蛙,不愧是大佬,还是喜欢看分析过程

    回复
    1. 头像
      1
        Mac OS X Mac OS X  /  Safari 15.3 Safari 15.3
      @ 冷曦

      这个有软件吗

      回复
  2. 头像
    大佬
      Android 10 Android 10  /  IBrowse r IBrowse r

    牛逼666

    回复
  3. 头像
    曦鹤
      Android 12 Android 12  /  Google Chrome 78.0.3904.108 Google Chrome 78.0.3904.108

    软件要自己抓包吗?还是在哪里下载

    回复