第二个js逆向项目--数据加密js解密

1,218 阅读38分钟

第二个js逆向项目--数据加密js解密

从网站中分析出来js代码执行的部分,然后我们将其提取出来,使用execjs执行js代码,实现数据的破解

第一步:熟悉需求

目标网站:www.qimingpian.cn/finosda/pro…

image-20220303095109826.png

第二步:找到异步加载的接口,分析接口数据

我们看到数据展示到了页面上,我们来找xhr请求

image-20220303095250298.png

应该就是从这两个Vip的请求中获取的数据,我们首先分析有没有加密参数,发现并没有,可以直接请求到拿到数据

image-20220303095634888.png

当我们看数据的时候,发现数据部分是一串字符串

image-20220303095417945.png

我们可以得到的结论就是,数据被加密了,前端从后端获取到数据后,通过js进行了解密,将数据提取出来放到了页面上,分析js吧

第三步:我们要找到解密js部分

3.1 搜索

image-20220303102730885.png

3.2 分析js

有个技巧就是:我们搜索到的多个匹配项,我们直觉过滤,然后我们在不能分辨的上面打上断点,刷新页面,看是否经过那个接口,经过,看看和我们的数据是不是相同的,可以快速的选择出我们要找的变量

image-20220303102844828.png

3.3 打上断点,刷新页面调试

image-20220303103343264.png

image-20220303103606468.png

配合控制台可以直接输出想要看的

3.4 步进函数,步出函数,不断尝试

image-20220303103742389.png

再次步进函数的时候我们可以看到我们想要的数据解密的部分(JSON.PARSE),而且我们能发现 t 就是我们的上面的数据

image-20220303103947141.png

确认,我们在控制台中进行测试

image-20220303104219956.png

我们确定o函数,就是我们需要的解析函数,copy出来(注意复制完全)

function o(t) {
    return JSON.parse(s("5e5062e82f15fe4ca9d24bc5", a.a.decode(t), 0, 0, "012345677890123", 1))
}

3.5 追查相关的js

原则:缺什么补充什么

我们可以新建一个js文件,将刚才的o函数放入其中,运行代码

# encrypt_data 可以从请求中获取
import execjs
with open("test.js","r",encoding="utf-8") as f:
    str1 = f.read()
ctx = execjs.compile(str1)
a = ctx.call('json_parse', encrypt_data)
for data in a["list"]:
    print(data)

我们得到下面的错误

image-20220303104806181.png

我们知道上面的s没有定义,我们需要去找s,寻找方法如下:

image-20220303105005457.png

function s(t, e, i, n, a, s) {
    var o, c, r, l, u, d, h, p, f, v, m, g, b, y, _ = 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), C = 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), T = 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), A = 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), z = 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), c = new Array(0,2097152,134217728,136314880,8192,2105344,134225920,136323072,131072,2228224,134348800,136445952,139264,2236416,134356992,136454144), r = 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), _ = new Array(0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0), C = 0, w = 0, x = 0; x < b; x++) {
            var k = t.charCodeAt(C++) << 24 | t.charCodeAt(C++) << 16 | t.charCodeAt(C++) << 8 | t.charCodeAt(C++)
            , T = t.charCodeAt(C++) << 24 | t.charCodeAt(C++) << 16 | t.charCodeAt(C++) << 8 | t.charCodeAt(C++);
            k ^= (n = 252645135 & (k >>> 4 ^ T)) << 4,
                k ^= n = 65535 & ((T ^= n) >>> -16 ^ k),
                k ^= (n = 858993459 & (k >>> 2 ^ (T ^= n << -16))) << 2,
                k ^= n = 65535 & ((T ^= n) >>> -16 ^ k),
                k ^= (n = 1431655765 & (k >>> 1 ^ (T ^= n << -16))) << 1,
                k ^= n = 16711935 & ((T ^= n) >>> 8 ^ k),
                n = (k ^= (n = 1431655765 & (k >>> 1 ^ (T ^= n << 8))) << 1) << 8 | (T ^= n) >>> 20 & 240,
                k = T << 24 | T << 8 & 16711680 | T >>> 8 & 65280 | T >>> 24 & 240,
                T = n;
            for (var A = 0; A < _.length; A++)
                _[A] ? (k = k << 2 | k >>> 26,
                        T = T << 2 | T >>> 26) : (k = k << 1 | k >>> 27,
                                                  T = T << 1 | T >>> 27),
                    T &= -15,
                    e = a[(k &= -15) >>> 28] | s[k >>> 24 & 15] | o[k >>> 20 & 15] | c[k >>> 16 & 15] | r[k >>> 12 & 15] | l[k >>> 8 & 15] | u[k >>> 4 & 15],
                    i = d[T >>> 28] | h[T >>> 24 & 15] | p[T >>> 20 & 15] | f[T >>> 16 & 15] | v[T >>> 12 & 15] | m[T >>> 8 & 15] | g[T >>> 4 & 15],
                    n = 65535 & (i >>> 16 ^ e),
                    y[w++] = e ^ n,
                    y[w++] = i ^ n << 16
        }
        return y
    }(t), S = 0, F = e.length, j = 0, I = 32 == z.length ? 3 : 9;
    p = 3 == I ? 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 && (r = 8 - F % 8,
                                                  e += String.fromCharCode(r, r, r, r, r, r, r, r),
                                                  8 === r && (F += 8)) : s || (e += "\0\0\0\0\0\0\0\0");
    var B = ""
    , O = "";
    for (1 == n && (f = a.charCodeAt(S++) << 24 | a.charCodeAt(S++) << 16 | a.charCodeAt(S++) << 8 | a.charCodeAt(S++),
                    m = a.charCodeAt(S++) << 24 | a.charCodeAt(S++) << 16 | a.charCodeAt(S++) << 8 | a.charCodeAt(S++),
                    S = 0); S < F; ) {
        for (d = e.charCodeAt(S++) << 24 | e.charCodeAt(S++) << 16 | e.charCodeAt(S++) << 8 | e.charCodeAt(S++),
             h = e.charCodeAt(S++) << 24 | e.charCodeAt(S++) << 16 | e.charCodeAt(S++) << 8 | e.charCodeAt(S++),
             1 == n && (i ? (d ^= f,
                             h ^= m) : (v = f,
                                        g = m,
                                        f = d,
                                        m = h)),
             d ^= (r = 252645135 & (d >>> 4 ^ h)) << 4,
             d ^= (r = 65535 & (d >>> 16 ^ (h ^= r))) << 16,
             d ^= r = 858993459 & ((h ^= r) >>> 2 ^ d),
             d ^= r = 16711935 & ((h ^= r << 2) >>> 8 ^ d),
             d = (d ^= (r = 1431655765 & (d >>> 1 ^ (h ^= r << 8))) << 1) << 1 | d >>> 31,
             h = (h ^= r) << 1 | h >>> 31,
             c = 0; c < I; c += 3) {
            for (b = p[c + 1],
                 y = p[c + 2],
                 o = p[c]; o != b; o += y)
                l = h ^ z[o],
                    u = (h >>> 4 | h << 28) ^ z[o + 1],
                    r = d,
                    d = h,
                    h = r ^ (C[l >>> 24 & 63] | x[l >>> 16 & 63] | T[l >>> 8 & 63] | L[63 & l] | _[u >>> 24 & 63] | w[u >>> 16 & 63] | k[u >>> 8 & 63] | A[63 & u]);
            r = d,
                d = h,
                h = r
        }
        h = h >>> 1 | h << 31,
            h ^= r = 1431655765 & ((d = d >>> 1 | d << 31) >>> 1 ^ h),
            h ^= (r = 16711935 & (h >>> 8 ^ (d ^= r << 1))) << 8,
            h ^= (r = 858993459 & (h >>> 2 ^ (d ^= r))) << 2,
            h ^= r = 65535 & ((d ^= r) >>> 16 ^ h),
            h ^= r = 252645135 & ((d ^= r << 16) >>> 4 ^ h),
            d ^= r << 4,
            1 == n && (i ? (f = d,
                            m = h) : (d ^= v,
                                      h ^= g)),
            O += String.fromCharCode(d >>> 24, d >>> 16 & 255, d >>> 8 & 255, 255 & d, h >>> 24, h >>> 16 & 255, h >>> 8 & 255, 255 & h),
            512 == (j += 8) && (B += O,
                                O = "",
                                j = 0)
    }
    if (B = (B += O).replace(/\0*$/g, ""),
        !i) {
        if (1 === s) {
            var $ = 0;
            (F = B.length) && ($ = B.charCodeAt(F - 1)),
                $ <= 8 && (B = B.substring(0, F - $))
        }
        B = decodeURIComponent(escape(B))
    }
    return B
}

注意:我们要复制完全了这个函数

解决了s的问题,我们在运行函数,可得到如下错误

image-20220303105324824.png

其实仔细分析这个问题不是a,是我们需要的是decode方法,我们重复上面的查找方法,

image-20220303105518036.png

对函数进行改写,符合js的写法即可(将o方法中的a.a.decode的方法对应修改成decode即可)

function decode(t) {
    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
}

接下来的过程和上面一样,

image-20220303105704709.png

f = /[\t\n\f\r ]/g

image-20220303105754317.png

c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

最终运行通过,找到所有js执行缺失的部分,最终文件如下:

function json_parse(t) {
    return JSON.parse(s("5e5062e82f15fe4ca9d24bc5", decode(t), 0, 0, "012345677890123", 1))
}

function s(t, e, i, n, a, s) {
    var o, c, r, l, u, d, h, p, f, v, m, g, b, y, _ = 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), C = 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), T = 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), A = 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), z = 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), c = new Array(0,2097152,134217728,136314880,8192,2105344,134225920,136323072,131072,2228224,134348800,136445952,139264,2236416,134356992,136454144), r = 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), _ = new Array(0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0), C = 0, w = 0, x = 0; x < b; x++) {
            var k = t.charCodeAt(C++) << 24 | t.charCodeAt(C++) << 16 | t.charCodeAt(C++) << 8 | t.charCodeAt(C++)
              , T = t.charCodeAt(C++) << 24 | t.charCodeAt(C++) << 16 | t.charCodeAt(C++) << 8 | t.charCodeAt(C++);
            k ^= (n = 252645135 & (k >>> 4 ^ T)) << 4,
            k ^= n = 65535 & ((T ^= n) >>> -16 ^ k),
            k ^= (n = 858993459 & (k >>> 2 ^ (T ^= n << -16))) << 2,
            k ^= n = 65535 & ((T ^= n) >>> -16 ^ k),
            k ^= (n = 1431655765 & (k >>> 1 ^ (T ^= n << -16))) << 1,
            k ^= n = 16711935 & ((T ^= n) >>> 8 ^ k),
            n = (k ^= (n = 1431655765 & (k >>> 1 ^ (T ^= n << 8))) << 1) << 8 | (T ^= n) >>> 20 & 240,
            k = T << 24 | T << 8 & 16711680 | T >>> 8 & 65280 | T >>> 24 & 240,
            T = n;
            for (var A = 0; A < _.length; A++)
                _[A] ? (k = k << 2 | k >>> 26,
                T = T << 2 | T >>> 26) : (k = k << 1 | k >>> 27,
                T = T << 1 | T >>> 27),
                T &= -15,
                e = a[(k &= -15) >>> 28] | s[k >>> 24 & 15] | o[k >>> 20 & 15] | c[k >>> 16 & 15] | r[k >>> 12 & 15] | l[k >>> 8 & 15] | u[k >>> 4 & 15],
                i = d[T >>> 28] | h[T >>> 24 & 15] | p[T >>> 20 & 15] | f[T >>> 16 & 15] | v[T >>> 12 & 15] | m[T >>> 8 & 15] | g[T >>> 4 & 15],
                n = 65535 & (i >>> 16 ^ e),
                y[w++] = e ^ n,
                y[w++] = i ^ n << 16
        }
        return y
    }(t), S = 0, F = e.length, j = 0, I = 32 == z.length ? 3 : 9;
    p = 3 == I ? 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 && (r = 8 - F % 8,
    e += String.fromCharCode(r, r, r, r, r, r, r, r),
    8 === r && (F += 8)) : s || (e += "\0\0\0\0\0\0\0\0");
    var B = ""
      , O = "";
    for (1 == n && (f = a.charCodeAt(S++) << 24 | a.charCodeAt(S++) << 16 | a.charCodeAt(S++) << 8 | a.charCodeAt(S++),
    m = a.charCodeAt(S++) << 24 | a.charCodeAt(S++) << 16 | a.charCodeAt(S++) << 8 | a.charCodeAt(S++),
    S = 0); S < F; ) {
        for (d = e.charCodeAt(S++) << 24 | e.charCodeAt(S++) << 16 | e.charCodeAt(S++) << 8 | e.charCodeAt(S++),
        h = e.charCodeAt(S++) << 24 | e.charCodeAt(S++) << 16 | e.charCodeAt(S++) << 8 | e.charCodeAt(S++),
        1 == n && (i ? (d ^= f,
        h ^= m) : (v = f,
        g = m,
        f = d,
        m = h)),
        d ^= (r = 252645135 & (d >>> 4 ^ h)) << 4,
        d ^= (r = 65535 & (d >>> 16 ^ (h ^= r))) << 16,
        d ^= r = 858993459 & ((h ^= r) >>> 2 ^ d),
        d ^= r = 16711935 & ((h ^= r << 2) >>> 8 ^ d),
        d = (d ^= (r = 1431655765 & (d >>> 1 ^ (h ^= r << 8))) << 1) << 1 | d >>> 31,
        h = (h ^= r) << 1 | h >>> 31,
        c = 0; c < I; c += 3) {
            for (b = p[c + 1],
            y = p[c + 2],
            o = p[c]; o != b; o += y)
                l = h ^ z[o],
                u = (h >>> 4 | h << 28) ^ z[o + 1],
                r = d,
                d = h,
                h = r ^ (C[l >>> 24 & 63] | x[l >>> 16 & 63] | T[l >>> 8 & 63] | L[63 & l] | _[u >>> 24 & 63] | w[u >>> 16 & 63] | k[u >>> 8 & 63] | A[63 & u]);
            r = d,
            d = h,
            h = r
        }
        h = h >>> 1 | h << 31,
        h ^= r = 1431655765 & ((d = d >>> 1 | d << 31) >>> 1 ^ h),
        h ^= (r = 16711935 & (h >>> 8 ^ (d ^= r << 1))) << 8,
        h ^= (r = 858993459 & (h >>> 2 ^ (d ^= r))) << 2,
        h ^= r = 65535 & ((d ^= r) >>> 16 ^ h),
        h ^= r = 252645135 & ((d ^= r << 16) >>> 4 ^ h),
        d ^= r << 4,
        1 == n && (i ? (f = d,
        m = h) : (d ^= v,
        h ^= g)),
        O += String.fromCharCode(d >>> 24, d >>> 16 & 255, d >>> 8 & 255, 255 & d, h >>> 24, h >>> 16 & 255, h >>> 8 & 255, 255 & h),
        512 == (j += 8) && (B += O,
        O = "",
        j = 0)
    }
    if (B = (B += O).replace(/\0*$/g, ""),
    !i) {
        if (1 === s) {
            var $ = 0;
            (F = B.length) && ($ = B.charCodeAt(F - 1)),
            $ <= 8 && (B = B.substring(0, F - $))
        }
        B = decodeURIComponent(escape(B))
    }
    return B
}
c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
f = /[\t\n\f\r ]/g

function decode(t) {
    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
}

第四步:python获取数据,结合js解密

然后我们通过执行js文件就能对我们获取到的加密数据进行解密了

import requests

headers = {
    'Connection': 'keep-alive',
    'Accept': 'application/json, text/plain, */*',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Origin': 'https://www.qimingpian.cn',
    'Sec-Fetch-Site': 'same-site',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Dest': 'empty',
    'Accept-Language': 'zh-CN,zh;q=0.9',
}

data = {
  'time_interval': '',
  'tag': '',
  'tag_type': '',
  'province': '',
  'lunci': '',
  'page': '1',
  'num': '20',
  'unionid': ''
}

response = requests.post('https://vipapi.qimingpian.cn/DataList/productListVip', headers=headers, data=data)
encrypt_data = response.json()["encrypt_data"]
print("encrypt_data数据是:{}".format(encrypt_data))

import execjs
with open("test1.js","r",encoding="utf-8") as f:
    str1 = f.read()
ctx = execjs.compile(str1)
a = ctx.call('json_parse', encrypt_data)
for data in a["list"]:
    print(data)

得到的数据如下(数据太多,只展示前两条):

{'product': '新略数智', 'icon': 'https://img1.qimingpian.cn/uploadImg/202203/621f3ead0a1c9.png', 'hangye1': '大数据', 'yewu': '全域营销数据平台', 'province': '浙江省', 'lunci': 'A轮', 'jieduan': 'A轮', 'money': '超亿人民币', 'time': '2022.03.02', 'detail': 'http://vip.qimingpian.cn/#/detailcom?src=magic&ticket=204a41d0f4c95605bc89a8c986085217&id=0e77f1ffcf62ed3f6948c73453be31b9', 'investor_info': [{'investor': '红杉中国', 'detail': 'http://vip.qimingpian.cn/#/detailorg?src=magic&ticket=4b1c54ebfbdd53d6a0af12a37b98d5d4&id=a8d12f114305bd75e39f9e3abec13c6b', 'invest_type_name': '合投', 'invest_type': '3'}, {'investor': '高瓴创投', 'detail': 'http://vip.qimingpian.cn/#/detailorg?src=magic&ticket=af2742b715695f55aa827f8ba4fa580c&id=c2946868a0d82299e956947366e25380', 'invest_type_name': '合投', 'invest_type': '3'}, {'investor': '元璟资本', 'detail': 'http://vip.qimingpian.cn/#/detailorg?src=magic&ticket=2db4490b5e725531bd83d82bfc9c852e&id=9d2da50a81a5866009b9575f7a901736', 'invest_type_name': '合投', 'invest_type': '3'}], 'heat_num': '120'}
{'product': '深擎科技', 'icon': 'https://qmp.oss-cn-beijing.aliyuncs.com/uploadImg/202001/product5e11fcbe061c9556342148.png?x-oss-process=style%2Fsmall&OSSAccessKeyId=LTAI2SRf7Sf1P5bU&Expires=1648868304&Signature=raCPtWcpVDrv%2BEgCSAlfPJCKmSo%3D', 'hangye1': '人工智能', 'yewu': '智能财经资讯运营商', 'province': '浙江省', 'lunci': 'A轮', 'jieduan': 'A轮', 'money': '亿级人民币', 'time': '2021.09.07', 'detail': 'http://vip.qimingpian.cn/#/detailcom?src=magic&ticket=a11860799ac25bb680d29ab218767461&id=abcc90c1e1d0c5af6017d2e463207f2f', 'investor_info': [{'investor': '兴富资本', 'detail': 'http://vip.qimingpian.cn/#/detailorg?src=magic&ticket=bae65ffe30015259a81f848829d065d2&id=b4dc77487538a6a9bfd9b9968494e373', 'invest_type_name': '领投', 'invest_type': '1'}, {'investor': '常州高新投', 'detail': 'http://vip.qimingpian.cn/#/detailorg?src=magic&ticket=5a95c566fa6657c6879f6f644738b7f0&id=16f7c67fc88009aa17efc24ce155e19f', 'invest_type_name': '跟投', 'invest_type': '2'}, {'investor': '镇海产业基金', 'detail': 'http://vip.qimingpian.cn/#/detailorg?src=magic&ticket=620deb3052b85c35bc9ebe465d895266&id=2916ed56ddddeec9cd0513bc2a97f844', 'invest_type_name': '跟投', 'invest_type': '2'}], 'heat_num': '114'}
......

遇到的问题

Python使用 execjs 出现 gbk报错的问题记录和解决juejin.cn/post/707048…