Js逆向4:加密算法

outman
16
2025-06-10

分析1

//案例:https://login.zhangin.com/

  1. 输入账号密码发现载荷中表单数据:param = 乱七八糟,猜测可能这里是加密的

  2. 全局搜索 param,发现它出现在某个 Js 文件,而且调用堆栈里也有很多这个 Js,猜测加密在这里面

  3. 进入这个 Js 代码,找到 param 的位置,发现代码:parameter: O;猜测 O 是加密值,在他后面设断点调试一下,发现真的是

  4. 找 O 是哪来的,往前看,发现代码段,O 通过 za 函数传入 c.value 和 S 返回的,S 又发现是账号密码的明文,那下一步也显而易见了

代码:

let S;//S: "123<><>123"
w && w != "" ? S = A + "<><>" + m + "<><>" + w : S = A + "<><>" + m;
const O = za(c.value, S);
  1. 找到 za 函数 和 c.value,选中 za 弹出提示跳转到另一个代码去,发现 za 函数源码

  2. e 就是 c.value,n 就是 S;发现是 AES 加密,iv:偏移量;mode:模式;padding:填充;那密钥是什么,encrypt 串两个参数 n 和 t,n是明文,那 t 就是密钥了,t = e , r = e,拿下这些信息,我们直接找个工具验证,发现完全正确

代码:

za = (e, n) => {
    const t = _0.enc.Latin1.parse(e)
      , r = _0.enc.Latin1.parse(e);
    return _0.AES.encrypt(n, t, {
        iv: r,
        mode: _0.mode.CBC,
        padding: _0.pad.ZeroPadding
    }).toString()
}
  1. 它在我面前如同没穿衣服

分析2

//案例:https://auth.xincheng.com/

  1. F12 抓一下,发现密码被加密,hidetxtPassword,看调用堆栈,猜测在 login 和 匿名 中间

  2. 进入索引,发现打包数据的代码,成功找到 hidetxtPassword,往上找怎么来的

  3. 发现代码,实例化 JSEncrypt,调用 encrypt.encrypt( ) 函数加密得到数据

代码:

var encrypt = new JSEncrypt();
                encrypt.setPublicKey($("#Public_key").val());
                hidetxtPassword = encrypt.encrypt($("#txtPassword").val());
                if (hidetxtPassword.endWith('==') == false) {
                    hidetxtPassword = encrypt.encrypt($("#txtPassword").val());
                }

  1. 进入 JSEncrypt,看看是什么加密,不过代码中没什么明显的提示词,只是看到有个 PublicKey

  2. 转变思路,下载这个有 JSEncrypt 的 Js 代码,部署到本地,就可以复刻他的加密逻辑

  3. 现在需要找到 txtPassword,一搜索发现藏在上面,webstorm 开始部署

  4. 它在我面前如同只穿内裤

代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">

  <title>Title</title>
</head>
<body>
<script src="jsencrypt.min.js"></script>
<script>
    var encrypt = new JSEncrypt();
    encrypt.setPublicKey("publicKey");
    hidetxtPassword = encrypt.encrypt("cccc")
    console.log(hidetxtPassword);
</script>
</body>
</html>

问题

这个方法还是有个小弊端的,如果下载的这个 Js 代码,就这么一个功能实现了,那没有任何问题

如果他是嵌套的,那很麻烦了,一运行报错说缺少某个文件,下载下来再部署,还缺另一个,下几个还行,要是好几十上百个,脑子要炸的

分析3

//案例:https://www.endata.com.cn/Video/index.html

  1. 发现 Js 代码乱乱的,可能被混淆,打包器打包过了

  2. 下载相关 Js,问 AI :已知 webDES.min.js 是 webpack 打包的代码,如何运行调用 webDES.min.js 里面的 webInstace.shell

  3. 终端 npm init -y-----npm install vm-----npm install fs,下载依赖

  4. 把需要解密的数据放到相应的函数中,运行即可

分析4(高端)

  1. 根据路径 currentitems,查询出相关 Js

  2. 发现解密部分 AES,O 是需要解密的字符串,mode是模式,r 是 key 且 r = a

let s = n.SHA1(n.enc.Utf8.parse("tSdGtmwh49BcR1irt18mxG41dGsBuGKS")),
a = n.enc.Hex.parse(s.toString(n.enc.Hex).substr(0, 32));
  1. a 是 s 截取32位来的;s 是 SHA1来的,纯纯随机没法搞了

  2. 代码核心功能部分复制到本地部署,发现不成功啊,少这少那的,那就用 Crypto 库替代 SHA1,npm install crypto-js 下载Crypto库

  3. 把原 Js n.的部分改成Crypto. 即可