huguo002 发表于 2023-12-26 11:43

【JS逆向】关于MD5加密的疑惑,求解!

【JS逆向】关于MD5加密的疑惑,求解!

本渣渣基础很菜,关于js中MD5加密,有一个疑惑,如下:
完整js代码:
(function(g) {
function o(u, z) {
    var w = (u & 65535) + (z & 65535),
    v = (u >> 16) + (z >> 16) + (w >> 16);
    return (v << 16) | (w & 65535)
}
function s(u, v) {
    return (u << v) | (u >>> (32 - v))
}
function c(A, w, v, u, z, y) {
    return o(s(o(o(w, A), o(u, y)), z), v)
}
function b(w, v, B, A, u, z, y) {
    return c((v & B) | ((~v) & A), w, v, u, z, y)
}
function i(w, v, B, A, u, z, y) {
    return c((v & A) | (B & (~A)), w, v, u, z, y)
}
function n(w, v, B, A, u, z, y) {
    return c(v ^ B ^ A, w, v, u, z, y)
}
function a(w, v, B, A, u, z, y) {
    return c(B ^ (v | (~A)), w, v, u, z, y)
}
function d(F, A) {
    F |= 128 << ((A) % 32);
    F[(((A + 64) >>> 9) << 4) + 14] = A;
    var w, z, y, v, u, E = 1732584193,
    D = -271733879,
    C = -1732584194,
    B = 271733878;
    for (w = 0; w < F.length; w += 16) {
      z = E;
      y = D;
      v = C;
      u = B;
      E = b(E, D, C, B, F, 7, -680876936);
      B = b(B, E, D, C, F, 12, -389564586);
      C = b(C, B, E, D, F, 17, 606105819);
      D = b(D, C, B, E, F, 22, -1044525330);
      E = b(E, D, C, B, F, 7, -176418897);
      B = b(B, E, D, C, F, 12, 1200080426);
      C = b(C, B, E, D, F, 17, -1473231341);
      D = b(D, C, B, E, F, 22, -45705983);
      E = b(E, D, C, B, F, 7, 1770035416);
      B = b(B, E, D, C, F, 12, -1958414417);
      C = b(C, B, E, D, F, 17, -42063);
      D = b(D, C, B, E, F, 22, -1990404162);
      E = b(E, D, C, B, F, 7, 1804603682);
      B = b(B, E, D, C, F, 12, -40341101);
      C = b(C, B, E, D, F, 17, -1502002290);
      D = b(D, C, B, E, F, 22, 1236535329);
      E = i(E, D, C, B, F, 5, -165796510);
      B = i(B, E, D, C, F, 9, -1069501632);
      C = i(C, B, E, D, F, 14, 643717713);
      D = i(D, C, B, E, F, 20, -373897302);
      E = i(E, D, C, B, F, 5, -701558691);
      B = i(B, E, D, C, F, 9, 38016083);
      C = i(C, B, E, D, F, 14, -660478335);
      D = i(D, C, B, E, F, 20, -405537848);
      E = i(E, D, C, B, F, 5, 568446438);
      B = i(B, E, D, C, F, 9, -1019803690);
      C = i(C, B, E, D, F, 14, -187363961);
      D = i(D, C, B, E, F, 20, 1163531501);
      E = i(E, D, C, B, F, 5, -1444681467);
      B = i(B, E, D, C, F, 9, -51403784);
      C = i(C, B, E, D, F, 14, 1735328473);
      D = i(D, C, B, E, F, 20, -1926607734);
      E = n(E, D, C, B, F, 4, -378558);
      B = n(B, E, D, C, F, 11, -2022574463);
      C = n(C, B, E, D, F, 16, 1839030562);
      D = n(D, C, B, E, F, 23, -35309556);
      E = n(E, D, C, B, F, 4, -1530992060);
      B = n(B, E, D, C, F, 11, 1272893353);
      C = n(C, B, E, D, F, 16, -155497632);
      D = n(D, C, B, E, F, 23, -1094730640);
      E = n(E, D, C, B, F, 4, 681279174);
      B = n(B, E, D, C, F, 11, -358537222);
      C = n(C, B, E, D, F, 16, -722521979);
      D = n(D, C, B, E, F, 23, 76029189);
      E = n(E, D, C, B, F, 4, -640364487);
      B = n(B, E, D, C, F, 11, -421815835);
      C = n(C, B, E, D, F, 16, 530742520);
      D = n(D, C, B, E, F, 23, -995338651);
      E = a(E, D, C, B, F, 6, -198630844);
      B = a(B, E, D, C, F, 10, 1126891415);
      C = a(C, B, E, D, F, 15, -1416354905);
      D = a(D, C, B, E, F, 21, -57434055);
      E = a(E, D, C, B, F, 6, 1700485571);
      B = a(B, E, D, C, F, 10, -1894986606);
      C = a(C, B, E, D, F, 15, -1051523);
      D = a(D, C, B, E, F, 21, -2054922799);
      E = a(E, D, C, B, F, 6, 1873313359);
      B = a(B, E, D, C, F, 10, -30611744);
      C = a(C, B, E, D, F, 15, -1560198380);
      D = a(D, C, B, E, F, 21, 1309151649);
      E = a(E, D, C, B, F, 6, -145523070);
      B = a(B, E, D, C, F, 10, -1120210379);
      C = a(C, B, E, D, F, 15, 718787259);
      D = a(D, C, B, E, F, 21, -343485551);
      E = o(E, z);
      D = o(D, y);
      C = o(C, v);
      B = o(B, u)
    }
    return
}
function p(v) {
    var w, u = "";
    for (w = 0; w < v.length * 32; w += 8) {
      u += String.fromCharCode((v >>> (w % 32)) & 255)
    }
    return u
}
function j(v) {
    var w, u = [];
    u[(v.length >> 2) - 1] = undefined;
    for (w = 0; w < u.length; w += 1) {
      u = 0
    }
    for (w = 0; w < v.length * 8; w += 8) {
      u |= (v.charCodeAt(w / 8) & 255) << (w % 32)
    }
    return u
}
function k(u) {
    return p(d(j(u), u.length * 8))
}
function f(w, z) {
    var v, y = j(w),
    u = [],
    x = [],
    A;
    u = x = undefined;
    if (y.length > 16) {
      y = d(y, w.length * 8)
    }
    for (v = 0; v < 16; v += 1) {
      u = y ^ 909522486;
      x = y ^ 1549556828
    }
    A = d(u.concat(j(z)), 512 + z.length * 8);
    return p(d(x.concat(A), 512 + 128))
}
function t(w) {
    var z = "0123456789abcdef",
    v = "",
    u, y;
    for (y = 0; y < w.length; y += 1) {
      u = w.charCodeAt(y);
      v += z.charAt((u >>> 4) & 15) + z.charAt(u & 15)
    }
    return v
}
function m(u) {
    return unescape(encodeURIComponent(u))
}
function q(u) {
    return k(m(u))
}
function l(u) {
    return t(q(u))
}
function h(u, v) {
    return f(m(u), m(v))
}
function r(u, v) {
    return t(h(u, v))
}
g.md5 = function(v, w, u) {
    if (!w) {
      if (!u) {
            return l(v)
      } else {
            return q(v)
      }
    }
    if (!u) {
      return r(w, v)
    } else {
      return h(w, v)
    }
}
} (typeof jQuery === "function" ? jQuery: this));



使用打印输出
console.log(md5('123456'))
// e10adc3949ba59abbe56e057f20f883e

会报错,报错如下:
E:\Python\Jsspider\fkw\fanke.js:186
console.log(md5('123456'))
      ^

ReferenceError: md5 is not defined
    at Object.<anonymous> (E:\Python\Jsspider\fkw\fanke.js:186:9)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)

这是为什么呢?
但是在 python 中调用 js文件 加密却没有问题,不会报错:
import hashlib
#调用js实现加密方式一
def get_js_pwd():
    #实例化一个node对象
    node=execjs.get()
    #js源文件编译
    ctx=node.compile(open('./fanke.js',encoding='utf-8').read())
    #ctx = node.compile(open('fkw.js', encoding='utf-8').read())
    #执行指定函数
    password=123456
    # funcName='md5("{0}")'.format(password)
    funcName=f'md5({password})'
    pwd=ctx.eval(funcName)
    print(pwd)

而以下js代码可以正常打印输出:


function o(u, z) {
    var w = (u & 65535) + (z & 65535)
      , v = (u >> 16) + (z >> 16) + (w >> 16);
    return (v << 16) | (w & 65535)
}
function s(u, v) {
    return (u << v) | (u >>> (32 - v))
}
function c(A, w, v, u, z, y) {
    return o(s(o(o(w, A), o(u, y)), z), v)
}
function b(w, v, B, A, u, z, y) {
    return c((v & B) | ((~v) & A), w, v, u, z, y)
}
function i(w, v, B, A, u, z, y) {
    return c((v & A) | (B & (~A)), w, v, u, z, y)
}
function n(w, v, B, A, u, z, y) {
    return c(v ^ B ^ A, w, v, u, z, y)
}
function a(w, v, B, A, u, z, y) {
    return c(B ^ (v | (~A)), w, v, u, z, y)
}
function d(F, A) {
    F |= 128 << ((A) % 32);
    F[(((A + 64) >>> 9) << 4) + 14] = A;
    var w, z, y, v, u, E = 1732584193, D = -271733879, C = -1732584194, B = 271733878;
    for (w = 0; w < F.length; w += 16) {
      z = E;
      y = D;
      v = C;
      u = B;
      E = b(E, D, C, B, F, 7, -680876936);
      B = b(B, E, D, C, F, 12, -389564586);
      C = b(C, B, E, D, F, 17, 606105819);
      D = b(D, C, B, E, F, 22, -1044525330);
      E = b(E, D, C, B, F, 7, -176418897);
      B = b(B, E, D, C, F, 12, 1200080426);
      C = b(C, B, E, D, F, 17, -1473231341);
      D = b(D, C, B, E, F, 22, -45705983);
      E = b(E, D, C, B, F, 7, 1770035416);
      B = b(B, E, D, C, F, 12, -1958414417);
      C = b(C, B, E, D, F, 17, -42063);
      D = b(D, C, B, E, F, 22, -1990404162);
      E = b(E, D, C, B, F, 7, 1804603682);
      B = b(B, E, D, C, F, 12, -40341101);
      C = b(C, B, E, D, F, 17, -1502002290);
      D = b(D, C, B, E, F, 22, 1236535329);
      E = i(E, D, C, B, F, 5, -165796510);
      B = i(B, E, D, C, F, 9, -1069501632);
      C = i(C, B, E, D, F, 14, 643717713);
      D = i(D, C, B, E, F, 20, -373897302);
      E = i(E, D, C, B, F, 5, -701558691);
      B = i(B, E, D, C, F, 9, 38016083);
      C = i(C, B, E, D, F, 14, -660478335);
      D = i(D, C, B, E, F, 20, -405537848);
      E = i(E, D, C, B, F, 5, 568446438);
      B = i(B, E, D, C, F, 9, -1019803690);
      C = i(C, B, E, D, F, 14, -187363961);
      D = i(D, C, B, E, F, 20, 1163531501);
      E = i(E, D, C, B, F, 5, -1444681467);
      B = i(B, E, D, C, F, 9, -51403784);
      C = i(C, B, E, D, F, 14, 1735328473);
      D = i(D, C, B, E, F, 20, -1926607734);
      E = n(E, D, C, B, F, 4, -378558);
      B = n(B, E, D, C, F, 11, -2022574463);
      C = n(C, B, E, D, F, 16, 1839030562);
      D = n(D, C, B, E, F, 23, -35309556);
      E = n(E, D, C, B, F, 4, -1530992060);
      B = n(B, E, D, C, F, 11, 1272893353);
      C = n(C, B, E, D, F, 16, -155497632);
      D = n(D, C, B, E, F, 23, -1094730640);
      E = n(E, D, C, B, F, 4, 681279174);
      B = n(B, E, D, C, F, 11, -358537222);
      C = n(C, B, E, D, F, 16, -722521979);
      D = n(D, C, B, E, F, 23, 76029189);
      E = n(E, D, C, B, F, 4, -640364487);
      B = n(B, E, D, C, F, 11, -421815835);
      C = n(C, B, E, D, F, 16, 530742520);
      D = n(D, C, B, E, F, 23, -995338651);
      E = a(E, D, C, B, F, 6, -198630844);
      B = a(B, E, D, C, F, 10, 1126891415);
      C = a(C, B, E, D, F, 15, -1416354905);
      D = a(D, C, B, E, F, 21, -57434055);
      E = a(E, D, C, B, F, 6, 1700485571);
      B = a(B, E, D, C, F, 10, -1894986606);
      C = a(C, B, E, D, F, 15, -1051523);
      D = a(D, C, B, E, F, 21, -2054922799);
      E = a(E, D, C, B, F, 6, 1873313359);
      B = a(B, E, D, C, F, 10, -30611744);
      C = a(C, B, E, D, F, 15, -1560198380);
      D = a(D, C, B, E, F, 21, 1309151649);
      E = a(E, D, C, B, F, 6, -145523070);
      B = a(B, E, D, C, F, 10, -1120210379);
      C = a(C, B, E, D, F, 15, 718787259);
      D = a(D, C, B, E, F, 21, -343485551);
      E = o(E, z);
      D = o(D, y);
      C = o(C, v);
      B = o(B, u)
    }
    return
}
function p(v) {
    var w, u = "";
    for (w = 0; w < v.length * 32; w += 8) {
      u += String.fromCharCode((v >>> (w % 32)) & 255)
    }
    return u
}
function j(v) {
    var w, u = [];
    u[(v.length >> 2) - 1] = undefined;
    for (w = 0; w < u.length; w += 1) {
      u = 0
    }
    for (w = 0; w < v.length * 8; w += 8) {
      u |= (v.charCodeAt(w / 8) & 255) << (w % 32)
    }
    return u
}
function k(u) {
    return p(d(j(u), u.length * 8))
}
function f(w, z) {
    var v, y = j(w), u = [], x = [], A;
    u = x = undefined;
    if (y.length > 16) {
      y = d(y, w.length * 8)
    }
    for (v = 0; v < 16; v += 1) {
      u = y ^ 909522486;
      x = y ^ 1549556828
    }
    A = d(u.concat(j(z)), 512 + z.length * 8);
    return p(d(x.concat(A), 512 + 128))
}
function t(w) {
    var z = "0123456789abcdef", v = "", u, y;
    for (y = 0; y < w.length; y += 1) {
      u = w.charCodeAt(y);
      v += z.charAt((u >>> 4) & 15) + z.charAt(u & 15)
    }
    return v
}
function m(u) {
    return unescape(encodeURIComponent(u))
}
function q(u) {
    return k(m(u))
}
function l(u) {
    return t(q(u))
}
function h(u, v) {
    return f(m(u), m(v))
}
function r(u, v) {
    return t(h(u, v))
}
function md5(v, w, u) {
    if (!w) {
      if (!u) {
            return l(v)
      } else {
            return q(v)
      }
    }
    if (!u) {
      return r(w, v)
    } else {
      return h(w, v)
    }
}


console.log(md5('123456'))
// e10adc3949ba59abbe56e057f20f883e



迷糊了,比较困惑,为什么呢?
基础比较差,能否稍微提点一下!

wodeMAX666 发表于 2023-12-26 11:53

可能是作用域问题

huguo002 发表于 2023-12-26 11:55

wodeMAX666 发表于 2023-12-26 11:53
可能是作用域问题

js完整源码说是闭包...

大兵马元帅 发表于 2023-12-26 12:20

这么复杂 我看了都难受{:1_911:}

lucklys 发表于 2023-12-26 13:08

jQuery.MD5() 或者 this.MD5

闷骚小贱男 发表于 2023-12-26 13:43

闭包,不要用闭包,用直接定义md5函数的那种。就能直接调用吧?

huguo002 发表于 2023-12-26 13:44

lucklys 发表于 2023-12-26 13:08
jQuery.MD5() 或者 this.MD5

console.log(this.md5(123456))

可以!

huguo002 发表于 2023-12-26 13:46

闷骚小贱男 发表于 2023-12-26 13:43
闭包,不要用闭包,用直接定义md5函数的那种。就能直接调用吧?

都可以调用,区别是最后面那个代码可以打印输出 console.log

huguo002 发表于 2023-12-26 13:46

大兵马元帅 发表于 2023-12-26 12:20
这么复杂 我看了都难受

还好,就是长了点,这都还没混淆呢

jim19 发表于 2023-12-26 14:10

是不是版本问题, 我这里node可以直接输出。v21.0.0
页: [1] 2
查看完整版本: 【JS逆向】关于MD5加密的疑惑,求解!