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

javascript混淆解码

发布网友 发布时间:2022-05-06 15:01

我来回答

2个回答

懂视网 时间:2022-05-14 15:51

本篇文章给大家带来的内容是关于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-05-14 12:59

    js反混淆需要借助第三方工具:
    1、在百度搜索js混淆还原

    2、把要还原的代码放在第一个文本框,点击js解混淆就可以了。
    结果在下面显示
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    怎么鉴别匡威真假鉴别鉴别匡威真假的方法与技巧 洛阳小碗汤怎么做 酥肉丸子汤如何烹饪简单而又不失美味? 直通车产出比多少不亏?产出比低怎么调整? 淘宝直通车投产比多少才是盈利?怎么提升? 车打不着拧钥匙没反应 车打火的钥匙拧不动 微信关闭时后台还在图标上还有个小锁什么意思 坦克世界闪击战电脑需求配置玩坦克世界电脑配置要达到什么标准_百度... 坦克世界对电脑配置要求高不高玩坦克世界电脑需要什么配置要求 坦克世界对电脑的配置要求是多少坦克世界配置要求 javascript里图片的absolute和relactive是怎么解释的好容易混淆,_百度... 背影中令你感动的句子评论至少5句 背影的好的开头和结尾有哪些? 汉字笔画顺序查询郑 汉字笔画顺序什么字典可以查? 新华字典查不到汉字笔画顺序怎么办 美瞳可以把散光度数加在近视度数上吗 美瞳引起的近视眼 可以恢复吗 带着无度数美瞳,还可以带近视眼镜么? 美瞳附带的近视度数怎么算? 我今天在医院,配了一副美瞳加近视的*眼镜,是卫康的,他收了我1380,这种眼镜会不会对眼睛有伤害 戴美瞳会加深近视度吗 美瞳度数低了会加度近视 带美瞳还能不能带近视眼镜 戴有度数的美瞳会增加近视度数吗 带美瞳能矫正近视,是真的吗? 配戴美瞳会加深近视度数吗? 戴美瞳再戴近视镜,会伤害视力吗? 1.008的250次方是多少? 一天赚1%,半年能赚多少,一年能赚多少? 谁有计算器,帮我个忙, 10000乘以(1+0.01)的250次方 结果是多少,谢了;-) 如何快速轻松学习JavaScript 不属于word软件功能的是a制作表格b编辑文档c提高CPU的速度d文件打印 word2003中不包括 ___ 功能 A编辑 B排版 C打印 D编译 javascript的写法 维修长宏液晶电视多少钱? 万年历查询买新车黄道吉日 苹果11兼容性设置在哪? 我们大微星该用什么杀毒软件 我用好压软件删了文件,怎样恢复 微星有自带的系统还原软件吗 2345好压压缩后怎么恢复原状 我不小心在好压中把压缩文件夹中的文件删除了,怎么恢复? 游戏王中FGD五帝龙在哪一集出来的啊 2345好压怎么修复压缩文件 2345好压修复 游戏王电视中的五帝龙在那一集中出现的 2345好压中的文件被更新了怎么恢复 游戏王中对黑暗大邪神的是第几集?光之创造神是在哪集出现? 成之内和天才少年对决是哪一集??? 游戏王5DS一共多少集啊,我看到137集 怎样在QQ添加外国网友?