本文摘自PHP中文网,作者不言,侵删。
本篇文章给大家带来的内容是关于Javascript混淆与解混淆的详细介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。像软件加密与解密一样,javascript的混淆与解混淆同属于同一个范畴。道高一尺,魔高一丈。没有永恒的黑,也没有永恒的白。一切都是资本市场驱动行为,现在都流行你能为人解决什么问题,这个概念。那么市场究竟能容纳多少个能解决这种问题的利益者。JS没有秘密。
其实本人不赞成javascript进行hash混淆处理,一拖慢运行时速度,二体积大。JS代码前端可获取,天生赋予“开源”属性,都可以在chrome devTools下查看。JS非压缩性混淆完全违法前端优化准则。
目前网络上可以搜索的JS混淆工具不外乎以下几种:
eval混淆,也是最早JS出现的混淆加密,据说第一天就被破解,修改一下代码,alert一下就可以破解了。这种方法从出生的那天就失去了意义。其实JS加密(混淆)是相对于可读性而言的,其实真正有意义的就是压缩型混淆uglify这一类,即可减少体重,也可减少可读性。
但是,也不能排除部分商业源代码使用hash类型混淆源代码,比如 miniui 使用的JSA加密, fundebug使用的javascript-obfuscator。
下面通过代码来说明 JSA加密 和 javascript-obfuscator 的区别:
要混淆的代码:
1 2 3 4 5 6 7 8 | function logG(message) {
console.log( '\x1b[32m%s\x1b[0m' , message);
}
function logR(message) {
console.log( '\x1b[41m%s\x1b[0m' , message);
}
logG( 'logR' );
logR( 'logG' );
|
通过JSA加密混淆后生成的代码
1 | function o00($){console.log( "\x1b[32m%s\x1b[0m" ,$)} function o01($){console.log( "\x1b[41m%s\x1b[0m" ,$)}o00( "logR" );o01( "logG" )
|
然后再beautifier一下:
1 2 3 4 5 6 7 8 9 | function o00($) {
console.log( "\x1b[32m%s\x1b[0m" , $)
}
function o01($) {
console.log( "\x1b[41m%s\x1b[0m" , $)
}
o00( "logR" );
o01( "logG" )
|
可以发现,其实没有做什么什么修改,只是做了一些变量替换。想还原也比较简单的。这里就不拿它来做代表,也没有什么人用。
通过javascript-obfuscator混淆后生成的代码
1 | 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一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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' ));
|
这个复杂得多,但是分析一下你会发现,其实多了一个字典,所有方法变量,都有可能存在字典中,调用时先调用字典还原方法名变量再执行。
其实入口都是变量的规则。
阅读剩余部分
相关阅读 >>
javascript search()方法怎么用
浅谈javascript中工厂函数和构造函数
使用rxjs管理react应用状态的介绍
iview组件事件额外传递参数的代码示例
javascript如何获取修改value
javascript如何实现将两个数组合并
javascript窗口如何关闭
javascript怎么实现鼠标追随
怎么判断是否加载了jquery?
javascript与webassembly比较 及其使用场景
更多相关阅读请进入《混淆代码》频道 >>
人民邮电出版社
本书对 Vue.js 3 技术细节的分析非常可靠,对于需要深入理解 Vue.js 3 的用户会有很大的帮助。——尤雨溪,Vue.js作者
转载请注明出处:木庄网络博客 » Javascript混淆与解混淆的详细介绍(附代码)