js逆向精华

在咸鱼学python的公众号看到的,自己去试了试,记录总结一下学习过程
网站:

aHR0cHMlM0EvL3d3dy5xaW1pbmdwaWFuLmNuL2Zpbm9zZGEvcHJvamVjdC9waW52ZXN0bWVudA==

打开网站后是这样的:

我们要爬的就是红框里的内容
之前说过,数据一般返回的方式有两种:

  • 直接落地页链就返回相关数据
  • ajax返回json数据。

f12打开控制台
切换到network选项卡
重新加载一下页面

明显落地页没有返回数据
往下看,资源链(png,css,js等)一般直接跳过,发现有一个连接会返回json数据。

里面有加密的数据,而且有66.5kb,很大的几率这串东西解密之后就是我们要的数据。
这个参数是encrypt_data
一般我都会全局搜索一下

点进去

可以点左下角{}格式化一下代码,然后在当前文件搜索encrypt_data

发现有6处出现
看了一下,发现这里最有嫌疑。

打个断点,刷新一下页面,停在debugger处

控制台执行 Object(u.a)(e.encrypt_data)输出一下结果
得到的数据好像不是我们想要的
继续下一步debugger,再次停在了这里,说明这里又调用了一次,我们再次控制台执行 Object(u.a)(e.encrypt_data)输出一下结果

这次发现了我们想要的结果
所以可以肯定的是,解密的方法在Object(u.a)(e.encrypt_data)里面

这个是全局搜索的方法,也可以打xhr断点,然后再一步一步调试到这里。
然后一步一步执行,找到加密的方法

然后就是扣代码了
可以在source选项卡里面的snippets新建一个js文件,把我们扣出来的代码放进去,测试一下,缺啥补啥,最终可以在控制台输出解密后的数据。

扣出来的代码如下

function s(t, e, i, n, a, s) {
    var o, r, c, l, u, d, h, p, f, v, m, g, b, y, C = new Array(16843776,0,65536,16843780,16842756,66564,4,65536,1024,16843776,16843780,1024,16778244,16842756,16777216,4,1028,16778240,16778240,66560,66560,16842752,16842752,16778244,65540,16777220,16777220,65540,0,1028,66564,16777216,65536,16843780,4,16842752,16843776,16777216,16777216,1024,16842756,65536,66560,16777220,1024,4,16778244,66564,16843780,65540,16842752,16778244,16777220,1028,66564,16843776,1028,16778240,16778240,0,65540,66560,0,16842756), _ = new Array(-2146402272,-2147450880,32768,1081376,1048576,32,-2146435040,-2147450848,-2147483616,-2146402272,-2146402304,-2147483648,-2147450880,1048576,32,-2146435040,1081344,1048608,-2147450848,0,-2147483648,32768,1081376,-2146435072,1048608,-2147483616,0,1081344,32800,-2146402304,-2146435072,32800,0,1081376,-2146435040,1048576,-2147450848,-2146435072,-2146402304,32768,-2146435072,-2147450880,32,-2146402272,1081376,32,32768,-2147483648,32800,-2146402304,1048576,-2147483616,1048608,-2147450848,-2147483616,1048608,1081344,0,-2147450880,32800,-2147483648,-2146435040,-2146402272,1081344), w = new Array(520,134349312,0,134348808,134218240,0,131592,134218240,131080,134217736,134217736,131072,134349320,131080,134348800,520,134217728,8,134349312,512,131584,134348800,134348808,131592,134218248,131584,131072,134218248,8,134349320,512,134217728,134349312,134217728,131080,520,131072,134349312,134218240,0,512,131080,134349320,134218240,134217736,512,0,134348808,134218248,131072,134217728,134349320,8,131592,131584,134217736,134348800,134218248,520,134348800,131592,8,134348808,131584), x = new Array(8396801,8321,8321,128,8396928,8388737,8388609,8193,0,8396800,8396800,8396929,129,0,8388736,8388609,1,8192,8388608,8396801,128,8388608,8193,8320,8388737,1,8320,8388736,8192,8396928,8396929,129,8388736,8388609,8396800,8396929,129,0,0,8396800,8320,8388736,8388737,1,8396801,8321,8321,128,8396929,129,1,8192,8388609,8193,8396928,8388737,8193,8320,8388608,8396801,128,8388608,8192,8396928), k = new Array(256,34078976,34078720,1107296512,524288,256,1073741824,34078720,1074266368,524288,33554688,1074266368,1107296512,1107820544,524544,1073741824,33554432,1074266112,1074266112,0,1073742080,1107820800,1107820800,33554688,1107820544,1073742080,0,1107296256,34078976,33554432,1107296256,524544,524288,1107296512,256,33554432,1073741824,34078720,1107296512,1074266368,33554688,1073741824,1107820544,34078976,1074266368,256,33554432,1107820544,1107820800,524544,1107296256,1107820800,34078720,0,1074266112,1107296256,524544,33554688,1073742080,524288,0,1074266112,34078976,1073742080), A = new Array(536870928,541065216,16384,541081616,541065216,16,541081616,4194304,536887296,4210704,4194304,536870928,4194320,536887296,536870912,16400,0,4194320,536887312,16384,4210688,536887312,16,541065232,541065232,0,4210704,541081600,16400,4210688,541081600,536870912,536887296,16,541065232,4210688,541081616,4194304,16400,536870928,4194304,536887296,536870912,16400,536870928,541081616,4210688,541065216,4210704,541081600,0,541065232,16,16384,541065216,4210704,16384,4194320,536887312,0,541081600,536870912,4194320,536887312), T = new Array(2097152,69206018,67110914,0,2048,67110914,2099202,69208064,69208066,2097152,0,67108866,2,67108864,69206018,2050,67110912,2099202,2097154,67110912,67108866,69206016,69208064,2097154,69206016,2048,2050,69208066,2099200,2,67108864,2099200,67108864,2099200,2097152,67110914,67110914,69206018,69206018,2,2097154,67108864,67110912,2097152,69208064,2050,2099202,69208064,2050,67108866,69208066,69206016,2099200,0,2,69208066,0,2099202,69206016,2048,67108866,67110912,2048,2097154), L = new Array(268439616,4096,262144,268701760,268435456,268439616,64,268435456,262208,268697600,268701760,266240,268701696,266304,4096,64,268697600,268435520,268439552,4160,266240,262208,268697664,268701696,4160,0,0,268697664,268435520,268439552,266304,262144,266304,262144,268701696,4096,64,268697664,4096,266304,268439552,64,268435520,268697600,268697664,268435456,262144,268439616,0,268701760,262208,268435520,268697600,268439552,268439616,0,268701760,266240,266240,4160,4160,262208,268435456,268701696), S = function(t) {
        for (var e, i, n, a = new Array(0,4,536870912,536870916,65536,65540,536936448,536936452,512,516,536871424,536871428,66048,66052,536936960,536936964), s = new Array(0,1,1048576,1048577,67108864,67108865,68157440,68157441,256,257,1048832,1048833,67109120,67109121,68157696,68157697), o = new Array(0,8,2048,2056,16777216,16777224,16779264,16779272,0,8,2048,2056,16777216,16777224,16779264,16779272), r = new Array(0,2097152,134217728,136314880,8192,2105344,134225920,136323072,131072,2228224,134348800,136445952,139264,2236416,134356992,136454144), c = new Array(0,262144,16,262160,0,262144,16,262160,4096,266240,4112,266256,4096,266240,4112,266256), l = new Array(0,1024,32,1056,0,1024,32,1056,33554432,33555456,33554464,33555488,33554432,33555456,33554464,33555488), u = new Array(0,268435456,524288,268959744,2,268435458,524290,268959746,0,268435456,524288,268959744,2,268435458,524290,268959746), d = new Array(0,65536,2048,67584,536870912,536936448,536872960,536938496,131072,196608,133120,198656,537001984,537067520,537004032,537069568), h = new Array(0,262144,0,262144,2,262146,2,262146,33554432,33816576,33554432,33816576,33554434,33816578,33554434,33816578), p = new Array(0,268435456,8,268435464,0,268435456,8,268435464,1024,268436480,1032,268436488,1024,268436480,1032,268436488), f = new Array(0,32,0,32,1048576,1048608,1048576,1048608,8192,8224,8192,8224,1056768,1056800,1056768,1056800), v = new Array(0,16777216,512,16777728,2097152,18874368,2097664,18874880,67108864,83886080,67109376,83886592,69206016,85983232,69206528,85983744), m = new Array(0,4096,134217728,134221824,524288,528384,134742016,134746112,16,4112,134217744,134221840,524304,528400,134742032,134746128), g = new Array(0,4,256,260,0,4,256,260,1,5,257,261,1,5,257,261), b = t.length > 8 ? 3 : 1, y = new Array(32 * b), C = new Array(0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0), _ = 0, w = 0, x = 0; x < b; x++) {
            var k = t.charCodeAt(_++) << 24 | t.charCodeAt(_++) << 16 | t.charCodeAt(_++) << 8 | t.charCodeAt(_++)
              , A = t.charCodeAt(_++) << 24 | t.charCodeAt(_++) << 16 | t.charCodeAt(_++) << 8 | t.charCodeAt(_++);
            k ^= (n = 252645135 & (k >>> 4 ^ A)) << 4,
            k ^= n = 65535 & ((A ^= n) >>> -16 ^ k),
            k ^= (n = 858993459 & (k >>> 2 ^ (A ^= n << -16))) << 2,
            k ^= n = 65535 & ((A ^= n) >>> -16 ^ k),
            k ^= (n = 1431655765 & (k >>> 1 ^ (A ^= n << -16))) << 1,
            k ^= n = 16711935 & ((A ^= n) >>> 8 ^ k),
            n = (k ^= (n = 1431655765 & (k >>> 1 ^ (A ^= n << 8))) << 1) << 8 | (A ^= n) >>> 20 & 240,
            k = A << 24 | A << 8 & 16711680 | A >>> 8 & 65280 | A >>> 24 & 240,
            A = n;
            for (var T = 0; T < C.length; T++)
                C[T] ? (k = k << 2 | k >>> 26,
                A = A << 2 | A >>> 26) : (k = k << 1 | k >>> 27,
                A = A << 1 | A >>> 27),
                A &= -15,
                e = a[(k &= -15) >>> 28] | s[k >>> 24 & 15] | o[k >>> 20 & 15] | r[k >>> 16 & 15] | c[k >>> 12 & 15] | l[k >>> 8 & 15] | u[k >>> 4 & 15],
                i = d[A >>> 28] | h[A >>> 24 & 15] | p[A >>> 20 & 15] | f[A >>> 16 & 15] | v[A >>> 12 & 15] | m[A >>> 8 & 15] | g[A >>> 4 & 15],
                n = 65535 & (i >>> 16 ^ e),
                y[w++] = e ^ n,
                y[w++] = i ^ n << 16
        }
        return y
    }(t), I = 0, j = e.length, z = 0, B = 32 == S.length ? 3 : 9;
    p = 3 == B ? i ? new Array(0,32,2) : new Array(30,-2,-2) : i ? new Array(0,32,2,62,30,-2,64,96,2) : new Array(94,62,-2,32,64,2,30,-2,-2),
    2 == s ? e += "        " : 1 == s ? i && (c = 8 - j % 8,
    e += String.fromCharCode(c, c, c, c, c, c, c, c),
    8 === c && (j += 8)) : s || (e += "\0\0\0\0\0\0\0\0");
    var F = ""
      , E = "";
    for (1 == n && (f = a.charCodeAt(I++) << 24 | a.charCodeAt(I++) << 16 | a.charCodeAt(I++) << 8 | a.charCodeAt(I++),
    m = a.charCodeAt(I++) << 24 | a.charCodeAt(I++) << 16 | a.charCodeAt(I++) << 8 | a.charCodeAt(I++),
    I = 0); I < j; ) {
        for (d = e.charCodeAt(I++) << 24 | e.charCodeAt(I++) << 16 | e.charCodeAt(I++) << 8 | e.charCodeAt(I++),
        h = e.charCodeAt(I++) << 24 | e.charCodeAt(I++) << 16 | e.charCodeAt(I++) << 8 | e.charCodeAt(I++),
        1 == n && (i ? (d ^= f,
        h ^= m) : (v = f,
        g = m,
        f = d,
        m = h)),
        d ^= (c = 252645135 & (d >>> 4 ^ h)) << 4,
        d ^= (c = 65535 & (d >>> 16 ^ (h ^= c))) << 16,
        d ^= c = 858993459 & ((h ^= c) >>> 2 ^ d),
        d ^= c = 16711935 & ((h ^= c << 2) >>> 8 ^ d),
        d = (d ^= (c = 1431655765 & (d >>> 1 ^ (h ^= c << 8))) << 1) << 1 | d >>> 31,
        h = (h ^= c) << 1 | h >>> 31,
        r = 0; r < B; r += 3) {
            for (b = p[r + 1],
            y = p[r + 2],
            o = p[r]; o != b; o += y)
                l = h ^ S[o],
                u = (h >>> 4 | h << 28) ^ S[o + 1],
                c = d,
                d = h,
                h = c ^ (_[l >>> 24 & 63] | x[l >>> 16 & 63] | A[l >>> 8 & 63] | L[63 & l] | C[u >>> 24 & 63] | w[u >>> 16 & 63] | k[u >>> 8 & 63] | T[63 & u]);
            c = d,
            d = h,
            h = c
        }
        h = h >>> 1 | h << 31,
        h ^= c = 1431655765 & ((d = d >>> 1 | d << 31) >>> 1 ^ h),
        h ^= (c = 16711935 & (h >>> 8 ^ (d ^= c << 1))) << 8,
        h ^= (c = 858993459 & (h >>> 2 ^ (d ^= c))) << 2,
        h ^= c = 65535 & ((d ^= c) >>> 16 ^ h),
        h ^= c = 252645135 & ((d ^= c << 16) >>> 4 ^ h),
        d ^= c << 4,
        1 == n && (i ? (f = d,
        m = h) : (d ^= v,
        h ^= g)),
        E += String.fromCharCode(d >>> 24, d >>> 16 & 255, d >>> 8 & 255, 255 & d, h >>> 24, h >>> 16 & 255, h >>> 8 & 255, 255 & h),
        512 == (z += 8) && (F += E,
        E = "",
        z = 0)
    }
    if (F = (F += E).replace(/\0*$/g, ""),
    !i) {
        if (1 === s) {
            var O = 0;
            (j = F.length) && (O = F.charCodeAt(j - 1)),
            O <= 8 && (F = F.substring(0, j - O))
        }
        F = decodeURIComponent(escape(F))
    }
    return F
}

function decode(t) {
    f = /[\t\n\f\r ]/g
    c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    var e = (t = String(t).replace(f, "")).length;
    e % 4 == 0 && (e = (t = t.replace(/==?$/, "")).length),
    (e % 4 == 1 || /[^+a-zA-Z0-9/]/.test(t)) && l("Invalid character: the string to be decoded is not correctly encoded.");
    for (var n, r, i = 0, o = "", a = -1; ++a < e; )
        r = c.indexOf(t.charAt(a)),
        n = i % 4 ? 64 * n + r : r,
        i++ % 4 && (o += String.fromCharCode(255 & n >> (-2 * i & 6)));
    return o
}

t = "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"

a = s("5e5062e82f15fe4ca9d24bc5", decode(t), 0, 0, "012345677890123", 1)
console.log(a)




// function myDecode(t){
//     a = s("5e5062e82f15fe4ca9d24bc5", decode(t), 0, 0, "012345677890123", 1)
//     return a
// }

因为要python调用,所以修改一下后面的内容。把它放在一个函数里

function myDecode(t){
    a = s("5e5062e82f15fe4ca9d24bc5", decode(t), 0, 0, "012345677890123", 1)
    return a
}

然后我们用python访问网站,并解密数据。

import execjs
import json
import requests
import time



# 执行本地的js
def getJsCode():
    f = open("main.js", 'r', encoding='UTF-8')
    line = f.readline()
    htmlstr = ''
    while line:
        htmlstr = htmlstr + line
        line = f.readline()
    return htmlstr


def headersStringtoHeaders(headersString):
    headers = '{\n'
    arrayS = headersString.split("\n")
    for array in arrayS:
        headers = headers + '\t"' + array.split(":")[0] + '": "' + array.split(":")[1].strip() + '",\n'
    headers = headers + "}"
    print(headers)

def spider():
    # 读取js文件
    js_content = getJsCode()
    # 编译js文件
    ctx = execjs.compile(js_content)
    url = 'https://vipapi.qimingpian.com/DataList/productListVip'
    header = {
        "Accept": "application/json, text/plain, */*",
        "Accept-Encoding": "gzip, deflate, br",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Cache-Control": "no-cache",
        "Connection": "keep-alive",
        "Content-Length": "69",
        "Content-Type": "application/x-www-form-urlencoded",
        "Host": "vipapi.qimingpian.com",
        "Origin": "https",
        "Pragma": "no-cache",
        "Sec-Fetch-Mode": "cors",
        "Sec-Fetch-Site": "cross-site",
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36",
    }

    postData = {
        "time_interval": None,
        "tag": None,
        "tag_type": None,
        "province": None,
        "lunci": None,
        "page": 1,
        "num": 20,
        "unionid": None,

    }

    r = requests.post(url, headers= header, data= postData)
    print(r.text)
    # 得到encrypt_data即是加密返回的数据
    t = json.loads(r.text).get("encrypt_data")

    # 调用方法得到解密数据
    decodeResult = ctx.call('myDecode',t)
    # 数据json化
    decodeResultJson = json.loads(decodeResult)
    # print(decodeResultJson)
    # 用来存储一条json数据
    dataJson = {}
    for d in decodeResultJson:
        myList = decodeResultJson["list"]
        for m in myList:
            for n in m:
                dataJson[n] = m[n]
            print(dataJson)
        dataJson = {}



spider()


运行结果

本来想批量爬取的
但未登录用户只能看一页的数据
登录的只能看两页
其他的要money
就没有继续下去了

你可能感兴趣的:(js逆向精华)