问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

js代码混淆 以及 混淆后如何使用

发布网友 发布时间:2022-04-29 22:21

我来回答

3个回答

懂视网 时间:2022-04-22 14:54

本篇文章给大家带来的内容是关于Javascript混淆与解混淆的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

像软件加密与解密一样,javascript的混淆与解混淆同属于同一个范畴。道高一尺,魔高一丈。没有永恒的黑,也没有永恒的白。一切都是资本市场驱动行为,现在都流行你能为人解决什么问题,这个概念。那么市场究竟能容纳多少个能解决这种问题的利益者。JS没有秘密。

其实本人不赞成javascript进行hash混淆处理,一拖慢运行时速度,二体积大。JS代码前端可获取,天生赋予“开源”属性,都可以在chrome devTools下查看。JS非压缩性混淆完全违法前端优化准则。

目前网络上可以搜索的JS混淆工具不外乎以下几种:

eval混淆,也是最早JS出现的混淆加密,据说第一天就被破解,修改一下代码,alert一下就可以破解了。这种方法从出生的那天就失去了意义。其实JS加密(混淆)是相对于可读性而言的,其实真正有意义的就是压缩型混淆uglify这一类,即可减少体重,也可减少可读性。

但是,也不能排除部分商业源代码使用hash类型混淆源代码,比如 miniui 使用的JSA加密, fundebug使用的javascript-obfuscator。

下面通过代码来说明 JSA加密 和 javascript-obfuscator 的区别:

要混淆的代码:

function logG(message) {
 console.log('x1b[32m%sx1b[0m', message); 
}
function logR(message) {
 console.log('x1b[41m%sx1b[0m', message); 
}
logG('logR');
logR('logG');

通过JSA加密混淆后生成的代码

function o00($){console.log("x1b[32m%sx1b[0m",$)}function o01($){console.log("x1b[41m%sx1b[0m",$)}o00("logR");o01("logG")

然后再beautifier一下:

function o00($) {
 console.log("x1b[32m%sx1b[0m", $)
}

function o01($) {
 console.log("x1b[41m%sx1b[0m", $)
}
o00("logR");
o01("logG")

可以发现,其实没有做什么什么修改,只是做了一些变量替换。想还原也比较简单的。这里就不拿它来做代表,也没有什么人用。

通过javascript-obfuscator混淆后生成的代码

var _0xd6ac=['[41m%s[0m','logG','log'];(function(_0x203a66,_0x6dd4f4){var _0x3c5c81=function(_0x4f427c){while(--_0x4f427c){_0x203a66['push'](_0x203a66['shift']());}};_0x3c5c81(++_0x6dd4f4);}(_0xd6ac,0x6e));var _0x5b26=function(_0x2d8f05,_0x4b81bb){_0x2d8f05=_0x2d8f05-0x0;var _0x4d74cb=_0xd6ac[_0x2d8f05];return _0x4d74cb;};function logG(_0x4f1daa){console[_0x5b26('0x0')]('[32m%s[0m',_0x4f1daa);}function logR(_0x38b325){console[_0x5b26('0x0')](_0x5b26('0x1'),_0x38b325);}logG('logR');logR(_0x5b26('0x2'));

再beautifier一下:

var _0xd6ac = ['[41m%s[0m', 'logG', 'log'];
(function(_0x203a66, _0x6dd4f4) {
 var _0x3c5c81 = function(_0x4f427c) {
 while (--_0x4f427c) {
 _0x203a66['push'](_0x203a66['shift']());
 }
 };
 _0x3c5c81(++_0x6dd4f4);
}(_0xd6ac, 0x6e));
var _0x5b26 = function(_0x2d8f05, _0x4b81bb) {
 _0x2d8f05 = _0x2d8f05 - 0x0;
 var _0x4d74cb = _0xd6ac[_0x2d8f05];
 return _0x4d74cb;
};

function logG(_0x4f1daa) {
 console[_0x5b26('0x0')]('[32m%s[0m', _0x4f1daa);
}

function logR(_0x38b325) {
 console[_0x5b26('0x0')](_0x5b26('0x1'), _0x38b325);
}
logG('logR');
logR(_0x5b26('0x2'));

这个复杂得多,但是分析一下你会发现,其实多了一个字典,所有方法变量,都有可能存在字典中,调用时先调用字典还原方法名变量再执行。
其实入口都是变量的规则。

字典函数:

var _0xd6ac = ['[41m%s[0m', 'logG', 'log'];
(function(_0x203a66, _0x6dd4f4) {
 var _0x3c5c81 = function(_0x4f427c) {
 while (--_0x4f427c) {
 _0x203a66['push'](_0x203a66['shift']());
 }
 };
 _0x3c5c81(++_0x6dd4f4);
}(_0xd6ac, 0x6e));
var _0x5b26 = function(_0x2d8f05, _0x4b81bb) {
 _0x2d8f05 = _0x2d8f05 - 0x0;
 var _0x4d74cb = _0xd6ac[_0x2d8f05];
 return _0x4d74cb;
};

通过以上发现,我们可以把JS混淆归结为三类,分别是 eval类型,hash类型,压缩类型。而压缩类型,是目前前端性能优化的常用工具,以uglify为代表。

常用的前端压缩优化工具:

JavaScript:

  • babel-minify
  • terser
  • uglify-js
  • uglify-es
  • Google Closure Compiler
  • YUI Compressor
  • CSS:

  • PostCSS
  • clean-css
  • CSSO
  • YUI Compressor
  • HTML:

  • html-minifier
  • 从工具流(workflow) 来看,不论是 webpack 还是 gulp ,目前javascript最流行工具还是uglify。

    相应的解混淆工具:

  • eval对应的解混淆工具, 随便百度都可以搜索到,如jspacker
  • JSA对应的解混淆工具unjsa
  • javascript-obfuscator对应的解混淆工具crack.js
  • 压缩类型uglify对应的工具UnuglifyJS,在线版jsnice
  • 解混淆策略其实是依据生成代码规律编写,不外乎观察特征分析,再观察特征分析,不断调整。都是手办眼见功夫。

    都没有什么难度可言,有的就是耐性。比如javascript-obfuscator对应的解混淆工具可以
    分解为N因子问题:

    如何查询function的作用域?
    预执行变量替换可能存在类型?
    ...

    如:

    var _0xd6ac = ['[41m%s[0m', 'logG', 'log'];
    (function(_0x203a66, _0x6dd4f4) {
     var _0x3c5c81 = function(_0x4f427c) {
     while (--_0x4f427c) {
     _0x203a66['push'](_0x203a66['shift']());
     }
     };
     _0x3c5c81(++_0x6dd4f4);
    }(_0xd6ac, 0x6e));
    var _0x5b26 = function(_0x2d8f05, _0x4b81bb) {
     _0x2d8f05 = _0x2d8f05 - 0x0;
     var _0x4d74cb = _0xd6ac[_0x2d8f05];
     return _0x4d74cb;
    };
    
    function logG(_0x4f1daa) {
     console[_0x5b26('0x0')]('[32m%s[0m', _0x4f1daa);
    }
    
    function logR(_0x38b325) {
     console[_0x5b26('0x0')](_0x5b26('0x1'), _0x38b325);
    }
    logG('logR');
    logR(_0x5b26('0x2'));

    要还原成

    function logG(message) {
     console.log('x1b[32m%sx1b[0m', message); 
    }
    function logR(message) {
     console.log('x1b[41m%sx1b[0m', message); 
    }
    logG('logR');
    logR('logG');

    第一步你总得知道字典函数,然后执行字典函数 _0x5b26('0x0') 还原成 log.

    那么就好办了,写代码的事。
    如 https://github.com/jscck/crac...

    还原后,如何重构代码,那么你还得知道代码生成之前是通过什么工具打包的webpack? 还是?

    如webpack 的各种封装头和尾
    https://webpack.js.org/config...

    (function webpackUniversalModuleDefinition(root, factory) {
     if(typeof exports === 'object' && typeof module === 'object')
     module.exports = factory();
     else if(typeof define === 'function' && define.amd)
     define([], factory);
     else if(typeof exports === 'object')
     exports['MyLibrary'] = factory();
     else
     root['MyLibrary'] = factory();
    })(typeof self !== 'undefined' ? self : this, function() {
     return _entry_return_;
    });

    假如再深入一点,可能会涉及到JS语法解释器, AST抽象语法树

    目前涉及到 JS语法解释器, AST抽象语法树的功能如下:

    prepack, esprima, babel

    或者可以阅读《编程语言实现模式》,涉及到 antlr4。

    当然也可以通过esprima等工具来做解混淆,只是工作量大一点,值不值的问题。

    对于未来,JS商业源码加密的方向可能webassembly,先在服务端编译成wasm,源码就能真正的闭源。

    有人的地方就有路,有混淆的地方就有解混淆,目前机器学习编程响应的解混淆工具也做的相当出色,比如

    <img src="https://www.sri.inf.ethz.ch/assets/images/sri-logo.svg" alt="Secure, Reliable, and Intelligent Systems Lab" width="136" >

    Machine Learning for Programming 产品
    nice2predict,jsnice ...
    查看 https://www.sri.inf.ethz.ch/r...

    拓展参考

    AST抽象语法树

    为什么额外说一下AST抽象语法树,因为你可以 input-> ast -> output Anything。

    比如你jsx转换小程序模版语法,这样你就可以用react语法来写小程序,如Taro。
    mpvue, wepy, postcss …… 这些都是通过AST进行构建转换的工具,es6 -> es5, babel 都是使用AST。

    AST抽象语法树大致流程:

    Input 生成 AST tree

    然后通过AST类型断言进行相应的转换

    【相关推荐:JavaScript视频教程】

    热心网友 时间:2022-04-22 12:02

    js反混淆需要借助第三方工具:
    1、在百度搜索js混淆还原
    2、把要还原的代码放在第一个文本框,点击js解混淆就可以了。
    结果在下面显示

    热心网友 时间:2022-04-22 13:20

    所谓的代码混淆,使用是没有的任何区别的,只不过混淆之后的代码,经过了压缩处理,加入了一些扰码的因素,使是看起来比较复杂,但是对于使用是没有任何区别的。
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 支付宝姓名 是不是绑定的银行卡真实姓名?还是支付宝上编的昵称? 支付宝姓名是昵称吗 别人让我把支付宝姓名给她是给支付宝昵称还是真实姓名,急急急!!! 支付宝转账显示的收款人信息是其真实姓名还是支付宝昵称 别人支付宝转钱给我需要支付宝姓名那姓名是说昵称还是真实姓名 如何取消NTFS的压缩内容以便节省空间? 压缩包文件右键怎么去除全部解压缩的选项? boot怎么取消c盘压缩 电脑一直在压缩文件怎么取消 硬盘分区,启用文件和文件夹压缩怎么取消 怎么取消电脑磁盘的压缩 怎样解除压缩文件 文件被压缩怎么取消? 实拍猫屎咖啡生产过程,世界上最贵的咖啡是怎么来的 如何解除压缩文件 我想在QQ极速版上注册新用户,给手机发送短信时去这样,是没有发送成功吗? 延吉哪有好吃的油泼面 Christina Aguilera - Not Myself Tonight 这首曲是属于那仲风格的音乐 QQ极速版忘密码了怎么办? 谁知道这些神的名字? java 混淆压缩css js 有什么作用 js 混淆干扰还原 混淆过的js代码如何还原? npm安装完uglifyjs怎么对js代码进行混淆 浏览器怎么识别混淆压缩后的js代码 是否有必要把js压缩混淆维护成本 怎么使用yuicompressor2.4.2.jar进行js,CSS进行代码混淆 在JavaScript 开发中怎样做代码混淆? UglifyJS怎么混淆js 怎样还原被混淆的JavaScript代码 火狐有没有JS 反混淆,反压缩的工具 如何debug已被混淆成一行的JS代码 百度是怎样对javascript进行混淆和加密的? 关于法律毕业找工作的 放过进水手机的小米有毒吗? 小米没熟吃了会中毒吗 刚买的小米想熬稀饭,发现小米发黑吃了是否有害 大家说小米是不是有毒 小米手机容易中毒的吗? 我把小米装在洗衣液空瓶子里有毒吗?