某财经报逆向记录

目录

逆向地址—js逆向

抓包分析

参数分析

Js代码分析

Python代码

Js代码复原

小结


逆向地址—js逆向

抓包分析

在这里看到需要的结果,那么在看他需要什么加密参数

可以看到初步估计是sign的参数加密,那么打开 浏览器控制台,可以看到有输出,那么点进去看看是什么。

 可以在这里到,他输出的位置正好是sign的加密位置

好了,接着回去看请求,分析加密。

 在这里可以接着看到他在请求头中多了nonce,authtoken,tenant,timestamp这四个参数不是平常见到的

Js代码分析

现在进行参数来源分析:

v = a.a.getState().version,
                        y = a.a.getState().siteSource,
                        b = u.a.getSecretParam(t.sid, v),
                        w = Object.keys(t).filter(function(e) {
                            return "sid" != e && l.indexOf(e) < 0
                        }).map(function(e) {
                            return t[e]
                        }).join(""),

 _ = u.a.sha1(b.srcKey + "" + (p && t.uid ? t.uid : "") + w + b.deviceID + (!p && t.uid ? t.uid : "") + y + (s ? m : "")),

这里进行简单的复原,

 经过重复的测试,发现v的值和y的值是固定的,而b的则是每次都变化,定位js函数的位置

 可以看到这是调用类似于MD5加密时间戳生成的,现在该w的值了,注意,这里连着进行3次加密,应该是发了不同的包,而经过测试发现在最后一次发包才是获取到数据的包。

所以在调试js的时候可以需要注意第三次的时候w与y这些值,现在还剩下m的值。

可以看到m在上面通过调用这个函数传入t.id和“siteToken”获取到的

 

追进去可以看到他是在获取getItem获取的,但是我在nodejs中调试的时候一直报错说没有getItem方法,终究是我的js基础不好啊,只能封装一个这个类了。有get那么肯定有set,往上滑了一下就看到了,那直接把这个拿下来就行,但是他竟然是带参数的那么只能把cookie清楚掉然后下断点看看了。

 可以看到直接就能断到

 顺着堆栈可以看到原来是发包后获取到的authtoken,可以看到这里是post请求并且也有sign这种加密参数,那么接着看r的来源。

 直接点大function进去可以看到是属于i变量下的某些方法,那么直接把i变量拿下来,那么至此也就拿下来全部的加密流程了,下面进行复原。

Python代码

import execjs
import requests

host = "https://h5.newaircloud.com"
headers = {
    'Host': 'h5.newaircloud.com',
    'version': '1.0',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
    'Content-Type': 'application/json;charset=UTF-8',
    'Accept': 'application/json, text/plain, */*',
    'Referer': 'https://h5.newaircloud.com/newsepaper/10257_134620_1596417_zgcjb.html',
    'Accept-Language': 'zh-CN,zh;q=0.9'
}


def getJsCode(e, r="", t=""):
    ctx = execjs.compile(open("demo.js", "r").read())
    if e != "getJsCode":
        res = ctx.call(e, r, t)
    else:
        res = ctx.call(e)
    return res


def getauthoken():
    res = getJsCode("getToken")
    url = host + "/api/getAppToken"
    head = res['headers']
    headers['nonce'] = head['nonce']
    headers['tenant'] = head['tenant']
    headers['timestamp'] = head['timestamp']
    data = '{"sid": "zgcjb",' \
           f' "deviceID":"{res["params"]["deviceID"]}","source": 2, "sign":"{res["params"]["sign"]}" ' \
           '}'
    response = requests.post(url=url, headers=headers, data=data, verify=False)
    m = response.json()['authtoken']
    return m


def get(res, url, params):
    head = res['headers']
    headers['nonce'] = head['nonce']
    headers['tenant'] = head['tenant']
    headers['timestamp'] = head['timestamp']
    headers['authtoken'] = head['authtoken']
    response = requests.get(url=url, headers=headers, params=params, verify=False)
    print(response.text)
    return response.json()


def getresult(m,date):
    t = {
        "sid": "zgcjb",
        "cid": 10257,
        "date": "2023-08-16",
        "version": 1
    }
    res = getJsCode("main", m, t)
    params = {
        "deviceID": res['deviceID'],
        "source": res['source'],
        "sign": res['sign'],
        "sid": res['t']['sid'],
        "cid": res['t']['cid'],
        "date": res['t']['date'],
        "version": res['t']['version']
    }
    url = f" {host}/api/getLayoutsDy?"
    result = get(res=res, url=url, params=params)
    layouts = result['layouts']


def main():
    m = getauthoken()
    getresult(m)


if __name__ == "__main__":
    main()

Js代码复原

class Dictionary {
    constructor() {
        this.data = {};
    }

    setItem(key, value) {
        this.data[key] = value;
    }

    removeItem(key, value) {
        delete this.data[key];
    }

    getItem(key) {
        return this.data[key];
    }

    getAllItems() {
        return this.data;
    }
}

var localStorage = new Dictionary();


var i = {
    formatReadCound: function () {
        var e = 0
            , t = this;
        return [].concat(Array.prototype.slice.call(arguments)).forEach(function (n) {
            t.checkNumber(n) && (e += n)
        }),
        e > 9999 && (e = (e / 1e4).toFixed(1) + "\u4e07"),
            e
    },
    checkNumber: function (e) {
        return !!/^[+-]?\d+(\.\d+)?$|^$|^(\d+|\-){7,}$/.test(e)
    },
    urlComplementing: function (e) {
        return e && e.indexOf("http") < 0 ? "http://" + e : e.indexOf("http") >= 0 ? e : ""
    },
    getSid: function (e) {
        var t = "";
        if (e.location.query.sid)
            t = e.location.query.sid;
        else {
            var n = e.location.pathname;
            if (n.indexOf("home") >= 0 || n.indexOf("detailArticle") >= 0 || n.indexOf("detailImage") >= 0 || n.indexOf("detailSpecial") >= 0 || n.indexOf("detailLive") >= 0 || n.indexOf("detail") >= 0 || n.indexOf("newsepaper") >= 0 || n.indexOf("politicsDetail") >= 0 || n.indexOf("noPremission") >= 0 || n.indexOf("politicsCreate") >= 0) {
                var i = e.location.query.newsId || e.location.query.specialId || e.location.query.pageId || e.location.query.newsid
                    , o = e.location.pathname.split("/");
                o[o.length - 1];
                "html" == o[o.length - 1].split(".")[1] && (o = o[o.length - 1].split(".")[0],
                    i = o);
                var a = i.split("_");
                t = a[a.length - 1]
            } else if (n.indexOf("column_view") >= 0) {
                var s = e.location.query.newsid;
                t = s.split("_")[1]
            } else
                t = ""
        }
        return new Promise(function (e, n) {
                var i = window.location.hostname
                    , o = {};
                t && (o.sid = t),
                    o.hostname = i,
                    r.a.getZhSid(o).then(function (t) {
                        t.data.success ? "1" == t.data.isShowNewPCWeb ? (r.a.setWebUrl(t.data.webUrl),
                            r.a.setWebInfo(t.data),
                            e(t.data.sid)) : n("\u79df\u6237\u6ca1\u6709\u7eed\u7ea6") : n("\u79df\u6237\u4e0d\u5b58\u5728")
                    })
            }
        )
    },
    getSidFromUrl: function (e) {
        var t = "";
        if (e.location.query.sid)
            t = e.location.query.sid;
        else {
            var n = e.location.pathname;
            if (n.indexOf("detailArticle") >= 0 || n.indexOf("detailImage") >= 0 || n.indexOf("detailSpecial") >= 0 || n.indexOf("detailLive") >= 0) {
                var r = e.location.query.newsId || e.location.query.specialId || e.location.query.pageId
                    , i = r.split("_");
                t = i[i.length - 1]
            } else
                t = ""
        }
        return t
    },
    getParameter: function (e) {
        var t = window.location.search
            , n = e.length
            , r = t.indexOf(e);
        if (-1 == r)
            return "";
        r += n + 1;
        var i = t.indexOf("&", r);
        return -1 == i ? t.substring(r) : t.substring(r, i)
    },
    getHashParameters: function () {
        var e = (window.location.href || "").replace(/^\#/, "").split("&")
            , t = {};
        if (e.length > 0 && e[0].indexOf("?") >= 0) {
            e[0] = e[0].split("?")[1];
            for (var n = 0; n < e.length; n++) {
                var r = e[n].split("=");
                2 == r.length && (t[r[0]] = r[1])
            }
        }
        return t
    },
    hasClass: function (e, t) {
        return e.className.match(new RegExp("(\\s|^)" + t + "(\\s|$)"))
    },
    addClass: function (e, t) {
        this.hasClass(e, t) || (e.className += " " + t)
    },
    removeClass: function (e, t) {
        if (this.hasClass(e, t)) {
            var n = new RegExp("(\\s|^)" + t + "(\\s|$)");
            e.className = e.className.replace(n, "")
        }
    },
    isDOMContains: function (e, t, n) {
        if (e == t)
            return !0;
        if (!t || !t.nodeType || 1 != t.nodeType)
            return !1;
        if (e.contains)
            return e.contains(t);
        if (e.compareDocumentPosition)
            return !!(16 & e.compareDocumentPosition(t));
        for (var r = t.parentNode; r && r != n;) {
            if (r == e)
                return !0;
            r = r.parentNode
        }
        return !1
    },
    localstorageCatch: function (e, t) {
        var n = localStorage.getItem("localCatch");
        n ? (n = JSON.parse(n),
            n.defaultInfo.date = Date.now(),
            n.defaultInfo.maxSize = 1048576) : n = {
            defaultInfo: {
                date: Date.now(),
                size: 0,
                maxSize: 1048576
            }
        };
        var r = function () {
            n[e] = {
                date: Date.now(),
                value: t
            };
            var r = o(JSON.stringify(n[e]));
            if (n.defaultInfo.maxSize < r + n.defaultInfo.size) {
                var i = Object.keys(n);
                for (i = i.sort(function (e, t) {
                    var r = n[e];
                    return n[t].date - r.date
                }); r + n.defaultInfo.size > n.defaultInfo.maxSize;) {
                    var a = i[i.length - 1];
                    n.defaultInfo.size -= o(JSON.stringify(n[a])),
                        delete n[a]
                }
            }
            n.defaultInfo.size += r,
                localStorage.setItem("localCatch", JSON.stringify(n))
        }
            , i = function () {
            var t;
            try {
                t = n[e].value
            } catch (e) {
                t = null
            }
            return t
        }
            , o = function (e, t) {
            var n, r, i, o = 0;
            if ("utf-16" === (t = t ? t.toLowerCase() : "") || "utf16" === t)
                for (r = 0,
                         i = e.length; r < i; r++)
                    n = e.charCodeAt(r),
                        o += n <= 65535 ? 2 : 4;
            else
                for (r = 0,
                         i = e.length; r < i; r++)
                    n = e.charCodeAt(r),
                        o += n <= 127 ? 1 : n <= 2047 ? 2 : n <= 65535 ? 3 : 4;
            return o
        };
        return {
            set: r,
            get: i
        }
    },
    timeLocalStorage: {
        age: 2592e6,
        setAge: function (e) {
            return this.age = e,
                this
        },
        set: function (e, t) {
            localStorage.removeItem(e);
            var n = t instanceof Object
                , r = (new Date).getTime()
                , i = this.age;
            if (!n) {
                var o = t;
                t = {},
                    t._value = o
            }
            return t._time = r,
                t._age = r + i,
                t._isObject = n,
                localStorage.setItem(e, JSON.stringify(t)),
                this
        },
        isExpire: function (e) {
            var t = !0
                , n = localStorage.getItem(e)
                , r = (new Date).getTime();
            return n && (n = JSON.parse(n),
                t = r > n._age),
                t
        },
        get: function (e) {
            var t = this.isExpire(e)
                , n = null;
            return t || (n = localStorage.getItem(e),
                n = JSON.parse(n),
            n._isObject || (n = n._value)),
                n
        }
    },
    randomWord: function (e, t, n) {
        var r = ""
            , i = t
            , o = ""
            ,
            a = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
        e && (i = Math.round(Math.random() * (n - t)) + t);
        for (var s = 0; s < i; s++)
            o = Math.round(Math.random() * (a.length - 1)),
                r += a[o];
        return r
    },
    dateFormat: function (e, t, n) {
        Date.prototype.Format = function (e, t) {
            var n = {
                "M+": (t ? this.getUTCMonth() : this.getMonth()) + 1,
                "d+": t ? this.getUTCDate() : this.getDate(),
                "h+": t ? this.getUTCHours() : this.getHours(),
                "m+": t ? this.getUTCMinutes() : this.getMinutes(),
                "s+": t ? this.getUTCSeconds() : this.getSeconds(),
                "q+": Math.floor(((t ? this.getUTCMonth() : this.getMonth()) + 3) / 3),
                S: t ? this.getUTCMilliseconds() : this.getMilliseconds()
            };
            /(y+)/.test(e) && (e = e.replace(RegExp.$1, ((t ? this.getUTCFullYear() : this.getFullYear()) + "").substr(4 - RegExp.$1.length)));
            for (var r in n)
                new RegExp("(" + r + ")").test(e) && (e = e.replace(RegExp.$1, 1 == RegExp.$1.length ? n[r] : ("00" + n[r]).substr(("" + n[r]).length)));
            return e
        }
        ;
        try {
            return e.Format(t, n)
        } catch (e) {
            return console.log(e.stack),
                null
        }
    },
    getNetworkType: function () {
        var e = navigator.userAgent
            , t = e.match(/NetType\/\w+/) ? e.match(/NetType\/\w+/)[0] : "NetType/other";
        t = t.toLowerCase().replace("nettype/", "");
        var n;
        switch (t) {
            case "wifi":
                n = "wifi";
                break;
            case "4g":
                n = "4g";
                break;
            case "3g":
            case "3gnet":
                n = "3g";
                break;
            case "2g":
                n = "2g";
                break;
            default:
                n = "other"
        }
        return n
    },
    imgFormat: function (e) {
        return {
            sm: "?x-oss-process=image/resize,m_lfit,w_160,limit_0/auto-orient,1",
            sm11: "?x-oss-process=image/resize,m_fill,w_160,h_160,limit_0/auto-orient,1",
            sm43: "?x-oss-process=image/resize,m_fill,w_240,h_180,limit_0/auto-orient,1",
            sm169: "?x-oss-process=image/resize,m_fill,w_240,h_135,limit_0/auto-orient,1",
            md: "?x-oss-process=image/resize,m_lfit,w_480,limit_0/auto-orient,1",
            md11: "?x-oss-process=image/resize,m_fill,w_480,h_480,limit_0/auto-orient,1",
            md169: "?x-oss-process=image/resize,m_fill,w_480,h_270,limit_0/auto-orient,1",
            md31: "?x-oss-process=image/resize,m_fill,w_480,h_160,limit_0/auto-orient,1",
            md32: "?x-oss-process=image/resize,m_fill,w_480,h_320,limit_0/auto-orient,1",
            md43: "?x-oss-process=image/resize,m_fill,w_480,h_360,limit_0/auto-orient,1",
            md41: "?x-oss-process=image/resize,m_fill,w_480,h_120,limit_0/auto-orient,1",
            md34: "?x-oss-process=image/resize,m_fill,w_150,h_200,limit_0/auto-orient,1/quality,q_100",
            lg: "?x-oss-process=image/resize,m_lfit,w_720,limit_0/auto-orient,1",
            lg169: "?x-oss-process=image/resize,m_fill,w_720,h_405,limit_0/auto-orient,1",
            lg43: "?x-oss-process=image/resize,m_fill,w_720,h_540,limit_0/auto-orient,1",
            lg31: "?x-oss-process=image/resize,m_fill,w_720,h_240,limit_0/auto-orient,1",
            lg32: "?x-oss-process=image/resize,m_fill,w_720,h_480,limit_0/auto-orient,1",
            lg11: "?x-oss-process=image/resize,m_fill,w_720,h_720,limit_0/auto-orient,1",
            webp: "?x-oss-process=image/auto-orient,1/quality,q_50/format,webp",
            q50: "?x-oss-process=image/auto-orient,1/quality,q_50"
        }[e]
    },
    isSupportWebp: function () {
        try {
            return 0 === document.createElement("canvas").toDataURL("image/webp", .5).indexOf("data:image/webp")
        } catch (e) {
            return !1
        }
    },
    myBrowser: function () {
        var e = navigator.userAgent;
        if (e.indexOf("Edge") > -1)
            return "Edge";
        if (e.indexOf("compatible") > -1 && e.indexOf("MSIE") > -1 && !t)
            return "IE";
        var t = e.indexOf("Opera") > -1;
        return t ? "Opera" : e.indexOf("Firefox") > -1 ? "FF" : e.indexOf("Chrome") > -1 ? "Chrome" : e.indexOf("Safari") > -1 ? "Safari" : void 0
    },
    md5: function (e) {
        function t(e, t) {
            return e << t | e >>> 32 - t
        }

        function n(e, t) {
            var n, r, i, o, a;
            return i = 2147483648 & e,
                o = 2147483648 & t,
                n = 1073741824 & e,
                r = 1073741824 & t,
                a = (1073741823 & e) + (1073741823 & t),
                n & r ? 2147483648 ^ a ^ i ^ o : n | r ? 1073741824 & a ? 3221225472 ^ a ^ i ^ o : 1073741824 ^ a ^ i ^ o : a ^ i ^ o
        }

        function r(e, t, n) {
            return e & t | ~e & n
        }

        function i(e, t, n) {
            return e & n | t & ~n
        }

        function o(e, t, n) {
            return e ^ t ^ n
        }

        function a(e, t, n) {
            return t ^ (e | ~n)
        }

        function s(e, i, o, a, s, c, u) {
            return e = n(e, n(n(r(i, o, a), s), u)),
                n(t(e, c), i)
        }

        function c(e, r, o, a, s, c, u) {
            return e = n(e, n(n(i(r, o, a), s), u)),
                n(t(e, c), r)
        }

        function u(e, r, i, a, s, c, u) {
            return e = n(e, n(n(o(r, i, a), s), u)),
                n(t(e, c), r)
        }

        function l(e, r, i, o, s, c, u) {
            return e = n(e, n(n(a(r, i, o), s), u)),
                n(t(e, c), r)
        }

        function f(e) {
            var t, n, r = "", i = "";
            for (n = 0; n <= 3; n++)
                t = e >>> 8 * n & 255,
                    i = "0" + t.toString(16),
                    r += i.substr(i.length - 2, 2);
            return r
        }

        var p, d, h, m, g, v, y, b, w, _ = Array();
        for (e = function (e) {
            e = e.replace(/\r\n/g, "\n");
            for (var t = "", n = 0; n < e.length; n++) {
                var r = e.charCodeAt(n);
                r < 128 ? t += String.fromCharCode(r) : r > 127 && r < 2048 ? (t += String.fromCharCode(r >> 6 | 192),
                    t += String.fromCharCode(63 & r | 128)) : (t += String.fromCharCode(r >> 12 | 224),
                    t += String.fromCharCode(r >> 6 & 63 | 128),
                    t += String.fromCharCode(63 & r | 128))
            }
            return t
        }(e),
                 _ = function (e) {
                     for (var t, n = e.length, r = n + 8, i = (r - r % 64) / 64, o = 16 * (i + 1), a = Array(o - 1), s = 0, c = 0; c < n;)
                         t = (c - c % 4) / 4,
                             s = c % 4 * 8,
                             a[t] = a[t] | e.charCodeAt(c) << s,
                             c++;
                     return t = (c - c % 4) / 4,
                         s = c % 4 * 8,
                         a[t] = a[t] | 128 << s,
                         a[o - 2] = n << 3,
                         a[o - 1] = n >>> 29,
                         a
                 }(e),
                 v = 1732584193,
                 y = 4023233417,
                 b = 2562383102,
                 w = 271733878,
                 p = 0; p < _.length; p += 16)
            d = v,
                h = y,
                m = b,
                g = w,
                v = s(v, y, b, w, _[p + 0], 7, 3614090360),
                w = s(w, v, y, b, _[p + 1], 12, 3905402710),
                b = s(b, w, v, y, _[p + 2], 17, 606105819),
                y = s(y, b, w, v, _[p + 3], 22, 3250441966),
                v = s(v, y, b, w, _[p + 4], 7, 4118548399),
                w = s(w, v, y, b, _[p + 5], 12, 1200080426),
                b = s(b, w, v, y, _[p + 6], 17, 2821735955),
                y = s(y, b, w, v, _[p + 7], 22, 4249261313),
                v = s(v, y, b, w, _[p + 8], 7, 1770035416),
                w = s(w, v, y, b, _[p + 9], 12, 2336552879),
                b = s(b, w, v, y, _[p + 10], 17, 4294925233),
                y = s(y, b, w, v, _[p + 11], 22, 2304563134),
                v = s(v, y, b, w, _[p + 12], 7, 1804603682),
                w = s(w, v, y, b, _[p + 13], 12, 4254626195),
                b = s(b, w, v, y, _[p + 14], 17, 2792965006),
                y = s(y, b, w, v, _[p + 15], 22, 1236535329),
                v = c(v, y, b, w, _[p + 1], 5, 4129170786),
                w = c(w, v, y, b, _[p + 6], 9, 3225465664),
                b = c(b, w, v, y, _[p + 11], 14, 643717713),
                y = c(y, b, w, v, _[p + 0], 20, 3921069994),
                v = c(v, y, b, w, _[p + 5], 5, 3593408605),
                w = c(w, v, y, b, _[p + 10], 9, 38016083),
                b = c(b, w, v, y, _[p + 15], 14, 3634488961),
                y = c(y, b, w, v, _[p + 4], 20, 3889429448),
                v = c(v, y, b, w, _[p + 9], 5, 568446438),
                w = c(w, v, y, b, _[p + 14], 9, 3275163606),
                b = c(b, w, v, y, _[p + 3], 14, 4107603335),
                y = c(y, b, w, v, _[p + 8], 20, 1163531501),
                v = c(v, y, b, w, _[p + 13], 5, 2850285829),
                w = c(w, v, y, b, _[p + 2], 9, 4243563512),
                b = c(b, w, v, y, _[p + 7], 14, 1735328473),
                y = c(y, b, w, v, _[p + 12], 20, 2368359562),
                v = u(v, y, b, w, _[p + 5], 4, 4294588738),
                w = u(w, v, y, b, _[p + 8], 11, 2272392833),
                b = u(b, w, v, y, _[p + 11], 16, 1839030562),
                y = u(y, b, w, v, _[p + 14], 23, 4259657740),
                v = u(v, y, b, w, _[p + 1], 4, 2763975236),
                w = u(w, v, y, b, _[p + 4], 11, 1272893353),
                b = u(b, w, v, y, _[p + 7], 16, 4139469664),
                y = u(y, b, w, v, _[p + 10], 23, 3200236656),
                v = u(v, y, b, w, _[p + 13], 4, 681279174),
                w = u(w, v, y, b, _[p + 0], 11, 3936430074),
                b = u(b, w, v, y, _[p + 3], 16, 3572445317),
                y = u(y, b, w, v, _[p + 6], 23, 76029189),
                v = u(v, y, b, w, _[p + 9], 4, 3654602809),
                w = u(w, v, y, b, _[p + 12], 11, 3873151461),
                b = u(b, w, v, y, _[p + 15], 16, 530742520),
                y = u(y, b, w, v, _[p + 2], 23, 3299628645),
                v = l(v, y, b, w, _[p + 0], 6, 4096336452),
                w = l(w, v, y, b, _[p + 7], 10, 1126891415),
                b = l(b, w, v, y, _[p + 14], 15, 2878612391),
                y = l(y, b, w, v, _[p + 5], 21, 4237533241),
                v = l(v, y, b, w, _[p + 12], 6, 1700485571),
                w = l(w, v, y, b, _[p + 3], 10, 2399980690),
                b = l(b, w, v, y, _[p + 10], 15, 4293915773),
                y = l(y, b, w, v, _[p + 1], 21, 2240044497),
                v = l(v, y, b, w, _[p + 8], 6, 1873313359),
                w = l(w, v, y, b, _[p + 15], 10, 4264355552),
                b = l(b, w, v, y, _[p + 6], 15, 2734768916),
                y = l(y, b, w, v, _[p + 13], 21, 1309151649),
                v = l(v, y, b, w, _[p + 4], 6, 4149444226),
                w = l(w, v, y, b, _[p + 11], 10, 3174756917),
                b = l(b, w, v, y, _[p + 2], 15, 718787259),
                y = l(y, b, w, v, _[p + 9], 21, 3951481745),
                v = n(v, d),
                y = n(y, h),
                b = n(b, m),
                w = n(w, g);
        return (f(v) + f(y) + f(b) + f(w)).toLowerCase()
    },
    encodeUTF8: function (e) {
        var t, n, r, i = [];
        for (t = 0; t < e.length; t++)
            (n = e.charCodeAt(t)) < 128 ? i.push(n) : n < 2048 ? i.push(192 + (n >> 6 & 31), 128 + (63 & n)) : ((r = 55296 ^ n) >> 10 == 0 ? (n = (r << 10) + (56320 ^ e.charCodeAt(++t)) + 65536,
                i.push(240 + (n >> 18 & 7), 128 + (n >> 12 & 63))) : i.push(224 + (n >> 12 & 15)),
                i.push(128 + (n >> 6 & 63), 128 + (63 & n)));
        return i
    },
    sha1: function (e) {
        var t, n, r, o = new Uint8Array(i.encodeUTF8(e)), a = 16 + (o.length + 8 >>> 6 << 4),
            e = new Uint8Array(a << 2);
        for (e.set(new Uint8Array(o.buffer)),
                 e = new Uint32Array(e.buffer),
                 r = new DataView(e.buffer),
                 t = 0; t < a; t++)
            e[t] = r.getUint32(t << 2);
        e[o.length >> 2] |= 128 << 24 - 8 * (3 & o.length),
            e[a - 1] = o.length << 3;
        var s = []
            , c = [function () {
            return f[1] & f[2] | ~f[1] & f[3]
        }
            , function () {
                return f[1] ^ f[2] ^ f[3]
            }
            , function () {
                return f[1] & f[2] | f[1] & f[3] | f[2] & f[3]
            }
            , function () {
                return f[1] ^ f[2] ^ f[3]
            }
        ]
            , u = function (e, t) {
            return e << t | e >>> 32 - t
        }
            , l = [1518500249, 1859775393, -1894007588, -899497514]
            , f = [1732584193, -271733879, null, null, -1009589776];
        for (f[2] = ~f[0],
                 f[3] = ~f[1],
                 t = 0; t < e.length; t += 16) {
            var p = f.slice(0);
            for (n = 0; n < 80; n++)
                s[n] = n < 16 ? e[t + n] : u(s[n - 3] ^ s[n - 8] ^ s[n - 14] ^ s[n - 16], 1),
                    r = u(f[0], 5) + c[n / 20 | 0]() + f[4] + s[n] + l[n / 20 | 0] | 0,
                    f[1] = u(f[1], 30),
                    f.pop(),
                    f.unshift(r);
            for (n = 0; n < 5; n++)
                f[n] = f[n] + p[n] | 0
        }
        r = new DataView(new Uint32Array(f).buffer);
        for (var t = 0; t < 5; t++)
            f[t] = r.getUint32(t << 2);
        return Array.prototype.map.call(new Uint8Array(new Uint32Array(f).buffer), function (e) {
            return (e < 16 ? "0" : "") + e.toString(16)
        }).join("")
    },
    getSecretParam: function (e, t) {
        var n = i.md5(i.md5(e))
            , r = i.randomWord(!1, 36)
            , o = i.dateFormat(new Date, "yyyy-MM-ddThh:mm:ssZ", !0)
            , a = localStorage.getItem("deviceID");
        return a || (a = i.md5((new Date).getTime() + "deviceID"),
            localStorage.setItem("deviceID", a)),
            {
                tenant: n,
                nonce: r,
                timestamp: o,
                srcKey: n + r + o + t,
                deviceID: a
            }
    },
    parseArticleHtml: function (e) {
        try {
            var t = ["width", "height", "font-family", "text-indent", "padding-right", "padding-bottom", "padding-left", "padding-top", "text-transform", "font-size", "FONT-SIZE", "text-align", "margin", "padding", "line-height", "font", "font-weight", "font-family"]
                , n = "";
            e.replace(/<[^>]*>/gi, function (n, r) {
                var i = n;
                if (0 == n.indexOf("<img") && (i = i.replace(/[^&]width=/gi, " custom=")),
                    /<h[1-6]/gi.test(n))
                    i = i.replace(/font-size|font-family|line-height/gi, "custom");
                else
                    for (var o = 0; o < t.length; o++) {
                        var a = i.toLowerCase();
                        if (a.indexOf(t[o]) >= 0)
                            if ("width" === t[o] || "height" === t[o]) {
                                var s = new RegExp("[^&]" + t[o], "gi");
                                i = i.replace(s, " custom")
                            } else {
                                var s = new RegExp(t[o], "gi");
                                i = i.replace(s, "custom")
                            }
                    }
                i != n && (e = e.replace(n, i))
            });
            for (var r = e.split("<p"), i = 0; i < r.length; i++)
                r[i] = r[i].replace(/>[\u3000]+/g, ">"),
                    r[i] = r[i].replace(/>[ ]+/g, ">"),
                    r[i] = r[i].replace(/>[\u3000]+/g, ">"),
                    r[i] = r[i].replace(/>(&nbsp;)+/g, ">"),
                    r[i] = r[i].replace(/>(\u3000| |(&nbsp;))+/g, ">"),
                    0 == i ? n = r[i] : n += "<p class='my_p_style'" + r[i];
            var o = /(u003C)[^(u003E)]+()/g;
            n = n.replace(o, ""),
                n = n.replace(/u003E/g, "")
        } catch (e) {
            console.log(e)
        }
        return n
    }
};
var e = "zgcjb"
var v = "1.0"

function getToken() {
    var t =v
        ,n = 2
        , r = i.getSecretParam(e, t)
        , z = i.sha1(r.srcKey + r.deviceID + "" + n);
    return {
        params: {
            sid: e,
            deviceID: r.deviceID,
            source: n,
            sign: z
        },
        headers: {
            tenant: r.tenant,
            nonce: r.nonce,
            timestamp: r.timestamp,
            version: t
        }
    }
}

function main(m, t) {
    var l = [
        "date",
        "version"
    ]
    var b = i.getSecretParam(e, v);
    console.log(b);
    var w = Object.keys(t).filter(function (e) {
        return "sid" != e && l.indexOf(e) < 0
    }).map(function (e) {
        return t[e]
    }).join("");
    var y = 2;
    var a = i.sha1(b.srcKey + "" + w + b.deviceID + y + m);
    return {
        deviceID: b.deviceID,
        source: y,
        sign: a,
        t: t,
        l: l,
        headers: {
            tenant: b.tenant,
            authtoken: m,
            nonce: b.nonce,
            timestamp: b.timestamp,
        },
    }
}

小结

一开始看到webpack就发憷了,所以找了几天webpack如何调用某个函数,但是知道后面无意间看到崔老的案例,也是webpack是直接扣js的方法,这才想起来js逆向原本是扣js而不是调用js文件,所以已有一定要长个记性,不要上来就发憷不知道怎么办。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
某flutter-app逆向分析是指对于一个使用flutter框架开发的应用进行逆向工程分析。逆向工程是通过分析应用的代码、二进制文件等来了解其内部实现细节。 首先,我们需要获取该应用的安装包文件(APK或IPA文件),然后进行解包操作,将其转换为可读取的文件目录结构。 接下来,我们可以使用一些工具来提取应用的资源文件、代码文件等。对于flutter-app来说,可以提取出dart文件,这是flutter的主要代码文件,其中包含了应用的逻辑实现。 通过阅读dart文件,我们可以了解应用的代码结构、数据模型、界面设计等。可以分析应用的逻辑实现方法,包括各种函数、类、方法的调用关系。 同时,还可以通过分析相关配置文件、资源文件等来了解应用的各种设置、资源加载方式等。 在逆向过程中,还可以使用一些调试工具来进一步了解应用的运行机制。例如,hook工具可以拦截应用的函数调用,并捕获输入输出数据,用于进一步分析。 逆向分析的目的可以有很多,比如了解应用的工作原理、发现潜在的漏洞或安全问题、提供参考用于自己的开发等。 需要注意的是,逆向分析需要遵守法律规定。未经授权的逆向分析可能侵犯他人的知识产权,涉及到隐私等方面的问题。因此,在进行逆向分析之前,应该了解并遵守当地相关法律法规,避免产生法律纠纷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~贝母~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值