JavaScript 混淆技术

1. 简介

压缩、混淆、加密技术简述如下

  • 代码压缩:即去除JavaScript 代码中的不必要的空格、换行等内容,使源码都压缩为几行内容,降低代码可读性,当然同时也能提高网站的加载速度。
  • 代码混淆:使用变量替换、字符串阵列化、控制流平坦化、多态变异、僵尸函数、调试保护等手段,使代码变得难以阅读和分析,达到最终保护的目的。但这不影响代码原有功能。是理想、实用的JavaScript保护方案
  • 代码加密:可以通过某种手段将 JavaScript 代码进行加密,转成人无法阅读或者解析的代码,如将代码完全抽象化加密,如 eval 加密。另外还有更强大的加密技术,可以直接将 JavaScript 代码用 C/C++ 实现,JavaScript 调用其编译后形成的文件来执行相应的功能,如Emscripten 还有 WebAssembly

JavaScript 混淆技术主要有以下几种:

  • 变量混淆 将带有含意的变量名、方法名、常量名随机变为无意义的类乱码字符串,降低代码可读性,如转成单个字符或十六进制字符串。
  • 字符串混淆 将字符串阵列化集中放置、并可进行 MD5 或 Base64 加密存储,使代码中不出现明文字符串,这样可以避免使用全局搜索字符串的方式定位到入口点。
  • 属性加密 针对 JavaScript 对象的属性进行加密转化,隐藏代码之间的调用关系。
  • 控制流平坦化 打乱函数原有代码执行流程及函数调用关系,使代码逻变得混乱无序。
  • 僵尸代码 随机在代码中插入无用的僵尸代码、僵尸函数,进一步使代码混乱。
  • 调试保护 基于调试器特性,对当前运行环境进行检验,加入一些强制调试 debugger 语句,使其在调试模式下难以顺利执行 JavaScript 代码。
  • 多态变异 使 JavaScript 代码每次被调用时,将代码自身即立刻自动发生变异,变化为与之前完全不同的代码,即功能完全不变,只是代码形式变异,以此杜绝代码被动态分析调试。
  • 锁定域名 使 JavaScript 代码只能在指定域名下执行。
  • 反格式化 如果对 JavaScript 代码进行格式化,则无法执行,导致浏览器假死。
  • 特殊编码 将 JavaScript 完全编码为人不可读的代码,如表情符号、特殊表示内容等等。

2. ob混淆

官网JavaScript Obfuscator Tool

简介:混淆技术中的一种。

特征

  • 一般由一个大数组或者含有大数组的函数、一个自执行函数、解密函数和加密后的函数四部分组成;
  • 函数名和变量名通常以 _0x 或者 0x 开头,后接 1~6 位数字或字母组合;
  • 自执行函数,进行移位操作,有明显的 push、shift 关键字;
function _0x22d0(_0xe6a28f, _0x274cc4) {
    var _0x1bfe9e = _0x1bfe();
    return _0x22d0 = function (_0x22d0c3, _0x443dc0) {
        _0x22d0c3 = _0x22d0c3 - 0x1bf;
        var _0x41d814 = _0x1bfe9e[_0x22d0c3];
        return _0x41d814;
    }, _0x22d0(_0xe6a28f, _0x274cc4);
}

function _0x1bfe() {
    var _0x27621d = ['445AaZSya', '24XVavDe', '1583370iNyweW', '577072vIguEw', '45100EQwcyz', 'log', '2789658gRbvxx', '14100eFOLIU', '115866VdgcXh', '11rtyPOE', '42rnEKnn', '622770KTyCeF'];
    _0x1bfe = function () {
        return _0x27621d;
    };
    return _0x1bfe();
}

(function (_0x59905f, _0x12738b) {
    var _0x4e783f = _0x22d0, _0x3412fd = _0x59905f();
    while (!![]) {
        try {
            var _0x5eba10 = parseInt(_0x4e783f(0x1bf)) / 0x1 + -parseInt(_0x4e783f(0x1ca)) / 0x2 + parseInt(_0x4e783f(0x1c1)) / 0x3 + parseInt(_0x4e783f(0x1c2)) / 0x4 * (parseInt(_0x4e783f(0x1c7)) / 0x5) + parseInt(_0x4e783f(0x1c3)) / 0x6 * (parseInt(_0x4e783f(0x1c5)) / 0x7) + -parseInt(_0x4e783f(0x1c8)) / 0x8 * (parseInt(_0x4e783f(0x1c9)) / 0x9) + parseInt(_0x4e783f(0x1c6)) / 0xa * (-parseInt(_0x4e783f(0x1c4)) / 0xb);
            if (_0x5eba10 === _0x12738b) break; else _0x3412fd['push'](_0x3412fd['shift']());
        } catch (_0x44a704) {
            _0x3412fd['push'](_0x3412fd['shift']());
        }
    }
}(_0x1bfe, 0x80696));

function hi() {
    var _0x154ba0 = _0x22d0;
    console[_0x154ba0(0x1c0)]('Hello\x20World!');
}

hi();

例如在上面的例子中,_0x1bfe() 方法就定义了一个大数组,自执行函数里有 push、shift 关键字,主要是对大数组进行移位操作,_0x22d0() 就是解密函数,hi() 就是加密后的函数。

3. 使用ob混淆

npm install javascript-obfuscator -save

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇