头条 _signature 解析 步步调试超级详细傻瓜式教程 2023版
首先看下运行结果,该篇教程全程傻瓜式操作,一步一步跟着做就可以了
1 定位_signature参数
搜索_signature
可以看到_signature是n,n是上面的函数u(p.getUri(e), e) 生成
点击u(p.getUri(e), e) 的u方法跳到如下代码
发现一个sign方法
可以看到我们进入了acrawler.js文件分两块分别是解释器和需要执行的代码
将代码复制出来
我们在回到前面一个函数可以看到这里call了n 并且传入参数o
我们可以看到o是一个url地址
我们新建一个代码段头条将之前的acrawler.js 复制过来,放开之前的debug, 不放开无法调试的 随后进行window.byted_acrawler.sign(o)可以看到他能正常输出,说明在浏览器环境中调用没有问题
2 补充环境
我们将代码复制到node环境中运行
在node环境中运行报错了是在S[R] = S[R][A]处
我们回到浏览器添加一个条件断点A === 'referrer'
刷新页面后会在A === "referrer"时候断住
我们可以看到S[R]对应document
我们在控制台看到document.referrer为' '
我们在代码中补充环境重新运行
可以看到之前的错误不见了 变了一个新的错误
补上window以后他又报错
上述错误是因为环境错误
我们需要把"undefined" != typeof exports 改为 "undefined" == typeof exports
改完以后又开始报错环境没有
我们根据之前的调试方法把location以及navigator环境补充下就可以了
运行后得到正确的加密值
如果加上document.cookie可以发现加密值变长了,实际情况不加cookie获取的加密值也能使用
3 破解的js以及py文件
??部分自行修改下
sig.js
// 1 补充环境
// 2 "undefined" != typeof exports 改为 "undefined" == typeof exportsdocument = {}
document.referrer = ''
window = globallocation = {href: 'https://www.??.com/',protocol: 'https:'
}navigator = {userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36'
}var glb;
(glb = "undefined" == typeof window ? global : window)._$jsvmprt = function(b, e, f) {function a() {if ("undefined" == typeof Reflect || !Reflect.construct)return !1;if (Reflect.construct.sham)return !1;if ("function" == typeof Proxy)return !0;try {return Date.prototype.toString.call(Reflect.construct(Date, [], (function() {}))),!0} catch (b) {return !1}}function d(b, e, f) {return (d = a() ? Reflect.construct : function(b, e, f) {var a = [null];a.push.apply(a, e);var d = new (Function.bind.apply(b, a));return f && c(d, f.prototype),d}).apply(null, arguments)}function c(b, e) {return (c = Object.setPrototypeOf || function(b, e) {return b.__proto__ = e,b})(b, e)}function n(b) {return function(b) {if (Array.isArray(b)) {for (var e = 0, f = new Array(b.length); e < b.length; e++)f[e] = b[e];return f}}(b) || function(b) {if (Symbol.iterator in Object(b) || "[object Arguments]" === Object.prototype.toString.call(b))return Array.from(b)}(b) || function() {throw new TypeError("Invalid attempt to spread non-iterable instance")}()}for (var i = [], r = 0, t = [], o = 0, l = function(b, e) {var f = b[e++], a = b[e], d = parseInt("" + f + a, 16);if (d >> 7 == 0)return [1, d];if (d >> 6 == 2) {var c = parseInt("" + b[++e] + b[++e], 16);return d &= 63,[2, c = (d <<= 8) + c]}if (d >> 6 == 3) {var n = parseInt("" + b[++e] + b[++e], 16), i = parseInt("" + b[++e] + b[++e], 16);return d &= 63,[3, i = (d <<= 16) + (n <<= 8) + i]}}, u = function(b, e) {var f = parseInt("" + b[e] + b[e + 1], 16);return f = f > 127 ? -256 + f : f}, s = function(b, e) {var f = parseInt("" + b[e] + b[e + 1] + b[e + 2] + b[e + 3], 16);return f = f > 32767 ? -65536 + f : f}, p = function(b, e) {var f = parseInt("" + b[e] + b[e + 1] + b[e + 2] + b[e + 3] + b[e + 4] + b[e + 5] + b[e + 6] + b[e + 7], 16);return f = f > 2147483647 ? 0 + f : f}, y = function(b, e) {return parseInt("" + b[e] + b[e + 1], 16)}, v = function(b, e) {return parseInt("" + b[e] + b[e + 1] + b[e + 2] + b[e + 3], 16)}, g = g || this || window, h = Object.keys || function(b) {var e = {}, f = 0;for (var a in b)e[f++] = a;return e.length = f,e}, m = (b.length,0), I = "", C = m; C < m + 16; C++) {var q = "" + b[C++] + b[C];q = parseInt(q, 16),I += String.fromCharCode(q)}if ("HNOJ@?RC" != I)throw new Error("error magic number " + I);m += 16;parseInt("" + b[m] + b[m + 1], 16);m += 8,r = 0;for (var w = 0; w < 4; w++) {var S = m + 2 * w, R = "" + b[S++] + b[S], x = parseInt(R, 16);r += (3 & x) << 2 * w}m += 16,m += 8;var z = parseInt("" + b[m] + b[m + 1] + b[m + 2] + b[m + 3] + b[m + 4] + b[m + 5] + b[m + 6] + b[m + 7], 16), O = z, E = m += 8, j = v(b, m += z);j[1];m += 4,i = {p: [],q: []};for (var A = 0; A < j; A++) {for (var D = l(b, m), T = m += 2 * D[0], $ = i.p.length, P = 0; P < D[1]; P++) {var U = l(b, T);i.p.push(U[1]),T += 2 * U[0]}m = T,i.q.push([$, i.p.length])}var _ = {5: 1,6: 1,70: 1,22: 1,23: 1,37: 1,73: 1}, k = {72: 1}, M = {74: 1}, H = {11: 1,12: 1,24: 1,26: 1,27: 1,31: 1}, J = {10: 1}, N = {2: 1,29: 1,30: 1,20: 1}, B = [], W = [];function F(b, e, f) {for (var a = e; a < e + f; ) {var d = y(b, a);B[a] = d,a += 2;k[d] ? (W[a] = u(b, a),a += 2) : _[d] ? (W[a] = s(b, a),a += 4) : M[d] ? (W[a] = p(b, a),a += 8) : H[d] ? (W[a] = y(b, a),a += 2) : J[d] ? (W[a] = v(b, a),a += 4) : N[d] && (W[a] = v(b, a),a += 4)}}return K(b, E, O / 2, [], e, f);function G(b, e, f, a, c, l, m, I) {null == l && (l = this);var C, q, w, S = [], R = 0;m && (C = m);var x, z, O = e, E = O + 2 * f;if (!I)for (; O < E; ) {var j = parseInt("" + b[O] + b[O + 1], 16);O += 2;var A = 3 & (x = 13 * j % 241);if (x >>= 2,A < 1) {A = 3 & x;if (x >>= 2,A > 2)(A = x) > 10 ? S[++R] = void 0 : A > 1 ? (C = S[R--],S[R] = S[R] >= C) : A > -1 && (S[++R] = null);else if (A > 1) {if ((A = x) > 11)throw S[R--];if (A > 7) {for (C = S[R--],z = v(b, O),A = "",P = i.q[z][0]; P < i.q[z][1]; P++)A += String.fromCharCode(r ^ i.p[P]);O += 4,S[R--][A] = C} elseA > 5 && (S[R] = h(S[R]))} else if (A > 0) {(A = x) > 8 ? (C = S[R--],S[R] = typeof C) : A > 6 ? S[R] = --S[R] : A > 4 ? S[R -= 1] = S[R][S[R + 1]] : A > 2 && (q = S[R--],(A = S[R]).x === G ? A.y >= 1 ? S[R] = K(b, A.c, A.l, [q], A.z, w, null, 1) : (S[R] = K(b, A.c, A.l, [q], A.z, w, null, 0),A.y++) : S[R] = A(q))} else {if ((A = x) > 14)z = s(b, O),(U = function e() {var f = arguments;return e.y > 0 ? K(b, e.c, e.l, f, e.z, this, null, 0) : (e.y++,K(b, e.c, e.l, f, e.z, this, null, 0))}).c = O + 4,U.l = z - 2,U.x = G,U.y = 0,U.z = c,S[R] = U,O += 2 * z - 2;else if (A > 12)q = S[R--],w = S[R--],(A = S[R--]).x === G ? A.y >= 1 ? S[++R] = K(b, A.c, A.l, q, A.z, w, null, 1) : (S[++R] = K(b, A.c, A.l, q, A.z, w, null, 0),A.y++) : S[++R] = A.apply(w, q);else if (A > 5)C = S[R--],S[R] = S[R] != C;else if (A > 3)C = S[R--],S[R] = S[R] * C;else if (A > -1)return [1, S[R--]]}} else if (A < 2) {A = 3 & x;if (x >>= 2,A < 1) {if ((A = x) > 9);else if (A > 7)C = S[R--],S[R] = S[R] & C;else if (A > 5)z = y(b, O),O += 2,S[R -= z] = 0 === z ? new S[R] : d(S[R], n(S.slice(R + 1, R + z + 1)));else if (A > 3) {z = s(b, O);try {if (t[o][2] = 1,1 == (C = G(b, O + 4, z - 3, [], c, l, null, 0))[0])return C} catch (m) {if (t[o] && t[o][1] && 1 == (C = G(b, t[o][1][0], t[o][1][1], [], c, l, m, 0))[0])return C} finally {if (t[o] && t[o][0] && 1 == (C = G(b, t[o][0][0], t[o][0][1], [], c, l, null, 0))[0])return C;t[o] = 0,o--}O += 2 * z - 2}} else if (A < 2) {if ((A = x) > 12)S[++R] = u(b, O),O += 2;else if (A > 10)C = S[R--],S[R] = S[R] << C;else if (A > 8) {for (z = v(b, O),A = "",P = i.q[z][0]; P < i.q[z][1]; P++)A += String.fromCharCode(r ^ i.p[P]);O += 4,S[R] = S[R][A]} elseA > 6 && (q = S[R--],C = delete S[R--][q])} else if (A < 3) {(A = x) < 2 ? S[++R] = C : A < 4 ? (C = S[R--],S[R] = S[R] <= C) : A < 11 ? (C = S[R -= 2][S[R + 1]] = S[R + 2],R--) : A < 13 && (C = S[R],S[++R] = C)} else {if ((A = x) > 12)S[++R] = l;else if (A > 5)C = S[R--],S[R] = S[R] !== C;else if (A > 3)C = S[R--],S[R] = S[R] / C;else if (A > 1) {if ((z = s(b, O)) < 0) {I = 1,F(b, e, 2 * f),O += 2 * z - 2;break}O += 2 * z - 2} elseA > -1 && (S[R] = !S[R])}} else if (A < 3) {A = 3 & x;if (x >>= 2,A > 2)(A = x) > 7 ? (C = S[R--],S[R] = S[R] | C) : A > 5 ? (z = y(b, O),O += 2,S[++R] = c["$" + z]) : A > 3 && (z = s(b, O),t[o][0] && !t[o][2] ? t[o][1] = [O + 4, z - 3] : t[o++] = [0, [O + 4, z - 3], 0],O += 2 * z - 2);else if (A > 1) {if ((A = x) < 2) {for (z = v(b, O),C = "",P = i.q[z][0]; P < i.q[z][1]; P++)C += String.fromCharCode(r ^ i.p[P]);S[++R] = C,O += 4} else if (A < 4)if (S[R--])O += 4;else {if ((z = s(b, O)) < 0) {I = 1,F(b, e, 2 * f),O += 2 *