前言:一篇简单入门级别的JS加解密hook文章。

浏览器:firefox
抓包工具:burpsuite

1、抓包访问登录页面的时候,站点加密情况如下:
image.png
2、火狐F12进入调试器,勾选“XHR断点”:
image.png
3、然后重新登录访问页面,浏览器会自动debug所有发送URL请求数据的位置,如下所示:
image.png
4、F8 到数据加密的位置:
image.png
5、接着主要查看右侧的“调用堆栈”的内容,其中loadData这段代码记录了数据加密的过程:
image.png

//三段式加密
var ajaxObj = this;
 seajs.use('js/security/encrypt', function (encrypt) {
          var data =YT.JsonToStr(conf.params || conf.param || {});
            var key = encrypt.getAesKey();
            var aesdata = encrypt.encrypt(data, key);
            conf.params = aesdata;
            conf.dynKey = key;
            window.encryptObj = encrypt;
            ajaxObj.post(conf);
    });

6、简单解析这段代码:首先利用seajs向外部加载了encrypt.js,引入加密方法encrypt,因此encrypt是属于局部作用域的,接着用var声明aesdatawindow.encryptObj

加密方法:encrypt.encrypt(data, key) -> (return 加密后的数据)
解密方法: window.encryptObj -> (等于 encrypt)

7、因此,需要加密数据的hook位置就是encrypt.encrypt(data, key); 因为这个时候 data 的值还是明文。
image.png
8、而解密数据的hook位置就是window.encryptObj.aesDecrypt(data,conf.dynKey),后续代码也可以直接定位到。
image.png
9、因为 encrypt 是局部作用域,所以要借用源代码中seajs的引入方法,js hook代码可以写成下面的样子:

(function () {
  try{ 
    seajs.use('js/security/encrypt', function (encrypt) {
      var e = encrypt.encrypt;
      encrypt.encrypt = function (data) {
        let res = e.apply(this,arguments);
        console.error("加密(request):", res);
        console.error("明文(request):", data);
        return res
      };
      var decrypt = window.encryptObj.aesDecrypt;
      window.encryptObj.aesDecrypt = function (key, value) {
          let res = decrypt.apply(this, arguments);
          console.error("response:", res);
          return res;
      };
    });
  }catch(error){}
})();

10、在控制台注入js,成功打印明文数据。
image.png
11、数据请求替换:

(function () {
  try{ 
    seajs.use('js/security/encrypt', function (encrypt) {
      var e = encrypt.encrypt;
      encrypt.encrypt = function (data) {
        console.error("原请求:", data);
        // 原字符串内容
        const str1 = '111';
        // 替换字符串内容
        const str2 = '222';
        if(data.indexOf(str1) != -1){
          data = data.replace(str1, str2);
          console.error("篡改后的请求:", data);
        }
        let res = e.apply(this, arguments);
        return res
      };
      var decrypt = window.encryptObj.aesDecrypt;
      window.encryptObj.aesDecrypt = function (key, value) {
          console.error("response:", res);
          let res = decrypt.apply(this, arguments);
          return res;
      };
    });
  }catch(error){}
})();

12、当然你也可以使用JS自定义替换加密文件的方法来hook,更简单!该方法在后续的文章中也有提到:

https://www.yuque.com/jammny/ioh9u7/du9lt18l9d20fqeg?singleDoc# 《【JS Hook实战】基于Webpack的JS加解密分析》
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐