电影解析逆向
2026/1/31大约 7 分钟
电影解析逆向
针对网站:https://www.daga.cc/ 通道 搜影片名称专用 的解析的逆行。
使用js语言,还原加密参数,执行下面的代码之后,会打印出M3U8的地址,根据M3u8地址,可以在使用其他的下载工具,将影片进行下载,本节不做补充。
思路大概描述,不做图片记录
- 打开网站。检测解析功能是否可用
- 可以正常解析腾讯视频的会员电影
- 打开F12,过无限Debug
- 观察请求,发现只有一个请求,向接口API发送请求,携带加密参数和待解析的视频地址
- 唯一的逆向过程就是找到加密参数的生成过程,发现调用了一个关键函数
jiexi; - 找到目标函数,进行分析,将其代码补全。
原始函数位置
this.paixu = e => {
for (let t = 0; t < e.length; t++)
for (let n = t; n > 0; n--)
if (e[n].source.eps.length > e[n - 1].source.eps.length) {
let t = e[n - 1]
, i = e[n];
e[n] = t,
e[n - 1] = i
} else
e[n].source.eps.length,
e[n - 1].source.eps.length;
return e
}
,
this.spStatus = e => !!this.state.fromVip || 0 !== e.sp,
this.jiexi = async function() {
let e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0
, i = n.m1907Url;
if (window.location.host !== i && "m1-z2.cloud.vving.vip:2223" !== window.location.host) {
if (1 == Math.floor(2 * Math.random() + 1)) {
const e = '<div style="color: #000"><br>\u52a0\u901f\u5931\u8d25 \u8bf7\u8054\u7cfb\u5ba2\u670d \u9519\u8bef\u4ee3\u7801 103</div>';
return void n.writeBody(e)
}
}
try {
let i = (0,
N.A)("jx");
if (0 === e && i && n.setState({
m3u8_warning: !0
}),
1 === e && (n.setState({
show_switch: !1,
showTuijian: !0
}),
i = "",
window.history.pushState("", "", "/"),
n.postMsg({
type: "name",
name: i
})),
0 !== e && 1 !== e && (i = e,
window.history.pushState("", "", "/?jx=" + e),
n.postMsg({
type: "name",
name: e
})),
i && (-1 !== i.indexOf(".m3u8") || -1 !== i.indexOf(".mp4"))) {
if (n.setState({
url: i,
show_tuijian: !1
}),
n.updateHtmlTitle("\u652f\u6301M3U8\u683c\u5f0f\u7684HTML\u5728\u7ebf\u64ad\u653e\u5668", ""),
window.self == window.top || window.document.referrer === n.userUrl || -1 === window.document.referrer.indexOf(".m1907.top")) {
let e = await n.getBlockedUrl();
for (const t in e)
if (-1 !== i.indexOf(e[t]))
return void (window.location.href = "/ruhua.jpeg");
is.show(t().createElement(Ks, {
src: i
})),
n.checkSafeUrl(i)
}
return 0
}
if (i && (-1 !== i.indexOf("\u8272\u60c5") || -1 !== i.indexOf("\u5f3a\u5978")))
return void (window.location.href = "/ruhua.jpeg");
let r = new Date
, o = r.getTime()
, s = 6e4 * r.getTimezoneOffset()
, a = new Date(o + s + 36e5 * 8)
, l = a;
l = l.getDate() + 9 + 9 ^ 10,
l = Ys()(String(l)),
l = l.substring(0, 10),
l = Ys()(l);
let c = a.getDay() + 11397;
const u = "//m1-a1.cloud.nnpp.vip:2223/";
let d = "".concat(u, "api/v/?z=").concat(l, "&jx=").concat(i);
d += "&s1ig=".concat(c);
const h = ne.getAll();
h && (d += "&g=".concat(h.join(","))),
i || (d = "".concat(u, "api/v/"));
const p = async () => {
d = "//a2.m1907.top:404/api/v/";
let e = await fetch(d, {
credentials: "include",
headers: {}
});
console.log(await e.json())
}
;
window.cc = p;
const f = R().get("sp");
f && (R().set("sp", f, {
expires: 666,
domain: ".cloud.vving.vip"
}),
localStorage.setItem("sp", f)),
R().remove("play_history");
let m = document.getElementsByClassName("l")[0];
m.classList.remove("hide");
let g, y = {};
"" === window.document.cookie && (y.csp = btoa(window.localStorage.getItem("sp"))),
g = await fetch(d, {
credentials: "include",
headers: y
}),
m.classList.add("hide");
let v = await g.json();
switch (v.type) {
case "movie":
n.setState({
url: v.data[0].source.eps[0].url,
title: v.data[0].name,
video: v.data[0],
type: "movie",
videos: v.data,
quality_name: v.data[0].source.eps[0].name,
show_tuijian: !1,
show_switch: n.state.show_eps,
show_captcha: !1,
ads: v.y,
vip: n.spStatus(v),
showVipNotice: !0,
ep: 1,
poster: v.p
}),
n.updateHtmlTitle(v.data[0].name, v.data[0].source.eps[0].name);
break;
case "tv":
let t, i = Number(v.ep);
if (1 === i) {
const e = G()[v.data[0].name];
e && (i = e.ep)
}
let r = v.data[0].source.eps.length;
r >= i ? t = v.data[0].source.eps[i - 1].url : (t = v.data[0].source.eps[r - 1].url,
i = r),
n.setState({
url: t,
title: v.data[0].name,
video: v.data[0],
type: "tv",
ep: i,
videos: v.data,
quality_name: "\u7b2c" + i + "\u96c6",
show_tuijian: !1,
show_switch: n.state.show_eps,
show_captcha: !1,
ads: v.y,
vip: n.spStatus(v),
showVipNotice: !0,
poster: v.p
}),
n.updateHtmlTitle(v.data[0].name, "\u7b2c" + i + "\u96c6");
break;
case "search":
break;
case "home":
n.setState({
show_tuijian: !0,
new_videos: v.new,
hot_videos: v.hot,
show_captcha: !1,
ads: v.y
}),
0 !== e && "" !== e && 1 !== e && alert("\u6ca1\u6709\u641c\u5230");
break;
case 4e3:
n.setState({
show_captcha: !0
})
}
} catch (r) {
window.confirm("\u7cfb\u7edf\u6b63\u5728\u5347\u7ea7\uff0c\u8bf7\u60a8\u7a0d\u7b492-3\u79d2\u62161\u5206\u949f\u540e\u518d\u5237\u65b0\u9875\u9762\uff01\n\u6216\u5c1d\u8bd5\u66f4\u6362\u6d4f\u89c8\u5668\u6216\u8bbe\u5907\u8bbf\u95ee\uff01\n\u82e5\u65e0\u6cd5\u89e3\u51b3\u53ef\u8054\u7cfbQQ 3366 129 856 \n\n2-22: \u6e56\u5317\u5730\u533a\u65e0\u6cd5\u4f7f\u7528\u9700\u7b49\u5f85\u8fd0\u8425\u5546\u4fee\u590d\uff0c\u4f1a\u4fee\u6539dns\u7684\u53ef\u4ee5\u628adns\u6539\u6210114\u5373\u53ef\u4f7f\u7528\n\n\u662f\u5426\u5c1d\u8bd5\u91cd\u65b0\u8fde\u63a5\uff1f") && (window.location.href = "/"),
console.log(r)
}
}成品JS
function v(e, t, n) {
// return t ? n ? y(t, e) : f(y(t, e)) : n ? g(e) : f(g(e))
return f(g(e));
}
function f(e) {
var t, n, i = "0123456789abcdef", r = "";
for (n = 0; n < e.length; n += 1)
t = e.charCodeAt(n),
r += i.charAt(t >>> 4 & 15) + i.charAt(15 & t);
return r
}
function g(e) {
return function (e) {
return h(d(p(e), 8 * e.length))
}(m(e))
}
function h(e) {
var t, n = "", i = 32 * e.length;
for (t = 0; t < i; t += 8)
n += String.fromCharCode(e[t >> 5] >>> t % 32 & 255);
return n
}
function d(e, t) {
var n, i, r, s, d;
e[t >> 5] |= 128 << t % 32,
e[14 + (t + 64 >>> 9 << 4)] = t;
var h = 1732584193
, p = -271733879
, f = -1732584194
, m = 271733878;
for (n = 0; n < e.length; n += 16)
i = h,
r = p,
s = f,
d = m,
h = a(h, p, f, m, e[n], 7, -680876936),
m = a(m, h, p, f, e[n + 1], 12, -389564586),
f = a(f, m, h, p, e[n + 2], 17, 606105819),
p = a(p, f, m, h, e[n + 3], 22, -1044525330),
h = a(h, p, f, m, e[n + 4], 7, -176418897),
m = a(m, h, p, f, e[n + 5], 12, 1200080426),
f = a(f, m, h, p, e[n + 6], 17, -1473231341),
p = a(p, f, m, h, e[n + 7], 22, -45705983),
h = a(h, p, f, m, e[n + 8], 7, 1770035416),
m = a(m, h, p, f, e[n + 9], 12, -1958414417),
f = a(f, m, h, p, e[n + 10], 17, -42063),
p = a(p, f, m, h, e[n + 11], 22, -1990404162),
h = a(h, p, f, m, e[n + 12], 7, 1804603682),
m = a(m, h, p, f, e[n + 13], 12, -40341101),
f = a(f, m, h, p, e[n + 14], 17, -1502002290),
h = l(h, p = a(p, f, m, h, e[n + 15], 22, 1236535329), f, m, e[n + 1], 5, -165796510),
m = l(m, h, p, f, e[n + 6], 9, -1069501632),
f = l(f, m, h, p, e[n + 11], 14, 643717713),
p = l(p, f, m, h, e[n], 20, -373897302),
h = l(h, p, f, m, e[n + 5], 5, -701558691),
m = l(m, h, p, f, e[n + 10], 9, 38016083),
f = l(f, m, h, p, e[n + 15], 14, -660478335),
p = l(p, f, m, h, e[n + 4], 20, -405537848),
h = l(h, p, f, m, e[n + 9], 5, 568446438),
m = l(m, h, p, f, e[n + 14], 9, -1019803690),
f = l(f, m, h, p, e[n + 3], 14, -187363961),
p = l(p, f, m, h, e[n + 8], 20, 1163531501),
h = l(h, p, f, m, e[n + 13], 5, -1444681467),
m = l(m, h, p, f, e[n + 2], 9, -51403784),
f = l(f, m, h, p, e[n + 7], 14, 1735328473),
h = c(h, p = l(p, f, m, h, e[n + 12], 20, -1926607734), f, m, e[n + 5], 4, -378558),
m = c(m, h, p, f, e[n + 8], 11, -2022574463),
f = c(f, m, h, p, e[n + 11], 16, 1839030562),
p = c(p, f, m, h, e[n + 14], 23, -35309556),
h = c(h, p, f, m, e[n + 1], 4, -1530992060),
m = c(m, h, p, f, e[n + 4], 11, 1272893353),
f = c(f, m, h, p, e[n + 7], 16, -155497632),
p = c(p, f, m, h, e[n + 10], 23, -1094730640),
h = c(h, p, f, m, e[n + 13], 4, 681279174),
m = c(m, h, p, f, e[n], 11, -358537222),
f = c(f, m, h, p, e[n + 3], 16, -722521979),
p = c(p, f, m, h, e[n + 6], 23, 76029189),
h = c(h, p, f, m, e[n + 9], 4, -640364487),
m = c(m, h, p, f, e[n + 12], 11, -421815835),
f = c(f, m, h, p, e[n + 15], 16, 530742520),
h = u(h, p = c(p, f, m, h, e[n + 2], 23, -995338651), f, m, e[n], 6, -198630844),
m = u(m, h, p, f, e[n + 7], 10, 1126891415),
f = u(f, m, h, p, e[n + 14], 15, -1416354905),
p = u(p, f, m, h, e[n + 5], 21, -57434055),
h = u(h, p, f, m, e[n + 12], 6, 1700485571),
m = u(m, h, p, f, e[n + 3], 10, -1894986606),
f = u(f, m, h, p, e[n + 10], 15, -1051523),
p = u(p, f, m, h, e[n + 1], 21, -2054922799),
h = u(h, p, f, m, e[n + 8], 6, 1873313359),
m = u(m, h, p, f, e[n + 15], 10, -30611744),
f = u(f, m, h, p, e[n + 6], 15, -1560198380),
p = u(p, f, m, h, e[n + 13], 21, 1309151649),
h = u(h, p, f, m, e[n + 4], 6, -145523070),
m = u(m, h, p, f, e[n + 11], 10, -1120210379),
f = u(f, m, h, p, e[n + 2], 15, 718787259),
p = u(p, f, m, h, e[n + 9], 21, -343485551),
h = o(h, i),
p = o(p, r),
f = o(f, s),
m = o(m, d);
return [h, p, f, m]
}
function p(e) {
var t, n = [];
for (n[(e.length >> 2) - 1] = void 0,
t = 0; t < n.length; t += 1)
n[t] = 0;
var i = 8 * e.length;
for (t = 0; t < i; t += 8)
n[t >> 5] |= (255 & e.charCodeAt(t / 8)) << t % 32;
return n
}
function a(e, t, n, i, r, o, a) {
return s(t & n | ~t & i, e, t, r, o, a)
}
function l(e, t, n, i, r, o, a) {
return s(t & i | n & ~i, e, t, r, o, a)
}
function c(e, t, n, i, r, o, a) {
return s(t ^ n ^ i, e, t, r, o, a)
}
function u(e, t, n, i, r, o, a) {
return s(n ^ (t | ~i), e, t, r, o, a)
}
function o(e, t) {
var n = (65535 & e) + (65535 & t);
return (e >> 16) + (t >> 16) + (n >> 16) << 16 | 65535 & n
}
function m(e) {
return unescape(encodeURIComponent(e))
}
function s(e, t, n, i, r, s) {
return o((a = o(o(t, e), o(i, s))) << (l = r) | a >>> 32 - l, n);
var a, l
}
function getMovieInfo(url) {
let r1 = v("18", undefined, undefined);
r1 = v(r1);
// let i = "https://v.qq.com/x/cover/mzc00200bhufknm/u41006z9xf3.html";
i=url;
let r = new Date, oTime = r.getTime()
, sD = 6e4 * r.getTimezoneOffset()
, aD = new Date(oTime + sD + 36e5 * 8)
, lD = aD;
lD = lD.getDate() + 9 + 9 ^ 10,
lD = v(String(lD)),
lD = lD.substring(0, 10),
lD = v(lD);
let cd = aD.getDay() + 11397;
const ud = "//m1-a1.cloud.nnpp.vip:2223/";
let dD = "".concat(ud, "api/v/?z=").concat(lD, "&jx=").concat(i);
dD += "&s1ig=".concat(cd);
const hd = ['vip.kua', 'vod6.bd', 'cos.m3u', 'hn.bfvv', 'play.xl'];
hd && (dD += "&g=".concat(hd.join(","))),
i || (dD = "".concat(ud, "api/v/"));
console.log("https:" + dD);
}
getMovieInfo("https://v.qq.com/x/cover/mzc00200bhufknm/u41006z9xf3.html");
// https://v.qq.com/x/cover/mzc002008g3h7y3/u41001tyoyk.html
getMovieInfo("https://v.qq.com/x/cover/mzc002008g3h7y3/u41001tyoyk.html");