懂车帝视频连接--JS逆向

这个项目,适合JS逆向学习初学者。
懂车帝:https://zjbyte.cn/i6615388842591518733/
把谷歌开发者工具调处来-network-手机模式,把加载的东西清空,刷新一下页面重新加载
懂车帝视频连接--JS逆向_第1张图片
审查一下这个视频的元素,有这么个视频连接
懂车帝视频连接--JS逆向_第2张图片
把连接复制出来,查看页面源码,查了一下,咦?不是静态的??那是动态AJAX加载出来的吗?查完加载的数据还是没有?没有就对了,JS逆向才是我们的主菜。
懂车帝视频连接--JS逆向_第3张图片
分析一下视频这一块的代码,webkit-playinline跟playinline比较特别,那就shit+ctrl+f全局查找一下其中一个看看,有两个脚本用到,点第一个进去看看
懂车帝视频连接--JS逆向_第4张图片
美化一下代码
懂车帝视频连接--JS逆向_第5张图片
ctrl+f在当前文档中查找playinline,定位到一处,简单分析一下可以找到一段比较可疑的代码块,英文基础还可以的话,我猜n应该就是我们要的连接了,打个断点9746,刷新一下页面。
懂车帝视频连接--JS逆向_第6张图片
自动进来断点,看一下是个连接,把连接复制出来看一下是不是视频
懂车帝视频连接--JS逆向_第7张图片
哎呀,这谁家小伙这么年轻这么有活力啊,可以的。

好,回归正传,视频连接就是这个。回去看一下videoList容器里面都有什么玩意,有src是我们要的,视频分极速跟超清,这一行代码显然是想要超清视频的src。
懂车帝视频连接--JS逆向_第8张图片
那videoList哪来的,查找一下当前文件,有5个匹配,简单分析中间内个赋值了是我们要的,赋值i,i里面的src值用到base64decode加密,用到参数t.main_url,这什么鬼不知道先放一边。
懂车帝视频连接--JS逆向_第9张图片
我们先找一下base64decode在哪,这个方法没有调用到别的特别的方法,很好。
懂车帝视频连接--JS逆向_第10张图片
回去分析一下t.main_url的由来。这里有个方法叫回溯,一层一层往下看call stack也就相当于我们代码参数的来源一层一层往上
懂车帝视频连接--JS逆向_第11张图片
在最后一层我们就很容易揪出了main_url
懂车帝视频连接--JS逆向_第12张图片
知道base64decode方法,知道main_url的值,我们来验证一下能否生成正确的视频连接url,把方法的原代码前头的t.换成var ,如下。

var base64decode = function(e) {
                var t, n, r, o, i, a, s, c = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 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, -1, -1, -1, -1, -1, -1, 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, -1, -1, -1, -1, -1];
                for (a = e.length,
                i = 0,
                s = ""; i < a; ) {
                    do
                        t = c[255 & e.charCodeAt(i++)];
                    while (i < a && t == -1);if (t == -1)
                        break;
                    do
                        n = c[255 & e.charCodeAt(i++)];
                    while (i < a && n == -1);if (n == -1)
                        break;
                    s += String.fromCharCode(t << 2 | (48 & n) >> 4);
                    do {
                        if (r = 255 & e.charCodeAt(i++),
                        61 == r)
                            return s;
                        r = c[r]
                    } while (i < a && r == -1);if (r == -1)
                        break;
                    s += String.fromCharCode((15 & n) << 4 | (60 & r) >> 2);
                    do {
                        if (o = 255 & e.charCodeAt(i++),
                        61 == o)
                            return s;
                        o = c[o]
                    } while (i < a && o == -1);if (o == -1)
                        break;
                    s += String.fromCharCode((3 & r) << 6 | o)
                }
                return s
            }
aHR0cDovL3Y5LXR0Lml4aWd1YS5jb20vNTlkYzExZWJjNjI0MDVhODhkNThlMGU1YTk3MTQ5MDcvNWNmYmRlNjEvdmlkZW8vbS8yMjA3ODY1MDNmNDBkMDc0ZDAyYWJhZDY2NDNkODQ0ZDI3NTExNWUwOTk3MDAwMDAxNDBkYzkzMGZkYy8/cmM9YW5Kbk0zQjBOMngyYVRNek8yZ3pNMEFwUUhSMWQzQjFLVFUyT2pNMk16TTBPalEyT3prOE0wQXBkU2xBWnpOMUtVQm1NM1lwUUdaOGIySm9iREZtWkdoc01XUjNja0FwTkRWa2JWODFjVjl4Y2pZelh5MHRNQzR2YzNNdGJ5TnNiRHBwTlRZdk1DOHRMeTB0TUM0dkxTMHVMMms2WWk1d0l6cGhMWEVqT21BdGJ5TmViV3hoYzJWdmJHRnpiR1p5Y1dBdkxUbyUzRA==

选中console控制台,清空一下,把方法放到控制台里执行一下,生成我们要的连接。直接点一下内个连接,验证一下我们的连接看看对不对。
懂车帝视频连接--JS逆向_第13张图片
艾玛,不错嘛小伙子又见面了,但怎么感觉你内个变小了,咳咳,我说的是人物。仔细想想,嗯,是我之前拿错了,拿了极速视频的main_url,想看超清无码的自己去nong一下。
懂车帝视频连接--JS逆向_第14张图片
那么main_url那么长一串值怎么来的呢,ctrl+f搜一下这个值,可以看到这个值来源与一个请求的响应里面
懂车帝视频连接--JS逆向_第15张图片
分析一下这个get请求,有四个参数,r,s,单字母无规则,全局查找也是没什么头绪,先保留,callback回调函数,这个值很眼熟之前见过,应该是固定的,那就从logo_type入手,搜一下&logo_type懂车帝视频连接--JS逆向_第16张图片
全局搜,文档搜,定位主要区域,这里的logo_type是一个固定值,打个断点,刷新页面,进来选中,查看数据,这里连接已经生成了r跟s
懂车帝视频连接--JS逆向_第17张图片
通过crc32方法传入r.config.remoteURL + r.config.videoID两个变量的合并然后就多出来了r和s。
懂车帝视频连接--JS逆向_第18张图片
r.config.remoteURL好说,是个常量
懂车帝视频连接--JS逆向_第19张图片
那么变量就是r.config.videoID了,我们那拿这个值出来全局搜一下

懂车帝视频连接--JS逆向_第20张图片
直接在首页index源码就有
懂车帝视频连接--JS逆向_第21张图片
剩下就看crc32方法干了啥,有三处特殊变量需要处理,第一处删掉,第二处的t.pathname值是/video/urls/v/1/toutiao/mp4/v0201e380000bf6s9iu4tqbmt08dbopg,这明显是传入连接的切片,我们可以把连接中的//i.snssdk.com替换成空,第三处 [t.protocol, t.hostname].join("//")替换成常量https://i.snssdk.com
懂车帝视频连接--JS逆向_第22张图片
知道orc32方法,知道r.config.remoteURL,r.config.videoID两个变量

var crc32 = function(e) {
                var n = function() {
                    for (var e = 0, t = new Array(256), n = 0; 256 != n; ++n)
                        e = n,
                        e = 1 & e ? -306674912 ^ e >>> 1 : e >>> 1,
                        e = 1 & e ? -306674912 ^ e >>> 1 : e >>> 1,
                        e = 1 & e ? -306674912 ^ e >>> 1 : e >>> 1,
                        e = 1 & e ? -306674912 ^ e >>> 1 : e >>> 1,
                        e = 1 & e ? -306674912 ^ e >>> 1 : e >>> 1,
                        e = 1 & e ? -306674912 ^ e >>> 1 : e >>> 1,
                        e = 1 & e ? -306674912 ^ e >>> 1 : e >>> 1,
                        e = 1 & e ? -306674912 ^ e >>> 1 : e >>> 1,
                        t[n] = e;
                    return "undefined" != typeof Int32Array ? new Int32Array(t) : t
                }()
                  , r = function(e) {
                    for (var t, r, o = -1, i = 0, a = e.length; i < a; )
                        t = e.charCodeAt(i++),
                        t < 128 ? o = o >>> 8 ^ n[255 & (o ^ t)] : t < 2048 ? (o = o >>> 8 ^ n[255 & (o ^ (192 | t >> 6 & 31))],
                        o = o >>> 8 ^ n[255 & (o ^ (128 | 63 & t))]) : t >= 55296 && t < 57344 ? (t = (1023 & t) + 64,
                        r = 1023 & e.charCodeAt(i++),
                        o = o >>> 8 ^ n[255 & (o ^ (240 | t >> 8 & 7))],
                        o = o >>> 8 ^ n[255 & (o ^ (128 | t >> 2 & 63))],
                        o = o >>> 8 ^ n[255 & (o ^ (128 | r >> 6 & 15 | (3 & t) << 4))],
                        o = o >>> 8 ^ n[255 & (o ^ (128 | 63 & r))]) : (o = o >>> 8 ^ n[255 & (o ^ (224 | t >> 12 & 15))],
                        o = o >>> 8 ^ n[255 & (o ^ (128 | t >> 6 & 63))],
                        o = o >>> 8 ^ n[255 & (o ^ (128 | 63 & t))]);
                    return o ^ -1
                }
                  , o = e.replace("//i.snssdk.com", "") + "?r=" + Math.random().toString(10).substring(2);
                "/" != o[0] && (o = "/" + o);
                var i = r(o) >>> 0;
                return "https://i.snssdk.com" + o + "&s=" + i
            }
//i.snssdk.com/video/urls/v/1/toutiao/mp4/
v0201e380000bf6s9iu4tqbmt08dbopg

我们来模拟执行一下这个方法。
懂车帝视频连接--JS逆向_第23张图片
连接后面生成了r跟s,直接点连接打开看看,有我们要的main_url
懂车帝视频连接--JS逆向_第24张图片
这把我们拿内个超清的main_url试一下之前的base64decode方法。
懂车帝视频连接--JS逆向_第25张图片
点开连接,嗯?又是这小伙在卖车。

项目到这就算结束了,欢迎评论探讨。薯片+快乐水,enjoying!

你可能感兴趣的:(JS逆向)