原文链接:记录一次前端JS加密绕过 | 绕过前端解密的两种方法
一、背景
一个银行较小的系统,数据包传输的值加密处理。故扣加解密代码编写脚本,以便测试方便 。
二、坑的由来
过程:
抓包发现数据加密,意料之中,常规思路寻常分析加密函数。
看代码就能大致推测开发的水平好坏,看着前端代码,越看越乐。。。。
在console执行函数,出正解结果。接下来扣代码,写脚本:
报错,debug追踪一下。
发现引用的第三方包,弄了一个自执行函数,闭包了。。。查资料,发现自执行函数在函数内部定义的变量和函数就只能在函数内部访问,在外部无法访问,在该上下文环境中,调用函数时就提供了一个创建私有成员的方式,所以我执行脚本报错。 接下来做了N次尝试,这个问题困扰好久没解决,(没办法,js太差) 1.尝试解包。我错了,我高估了自己。 2.直接抽取关键代码。 3.看到是base64js,相直接扣出原版的base64试试,发现base64js是经过二次开发的,加密函数调用的他的方法原版没有。 4.在nodejs上执行不成功,用python调用js执行看下。结果一样。 时间成本太高了,,,换方案吧,估计不在我能力范围内。
三、替代方案
这就是没办法的办法,直接在snippets工具中执行测试脚本。
- var sm4Test = function(text) {
- var a = "11HDESaAhiHHugDz";
- function encrypt(text) {
- console.log("-----------------------------------")
- encryptText = new sm4utils(a).encryptData_ECB(text);
- console.info("明文是:" + text)
- console.info("加密结果是:" + encryptText);
- console.log("-----------------------------------")
- }
- function decrypt(text) {
- plainText = new sm4utils(a).decryptData_ECB(text);
- console.info("明文是:" + text)
- console.log("解密结果是:" + plainText)
- console.log("-----------------------------------")
- }
- return {
- encrypt: encrypt,
- decrypt: decrypt
- }
- }
- var text = "exAcymtIEQj2Y0ul8aIOag==";
- var obj = new sm4Test();
- obj.encrypt(text);
- obj.decrypt(text);
复制代码 结果如下:
可看到结果正常返回,虽然没有使用nodejs看起来顺眼,但比在console中进行批量操作要省事的多,为折中办法。
四、总结
简单总结自执行函数:
1.基本格式:- (function () { /* code */ } (args));
复制代码
2.作用: - js中没有块级作用域,用来隔离作用域避免污染,或者截断作用域链,避免闭包造成引用变量无法释放。
- 利用立即执行特性,返回需要的业务函数或对象,避免每次通过条件判断来处理。
五、分析前端解密的两种方法
方法一:常规方法 1、访问x系统,发现系统js 有反调试,设置条件断点绕过反调试。 2、在请求包中发现如下密文 3、此时发现该数据为xhr方式加载。 4、打xhr断点,进行调试 5、重新登录,可看到如下所示: 可发现上图中的l参数就是该数据包请求时的密文 。
6、在xhr中下断一般直接看堆栈调用。
7、逐个往下看。在“anonymous”处看到如下:
8、在该处下断,并取消xhr处的断点。重新登录 。
9、查看相关参数值
10、根据这些信息确认为登录入口。发现Q为native code,双击进去。
11、在该处下断。重新登录。并在console中查看返回信息。
12、发现和刚才抓到的包中的数据一致。
方法二:hook
1、编辑如下脚本
- (function() {
- 'use strict';
- // Your code here...
- var rstringify = JSON.stringify;
- JSON.stringify = function(a) {
- console.log("Detect Json.stringify", a);
- return rstringify(a);
- }
- })();
复制代码 2、登录,可在console上直接看到。
3、在该处下断点。
4、在堆栈处逐个往下看,在再第个参数 ‘s’处,发现是加密函数。
|