Javascript混淆与解混淆的详细介绍(附代码)


本文摘自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比较 及其使用场景

更多相关阅读请进入《混淆代码》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...