当前位置: 首页 > news >正文

webpack js 逆向 --- 个人记录

  1. 网站
    aHR0cDovL2FlcmZheWluZy5jb20v
  2. 加密参数
    在这里插入图片描述
  3. 参数加密位置
    在这里插入图片描述

方法:

1. 构造自执行函数

!function(e) {
	// 加载器
}(
   // 模块1;
   // 模块2
)

2. 找到js的加载器
在这里插入图片描述
3. 把上述代码放入第一步构造的自执行函数(完整扣取一整个加载器里的代码),并用一个全局参数接收加载器,比如window.zzz = i;
自执行代码如下:

var window=global;
!function(e) {
    function t(t) {
        for (var r, i, l = t[0], s = t[1], u = t[2], f = 0, p = []; f < l.length; f++)
            i = l[f],
            Object.prototype.hasOwnProperty.call(o, i) && o[i] && p.push(o[i][0]),
            o[i] = 0;
        for (r in s)
            Object.prototype.hasOwnProperty.call(s, r) && (e[r] = s[r]);
        for (c && c(t); p.length; )
            p.shift()();
        return a.push.apply(a, u || []),
        n()
    }
    function n() {
        for (var e, t = 0; t < a.length; t++) {
            for (var n = a[t], r = !0, l = 1; l < n.length; l++) {
                var s = n[l];
                0 !== o[s] && (r = !1)
            }
            r && (a.splice(t--, 1),
            e = i(i.s = n[0]))
        }
        return e
    }
    var r = {}
      , o = {
        0: 0
    }
      , a = [];
    function i(t) {
        if (r[t])
            return r[t].exports;
        var n = r[t] = {
            i: t,
            l: !1,
            exports: {}
        };
        return e[t].call(n.exports, n, n.exports, i),
        n.l = !0,
        n.exports
    }
    window.zzz = i; // 定义一个参数window.zzz接收加载器

    ;
    var l = window.webpackJsonp = window.webpackJsonp || []
      , s = l.push.bind(l);
    l.push = t,
    l = l.slice();
    for (var u = 0; u < l.length; u++)
        t(l[u]);
    var c = s;
}({
	// 模块1;
   // 模块2
})

4. 把加密位置的代码扣取下来,放入自执行函数的模块里,然后定义一个模块名给,比如jsencrypt,自执行函数代码如下:

var window=global;
!function(e) {
    function t(t) {
        for (var r, i, l = t[0], s = t[1], u = t[2], f = 0, p = []; f < l.length; f++)
            i = l[f],
            Object.prototype.hasOwnProperty.call(o, i) && o[i] && p.push(o[i][0]),
            o[i] = 0;
        for (r in s)
            Object.prototype.hasOwnProperty.call(s, r) && (e[r] = s[r]);
        for (c && c(t); p.length; )
            p.shift()();
        return a.push.apply(a, u || []),
        n()
    }
    function n() {
        for (var e, t = 0; t < a.length; t++) {
            for (var n = a[t], r = !0, l = 1; l < n.length; l++) {
                var s = n[l];
                0 !== o[s] && (r = !1)
            }
            r && (a.splice(t--, 1),
            e = i(i.s = n[0]))
        }
        return e
    }
    var r = {}
      , o = {
        0: 0
    }
      , a = [];
    function i(t) {
        if (r[t])
            return r[t].exports;
        var n = r[t] = {
            i: t,
            l: !1,
            exports: {}
        };
        return e[t].call(n.exports, n, n.exports, i),
        n.l = !0,
        n.exports
    }
    window.zzz = i; // 定义一个参数window.zzz接收加载器

    ;
    var l = window.webpackJsonp = window.webpackJsonp || []
      , s = l.push.bind(l);
    l.push = t,
    l = l.slice();
    for (var u = 0; u < l.length; u++)
        t(l[u]);
    var c = s;

}(
    {
    	// 模块名:jsencrypt
        jsencrypt:function(e, t, n) {
    "use strict";
    Object.defineProperty(t, "__esModule", {
        value: !0
    });
    t.default = function(e, t) {
        var n = (new Date).getTime() + 2592e6 + (t || 3e4)
          , r = (e || "") + "&t=" + n;
        return {
            t: n,
            s: Sha1.hash(r)
        }
    }
}},
)

5. 对上述代码new一下,然后执行jsencrypt方法,运行代码,发现报错

result = new window.zzz("jsencrypt").default()
console.log(result)

报错:
在这里插入图片描述
6. 然后去源码里扣取Sha1的代码

最后所有js代码如下:

var window=global;

function Sha1() {}
Sha1.hash = function(n, t) {
    var w = Object.assign({
        msgFormat: "string",
        outFormat: "hex"
    }, t), b, i, f, u, e, r, p, k, h, d;
    switch (w.msgFormat) {
    default:
    case "string":
        n = Sha1.utf8Encode(n);
        break;
    case "hex-bytes":
        n = Sha1.hexBytesToString(n)
    }
    b = [1518500249, 1859775393, 2400959708, 3395469782];
    i = [1732584193, 4023233417, 2562383102, 271733878, 3285377520];
    n += String.fromCharCode(128);
    var g = n.length / 4 + 2
      , o = Math.ceil(g / 16)
      , s = new Array(o);
    for (u = 0; u < o; u++)
        for (s[u] = new Array(16),
        f = 0; f < 16; f++)
            s[u][f] = n.charCodeAt(u * 64 + f * 4) << 24 | n.charCodeAt(u * 64 + f * 4 + 1) << 16 | n.charCodeAt(u * 64 + f * 4 + 2) << 8 | n.charCodeAt(u * 64 + f * 4 + 3);
    for (s[o - 1][14] = (n.length - 1) * 8 / Math.pow(2, 32),
    s[o - 1][14] = Math.floor(s[o - 1][14]),
    s[o - 1][15] = (n.length - 1) * 8 & 4294967295,
    u = 0; u < o; u++) {
        for (e = new Array(80),
        r = 0; r < 16; r++)
            e[r] = s[u][r];
        for (r = 16; r < 80; r++)
            e[r] = Sha1.ROTL(e[r - 3] ^ e[r - 8] ^ e[r - 14] ^ e[r - 16], 1);
        var c = i[0]
          , l = i[1]
          , a = i[2]
          , v = i[3]
          , y = i[4];
        for (r = 0; r < 80; r++)
            p = Math.floor(r / 20),
            k = Sha1.ROTL(c, 5) + Sha1.f(p, l, a, v) + y + b[p] + e[r] >>> 0,
            y = v,
            v = a,
            a = Sha1.ROTL(l, 30) >>> 0,
            l = c,
            c = k;
        i[0] = i[0] + c >>> 0;
        i[1] = i[1] + l >>> 0;
        i[2] = i[2] + a >>> 0;
        i[3] = i[3] + v >>> 0;
        i[4] = i[4] + y >>> 0
    }
    for (h = 0; h < i.length; h++)
        i[h] = ("00000000" + i[h].toString(16)).slice(-8);
    return d = w.outFormat == "hex-w" ? " " : "",
    i.join(d)
}
;
Sha1.f = function(n, t, i, r) {
    switch (n) {
    case 0:
        return t & i ^ ~t & r;
    case 1:
        return t ^ i ^ r;
    case 2:
        return t & i ^ t & r ^ i & r;
    case 3:
        return t ^ i ^ r
    }
}
;
Sha1.ROTL = function(n, t) {
    return n << t | n >>> 32 - t
}
;
Sha1.utf8Encode = function(n) {
    return unescape(encodeURIComponent(n))
}
;
Sha1.hexBytesToString = function(n) {
    var i, t;
    for (n = n.replace(" ", ""),
    i = "",
    t = 0; t < n.length; t += 2)
        i += String.fromCharCode(parseInt(n.slice(t, t + 2), 16));
    return i
}
!function(e) {
    function t(t) {
        for (var r, i, l = t[0], s = t[1], u = t[2], f = 0, p = []; f < l.length; f++)
            i = l[f],
            Object.prototype.hasOwnProperty.call(o, i) && o[i] && p.push(o[i][0]),
            o[i] = 0;
        for (r in s)
            Object.prototype.hasOwnProperty.call(s, r) && (e[r] = s[r]);
        for (c && c(t); p.length; )
            p.shift()();
        return a.push.apply(a, u || []),
        n()
    }
    function n() {
        for (var e, t = 0; t < a.length; t++) {
            for (var n = a[t], r = !0, l = 1; l < n.length; l++) {
                var s = n[l];
                0 !== o[s] && (r = !1)
            }
            r && (a.splice(t--, 1),
            e = i(i.s = n[0]))
        }
        return e
    }
    var r = {}
      , o = {
        0: 0
    }
      , a = [];
    function i(t) {
        if (r[t])
            return r[t].exports;
        var n = r[t] = {
            i: t,
            l: !1,
            exports: {}
        };
        return e[t].call(n.exports, n, n.exports, i),
        n.l = !0,
        n.exports
    }
    window.zzz = i;   // 定义一个参数window.zzz接收加载器

    ;
    var l = window.webpackJsonp = window.webpackJsonp || []
      , s = l.push.bind(l);
    l.push = t,
    l = l.slice();
    for (var u = 0; u < l.length; u++)
        t(l[u]);
    var c = s;

}(
    {
    	// 模块名:jsencrypt
        jsencrypt:function(e, t, n) {
    "use strict";
    Object.defineProperty(t, "__esModule", {
        value: !0
    });
    t.default = function(e, t) {
        var n = (new Date).getTime() + 2592e6 + (t || 3e4)
          , r = (e || "") + "&t=" + n;
        return {
            t: n,
            s: Sha1.hash(r)
        }
    }
}},

)

result = new window.zzz("jsencrypt").default()
console.log(result)

最后运行结果:
在这里插入图片描述

相关文章:

  • Redis介绍及使用
  • SSM民宿管理平台系统
  • MapReduce 的广泛应用:从数据处理到智能决策
  • swift-汇编分析多态原理、init
  • 2.环形队列
  • LangChain vs LlamaIndex:构建 AI 知识库系统(文本嵌入、向量数据库)
  • C语言:几种字符串常用的API
  • 13.我的seafile网盘,多端同步我做主
  • Redis(笔记)
  • TypeScript面试题集合【初级、中级、高级】
  • DiffAD:自动驾驶的统一扩散建模方法
  • ChatGPT 4:解锁AI文案、绘画与视频创作新纪元
  • 蓝桥杯 web 水果拼盘 (css3)
  • Elasticsearch DSL 中的 aggs 聚合
  • 字符串的replace、replaceAll、split()方法
  • 主流程发起,去除子流程的时长计算问题
  • 【愚公系列】《高效使用DeepSeek》055-可靠性评估与提升
  • sklearn的Pipeline
  • Kotlin 中的 `reified` 关键字全解析:保留类型信息 + 优化高阶函数的双重魔法
  • 中国钧瓷收藏市场现状和风险警示
  • 广东营销网站建设服务/window优化大师官网
  • 网站建设域名怎么用/武汉刚刚发生的新闻
  • 北京西站到大兴机场/珠海百度搜索排名优化
  • 郴州市住房建设局门户网站/网站排名软件有哪些
  • 本地建设网站怎么查看后台账号/品牌宣传推广文案
  • 如何建设个人网站和博客/2345导航网址