webpack逆向--例子2

栗子2:

同样是    国家医疗保障

逆向请求加密的参数

这两个是要逆向的参数      signData    encData

signData:
定位加密的入口位置:

第一种方式:全局搜索 signdata

就这四个位置,打上断点,刷新页面

这里断住了,这就是加密的位置。

第二种方式:hook json.stringify方法

        请求参数加密 一般hook  json.stringify        响应结果解密一般  hook  json.parse

        hook  的时机是    在该方法声明后,调用前         

        json是内置的函数,所以可以在页面最开始的时候就能注入

找到请求接口,打开启动器页面,找到最开始的调用文件

添加断点

刷新页面,在控制台注入hook代码

放开断点,进行调试,看到载荷参数出现了,

在调用堆栈,向上回溯,加密的位置已经知道了

分析加密代码:

在这里添加断点,点击翻页就会断住,这个函数的参数  ,里面的逻辑只用到了 t.data 这个属性

在控制台输出一下 t.data,发现 其他的值其实是固定的,只有pageNum这个是翻页需要变的

        

把这个函数复制下来,也定义一个 e 对象接收这些值,作为传入参数

调用函数运行报错,m、p、v这三个函数直接扣下来

到了o.doSignature这个函数,向上找一下o,是来源于这个  r ,这种格式一般是webpack打包的

用webpack的方式解决:
1、找到加载函数

找到调用的模块,打上断点,

刷新页面,点击跳转就能找到加载函数了

把加载器复制下来,补上一个window环境,定义一个全局变量接受加载函数o,使能够在外部调用,加上一个日志输出,能方便补模块,(但是这个例子补的模块太多了,全复制算了)

找到这行,注释掉,或者直接把这里的代码都删掉,只是环境检测的作用,webpack框架就好了

这时候就可以调用模块了,把   o 改为 load("68b2").sm2  ,d是个定值,这里就解决了

到了 这个对象没定义

向上找一下e,这个 e 是作为参数传进来的,实际上也是一个调用模块

上面已经把webpack扣好了,修改一下就行了        

调用运行函数,结果出来了

encData:

定位入口位置和上面的一样

分析加密代码

打上断点,这里直接是写死了 ”SM4“,所以直接扣框住的代码就行

分析一下传入的参数,传入的参数是对象   t   ,参数 t 只用到了 t.data.data t.data.appCode

控制台输出一下

把函数复制下来,还是用之前定义的对象  e ,但是注意要改一下调用方式

把 函数 A 、y、b 复制下来,u、c是定值,运行之后,  s   e是有问题的

向上找一下s,是调用模块的,e是之前分析知道是作为参数传进来的,也是调用模块

之前已经做好了,直接调用就行

得到结果

js代码,模块太多了没写上,在网页打开复制就行

function m(e) {
    var t = {}
      , n = ["signData", "encData", "extra"];
    for (var i in e)
        e.hasOwnProperty(i) && !n.includes(i) && null != e[i] && (t[i] = e[i]);
    return t
}
function p(e) {
    var t = new Array
      , n = 0;
    for (var i in e)
        t[n] = i,
        n++;
    var r = [].concat(t).sort()
      , o = {};
    for (var a in r)
        o[r[a]] = e[r[a]];
    return o
}
function v(e) {
    var t = [];
    for (var n in e)
        if (e.hasOwnProperty(n) && (e[n] || "".concat(e[n])))
            if ("data" === n) {
                var i = Object.assign({}, e[n]);
                for (var r in i) {
                    if ("number" != typeof i[r] && "boolean" != typeof i[r] || (i[r] = "" + i[r]),
                    Array.isArray(i[r]) && !i[r].length && delete i[r],
                    Array.isArray(i[r]) && i[r].length > 0)
                        for (var o = 0; o < i[r].length; o++)
                            i[r][o] = p(i[r][o]);
                    null != i[r] && i[r] || delete i[r]
                }
                var a = p(i);
                t.push("".concat(n, "=").concat(JSON.stringify(a)))
            } else
                t.push("".concat(n, "=").concat(e[n]));
    return t.push("key=".concat("NMVFVILMKT13GEMD3BKPKCTBOQBPZR2P")),
    t.join("&")
}
window=global;
let load;
!function(e) {
    function t(t) {
        for (var n, i, o = t[0], a = t[1], s = 0, l = []; s < o.length; s++)
            i = o[s],
            Object.prototype.hasOwnProperty.call(r, i) && r[i] && l.push(r[i][0]),
            r[i] = 0;
        for (n in a)
            Object.prototype.hasOwnProperty.call(a, n) && (e[n] = a[n]);
        for (u && u(t); l.length; )
            l.shift()()
    }
    var n = {}
      , i = {
        app: 0
    }
      , r = {
        app: 0
    };
    function o(t) {
        if (n[t])
            return n[t].exports;
        var i = n[t] = {
            i: t,
            l: !1,
            exports: {}
        };
        console.log("t:::",t);
        return e[t].call(i.exports, i, i.exports, o),
        i.l = !0,
        i.exports
    }
    load=o;
    o.e = function(e) {
        var t = [];
        i[e] ? t.push(i[e]) : 0 !== i[e] && {
            DetailModule: 1,
            ServiceCatalog: 1,
            ServiceSearchModule: 1,
            "announcement-list": 1,
            "download-page": 1,
            home: 1,
            personLogin: 1,
            search: 1
        }[e] && t.push(i[e] = new Promise((function(t, n) {
            for (var r = "static/css/" + ({
                DetailModule: "DetailModule",
                ServiceCatalog: "ServiceCatalog",
                ServiceSearchModule: "ServiceSearchModule",
                "announcement-list": "announcement-list",
                "download-page": "download-page",
                home: "home",
                personLogin: "personLogin",
                redirect: "redirect",
                search: "search",
                pdfjsWorker: "pdfjsWorker"
            }[e] || e) + "." + {
                DetailModule: "5e631d12",
                ServiceCatalog: "1d81de4e",
                ServiceSearchModule: "128f361e",
                "announcement-list": "ee54d713",
                "download-page": "a9c8d3ee",
                home: "677f5749",
                personLogin: "acd0e1ca",
                redirect: "31d6cfe0",
                search: "3013d579",
                pdfjsWorker: "31d6cfe0"
            }[e] + ".css", a = o.p + r, s = document.getElementsByTagName("link"), l = 0; l < s.length; l++) {
                var u = (h = s[l]).getAttribute("data-href") || h.getAttribute("href");
                if ("stylesheet" === h.rel && (u === r || u === a))
                    return t()
            }
            var c = document.getElementsByTagName("style");
            for (l = 0; l < c.length; l++) {
                var h;
                if ((u = (h = c[l]).getAttribute("data-href")) === r || u === a)
                    return t()
            }
            var d = document.createElement("link");
            d.rel = "stylesheet",
            d.type = "text/css",
            d.onload = t,
            d.onerror = function(t) {
                var r = t && t.target && t.target.src || a
                  , o = new Error("Loading CSS chunk " + e + " failed.\n(" + r + ")");
                o.code = "CSS_CHUNK_LOAD_FAILED",
                o.request = r,
                delete i[e],
                d.parentNode.removeChild(d),
                n(o)
            }
            ,
            d.href = a,
            document.getElementsByTagName("head")[0].appendChild(d)
        }
        )).then((function() {
            i[e] = 0
        }
        )));
        var n = r[e];
        if (0 !== n)
            if (n)
                t.push(n[2]);
            else {
                var a = new Promise((function(t, i) {
                    n = r[e] = [t, i]
                }
                ));
                t.push(n[2] = a);
                var s, l = document.createElement("script");
                l.charset = "utf-8",
                l.timeout = 120,
                o.nc && l.setAttribute("nonce", o.nc),
                l.src = function(e) {
                    return o.p + "" + ({
                        DetailModule: "DetailModule",
                        ServiceCatalog: "ServiceCatalog",
                        ServiceSearchModule: "ServiceSearchModule",
                        "announcement-list": "announcement-list",
                        "download-page": "download-page",
                        home: "home",
                        personLogin: "personLogin",
                        redirect: "redirect",
                        search: "search",
                        pdfjsWorker: "pdfjsWorker"
                    }[e] || e) + ".1753261690554.js"
                }(e);
                var u = new Error;
                s = function(t) {
                    l.onerror = l.onload = null,
                    clearTimeout(c);
                    var n = r[e];
                    if (0 !== n) {
                        if (n) {
                            var i = t && ("load" === t.type ? "missing" : t.type)
                              , o = t && t.target && t.target.src;
                            u.message = "Loading chunk " + e + " failed.\n(" + i + ": " + o + ")",
                            u.name = "ChunkLoadError",
                            u.type = i,
                            u.request = o,
                            n[1](u)
                        }
                        r[e] = void 0
                    }
                }
                ;
                var c = setTimeout((function() {
                    s({
                        type: "timeout",
                        target: l
                    })
                }
                ), 12e4);
                l.onerror = l.onload = s,
                document.head.appendChild(l)
            }
        return Promise.all(t)
    }
    ,
    o.m = e,
    o.c = n,
    o.d = function(e, t, n) {
        o.o(e, t) || Object.defineProperty(e, t, {
            enumerable: !0,
            get: n
        })
    }
    ,
    o.r = function(e) {
        "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {
            value: "Module"
        }),
        Object.defineProperty(e, "__esModule", {
            value: !0
        })
    }
    ,
    o.t = function(e, t) {
        if (1 & t && (e = o(e)),
        8 & t)
            return e;
        if (4 & t && "object" == typeof e && e && e.__esModule)
            return e;
        var n = Object.create(null);
        if (o.r(n),
        Object.defineProperty(n, "default", {
            enumerable: !0,
            value: e
        }),
        2 & t && "string" != typeof e)
            for (var i in e)
                o.d(n, i, function(t) {
                    return e[t]
                }
                .bind(null, i));
        return n
    }
    ,
    o.n = function(e) {
        var t = e && e.__esModule ? function() {
            return e.default
        }
        : function() {
            return e
        }
        ;
        return o.d(t, "a", t),
        t
    }
    ,
    o.o = function(e, t) {
        return Object.prototype.hasOwnProperty.call(e, t)
    }
    ,
    o.p = "",
    o.oe = function(e) {
        throw e
    }
    ;
    var a = window.webpackJsonp = window.webpackJsonp || []
      , s = a.push.bind(a);
    a.push = t,
    a = a.slice();
    for (var l = 0; l < a.length; l++)
        t(a[l]);
    var u = s;
    // o(o.s = 0)
}({
//模块

})
function A(e) {
    var t, n, i = new Array;
    t = e.length;
    for (var r = 0; r < t; r++)
        (n = e.charCodeAt(r)) >= 65536 && n <= 1114111 ? (i.push(n >> 18 & 7 | 240),
        i.push(n >> 12 & 63 | 128),
        i.push(n >> 6 & 63 | 128),
        i.push(63 & n | 128)) : n >= 2048 && n <= 65535 ? (i.push(n >> 12 & 15 | 224),
        i.push(n >> 6 & 63 | 128),
        i.push(63 & n | 128)) : n >= 128 && n <= 2047 ? (i.push(n >> 6 & 31 | 192),
        i.push(63 & n | 128)) : i.push(255 & n);
    return i
}
function y(e, t) {
    return A(b(A(e.substr(0, 16)), A(t)).toUpperCase().substr(0, 16))
}
function b(t, n) {
    var i = 16 - parseInt(n.length % 16);
    n = n.concat(new Array(i).fill(i));
    var r = load("68b2").sm4.encrypt(n, t);
    return load("b639").Buffer.from(r).toString("hex")
}


e=
{
    "data": {
        "addr": "",
        "regnCode": "440800",
        "medinsName": "",
        "medinsLvCode": "",
        "medinsTypeCode": "",
        "outMedOpenFlag": "",
        "pageNum": 197,
        "pageSize": 10,
        "queryDataSource": "es"
    },
    "appCode": "T98HPCGN5ZVVQBS8LZQNOAEXVI9GYHKQ",
    "version": "1.0.0",
    "encType": "SM4",
    "signType": "SM2",
    "timestamp" : Math.ceil((new Date).getTime() / 1e3)
}
function get_signdata(e) {
    
        var n = m(e)
          , i = p(n);
        i.data = p(i.data);
        var r = v(i)
          , a = load("68b2").sm2.doSignature(r, "009c4a35d9aca4c68f1a3fa89c93684347205a4d84dc260558a049869709ac0b42", {
            hash: !0
        });
        e.signData=load("b639").Buffer.from(a, "hex").toString("base64");
        return load("b639").Buffer.from(a, "hex").toString("base64")

}
function get_encData( e) {

    for (var t = e.data && JSON.stringify(e.data), n = "", i = 0; i < t.length; i++) {
        var r = t.charAt(i)
          , o = t.charCodeAt(i);
        n += o > 127 ? "\\u" + o.toString(16).padStart(4, "0") : r
    }
    var a = A(n);
    e.appCode && e.appCode !== "T98HPCGN5ZVVQBS8LZQNOAEXVI9GYHKQ" && (u = e.appCode);
    var s = y("T98HPCGN5ZVVQBS8LZQNOAEXVI9GYHKQ", "NMVFVILMKT13GEMD3BKPKCTBOQBPZR2P")
      , l = b(s, a);
    e.data=l.toUpperCase();
    return l.toUpperCase()


}


// console.log(e)
// console.log(get_signdata(e))
// console.log(e)

console.log(get_encData(e))

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值