暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

JS 逆向|某视频榜单数据参数分析

零点小思随笔 2021-06-24
801

目标网址:

aHR0cHM6Ly94ZC5uZXdyYW5rLmNuL2RhdGEvdGlrdG9rL3Jhbmsvb3ZlcmFsbA==

首先打开 F12 ,查看加密字段

xyz: 58fb7cd2bc3a29f341bc058b20c587e4
nonce: 83afe274b

乍一看,这两个字段很特别,应该很好定位,搜索 xyz 试试看:

果然找到加密位置,打上断点并调试刚进入断点,发现所需参数已经生成,所以要按照堆栈信息往前分析,来到这个地方

然后找到打断点的地方,鼠标右键执行:Continue to here ,这个时候大概率就会从这里开始运行,如果没有成功,那就多调试几次。

到这里可以分别去看 nonce 和 xyz 是怎么生成的了。

首先来瞅瞅 nonce ,它等于 r 值,而 r 的生成代码如下, o() 传入 2 个参数,i 和 数字 9,而 i 是一个数组,都是固定值:

i = ["0""1""2""3""4""5""6""7""8""9""a""b""c""d""e""f"]

r = o()(i, 9).join("");

接下来分析 o()这个函数都干了啥!!!,F11 进入函数发现是一个随机生成长度为 9 的一个字符串函数 这个知道意图后可以用 Python 来实现

def get_random_str():
    random = Random()
    i = ["0""1""2""3""4""5""6""7""8""9""a""b""c""d""e""f"]
    results = random.sample(i, 9)
    results = ''.join(results)
    return results

接下来分析 xyz 也很简单

    var u = f()(h, 9).join("");
    return r += "&nonce=".concat(u),
    c.nonce = u,
    c.xyz = s()(r),

F11 进入函数,把实现的函数全部找出来就可以了

function i(e, t) {
    var n = (65535 & e) + (65535 & t);
    return (((e >> 16) + (t >> 16) + (n >> 16)) << 16) | (65535 & n);
  }

function u(e, t, n, r, o, u) {
return i(((a = i(i(t, e), i(r, u))) << (c = o)) | (a >>> (32 - c)), n);
var a, c;
}


function a(e, t, n, r, o, i, a) {
return u((t & n) | (~t & r), e, t, o, i, a);
}


function c(e, t, n, r, o, i, a) {
return u((t & r) | (n & ~r), e, t, o, i, a);
}


function l(e, t, n, r, o, i, a) {
return u(t ^ n ^ r, e, t, o, i, a);
}


function f(e, t, n, r, o, i, a) {
return u(n ^ (t | ~r), e, t, o, i, a);
}


function s(e, t) {
var n, r, o, u, s;
(e[t >> 5] |= 128 << t % 32), (e[14 + (((t + 64) >>> 9) << 4)] = t);
var d = 1732584193,
  p = -271733879,
  h = -1732584194,
  v = 271733878;
for (n = 0; n < e.length; n += 16)
  (r = d),
    (o = p),
    (u = h),
    (s = v),
    (d = a(d, p, h, v, e[n], 7, -680876936)),
    (v = a(v, d, p, h, e[n + 1], 12, -389564586)),
    (h = a(h, v, d, p, e[n + 2], 17, 606105819)),
    (p = a(p, h, v, d, e[n + 3], 22, -1044525330)),
    (d = a(d, p, h, v, e[n + 4], 7, -176418897)),
    (v = a(v, d, p, h, e[n + 5], 12, 1200080426)),
    (h = a(h, v, d, p, e[n + 6], 17, -1473231341)),
    (p = a(p, h, v, d, e[n + 7], 22, -45705983)),
    (d = a(d, p, h, v, e[n + 8], 7, 1770035416)),
    (v = a(v, d, p, h, e[n + 9], 12, -1958414417)),
    (h = a(h, v, d, p, e[n + 10], 17, -42063)),
    (p = a(p, h, v, d, e[n + 11], 22, -1990404162)),
    (d = a(d, p, h, v, e[n + 12], 7, 1804603682)),
    (v = a(v, d, p, h, e[n + 13], 12, -40341101)),
    (h = a(h, v, d, p, e[n + 14], 17, -1502002290)),
    (d = c(
      d,
      (p = a(p, h, v, d, e[n + 15], 22, 1236535329)),
      h,
      v,
      e[n + 1],
      5,
      -165796510
    )),
    (v = c(v, d, p, h, e[n + 6], 9, -1069501632)),
    (h = c(h, v, d, p, e[n + 11], 14, 643717713)),
    (p = c(p, h, v, d, e[n], 20, -373897302)),
    (d = c(d, p, h, v, e[n + 5], 5, -701558691)),
    (v = c(v, d, p, h, e[n + 10], 9, 38016083)),
    (h = c(h, v, d, p, e[n + 15], 14, -660478335)),
    (p = c(p, h, v, d, e[n + 4], 20, -405537848)),
    (d = c(d, p, h, v, e[n + 9], 5, 568446438)),
    (v = c(v, d, p, h, e[n + 14], 9, -1019803690)),
    (h = c(h, v, d, p, e[n + 3], 14, -187363961)),
    (p = c(p, h, v, d, e[n + 8], 20, 1163531501)),
    (d = c(d, p, h, v, e[n + 13], 5, -1444681467)),
    (v = c(v, d, p, h, e[n + 2], 9, -51403784)),
    (h = c(h, v, d, p, e[n + 7], 14, 1735328473)),
    (d = l(
      d,
      (p = c(p, h, v, d, e[n + 12], 20, -1926607734)),
      h,
      v,
      e[n + 5],
      4,
      -378558
    )),
    (v = l(v, d, p, h, e[n + 8], 11, -2022574463)),
    (h = l(h, v, d, p, e[n + 11], 16, 1839030562)),
    (p = l(p, h, v, d, e[n + 14], 23, -35309556)),
    (d = l(d, p, h, v, e[n + 1], 4, -1530992060)),
    (v = l(v, d, p, h, e[n + 4], 11, 1272893353)),
    (h = l(h, v, d, p, e[n + 7], 16, -155497632)),
    (p = l(p, h, v, d, e[n + 10], 23, -1094730640)),
    (d = l(d, p, h, v, e[n + 13], 4, 681279174)),
    (v = l(v, d, p, h, e[n], 11, -358537222)),
    (h = l(h, v, d, p, e[n + 3], 16, -722521979)),
    (p = l(p, h, v, d, e[n + 6], 23, 76029189)),
    (d = l(d, p, h, v, e[n + 9], 4, -640364487)),
    (v = l(v, d, p, h, e[n + 12], 11, -421815835)),
    (h = l(h, v, d, p, e[n + 15], 16, 530742520)),
    (d = f(
      d,
      (p = l(p, h, v, d, e[n + 2], 23, -995338651)),
      h,
      v,
      e[n],
      6,
      -198630844
    )),
    (v = f(v, d, p, h, e[n + 7], 10, 1126891415)),
    (h = f(h, v, d, p, e[n + 14], 15, -1416354905)),
    (p = f(p, h, v, d, e[n + 5], 21, -57434055)),
    (d = f(d, p, h, v, e[n + 12], 6, 1700485571)),
    (v = f(v, d, p, h, e[n + 3], 10, -1894986606)),
    (h = f(h, v, d, p, e[n + 10], 15, -1051523)),
    (p = f(p, h, v, d, e[n + 1], 21, -2054922799)),
    (d = f(d, p, h, v, e[n + 8], 6, 1873313359)),
    (v = f(v, d, p, h, e[n + 15], 10, -30611744)),
    (h = f(h, v, d, p, e[n + 6], 15, -1560198380)),
    (p = f(p, h, v, d, e[n + 13], 21, 1309151649)),
    (d = f(d, p, h, v, e[n + 4], 6, -145523070)),
    (v = f(v, d, p, h, e[n + 11], 10, -1120210379)),
    (h = f(h, v, d, p, e[n + 2], 15, 718787259)),
    (p = f(p, h, v, d, e[n + 9], 21, -343485551)),
    (d = i(d, r)),
    (p = i(p, o)),
    (h = i(h, u)),
    (v = i(v, s));
return [d, p, h, v];
}


function d(e) {
var t,
  n = '',
  r = 32 * e.length;
for (t = 0; t < r; t += 8)
  n += String.fromCharCode((e[t >> 5] >>> t % 32) & 255);
return n;
}


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 r = 8 * e.length;
for (t = 0; t < r; t += 8)
  n[t >> 5] |= (255 & e.charCodeAt(t / 8)) << t % 32;
return n;
}


function h(e) {
var t,
  n,
  r = '';
for (n = 0; n < e.length; n += 1)
  (t = e.charCodeAt(n)),
    (r +=
      '0123456789abcdef'.charAt((t >>> 4) & 15) +
      '0123456789abcdef'.charAt(15 & t));
return r;
}


function v(e) {
return unescape(encodeURIComponent(e));
}


function m(e) {
return (function (e) {
  return d(s(p(e), 8 * e.length));
})(v(e));
}


function y(e, t) {
return (function (e, t) {
  var n,
    r,
    o = p(e),
    i = [],
    u = [];
  for (
    i[15] = u[15] = void 0,
      o.length > 16 && (o = s(o, 8 * e.length)),
      n = 0;
    n < 16;
    n += 1
  )
    (i[n] = 909522486 ^ o[n]), (u[n] = 1549556828 ^ o[n]);
  return (
    (r = s(i.concat(p(t)), 512 + 8 * t.length)), d(s(u.concat(r), 640))
  );
})(v(e), v(t));
}


function g(e, t, n) {
return t ? (n ? y(t, e) : h(y(t, e))) : n ? m(e) : h(m(e));
}

g(e = "/xdnphb/nr/cloud/douyin/account/getAccountAll?AppKey=joker&nonce=397d80f12", t = undefined, n = undefined)
// b0bb4d1a3a1d4f98282e97d760c5c929    397d80f12
// c14d160a16c9725b1bc65236ce528932    /xdnphb/nr/cloud/douyin/DOU/search/type?AppKey=joker&nonce=a49231df5

至此,参数解析完毕

import execjs
import requests
from random import Random


def get_random_str():
    random = Random()
    i = ["0""1""2""3""4""5""6""7""8""9""a""b""c""d""e""f"]
    results = random.sample(i, 9)
    results = ''.join(results)
    return results


def get_xyz(keyword):
    with open('xd.js''r') as file:
        js = file.read()

    ctx = execjs.compile(js)
    result = ctx.call('g', keyword)
    return result


def get_data(xyz, nonce):
    url = 'https://xd.newrank.cn/xdnphb/nr/cloud/douyin/account/getAccountAll?xyz={0}&nonce={1}'.format(xyz, nonce)
    headers = {
        "origin""https://xd.newrank.cn",
        "referer""https://xd.newrank.cn/data/tiktok/rank/overall",
        "sec-fetch-dest""empty",
        "sec-fetch-mode""cors",
        "sec-fetch-site""same-origin",
        "user-agent""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36",
        "cookie""Hm_lvt_e20c9ff085f402c8cfc53a441378ca86=1604034491; Hm_lpvt_e20c9ff085f402c8cfc53a441378ca86=1604034491; _uab_collina=160403449124095273308375; token=4A7BF189424E49AC84C862EC34559EA3"
    }
    response = requests.post(url, headers=headers).text
    print(response)


if __name__ == '__main__':
    result_nonce = get_random_str()
    result_url = "/xdnphb/nr/cloud/douyin/account/getAccountAll?AppKey=joker"
    params = "{0}&nonce={1}".format(result_url, result_nonce)
    print(params)
    result_xyz = get_xyz(params)
    print(result_xyz)

    get_data(result_xyz, result_nonce)

测试结果:

{
 "msg":"",
 "data":[],
 "code":2000
}

网站返回结果:


文章转载自零点小思随笔,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论