这些javascript混淆器如何生成实际的工作代码?

时间:2012-01-16 17:40:12

标签: javascript obfuscation reverse-engineering

this onethis one,它们都会生成完全无法读取的代码,其中一个比另一个更可爱。

现在,我不是Javascript的专家,但我没看到如何

゚ω゚ノ= /`m´)ノ ~┻━┻   //*´∇`*/ ['_']; o=(゚ー゚)  =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c^_^o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) - (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (o^_^o)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o^_^o) +(o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o^_^o) - (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');

$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$._$_+$._$$+$.__+$.$_$_+$.$$__+"\\"+$.__$+$.$_$+$._$$+"\\"+$.__$+$.__$+$.$$$+"\\"+$.__$+$.$$_+$.$$_+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.$$$$+(![]+"")[$._$_]+$._$+"\\"+$.__$+$.$$_+$.$$$+"\\\")"+"\"")())();

是按预期执行的实际有效javascript。说真的,运行它们。他们都是alert("StackOverflow")。我可以理解混淆一些逻辑或字符串混淆,但是没有可见的控制语句。这个混淆器是否以The Language Which Shall Not Be Named的风格吸引了一些魔法?我很满意我的代码看起来也很开心,但我完全不理解它背后的魔力。

我尝试过浏览这两个页面的源代码,但它们对我来说和它们生成的代码一样令人困惑。

这是如何运作的?

4 个答案:

答案 0 :(得分:28)

真有趣!这是我的目标。基本上这里发生的是一堆数字和字符串被分配给变量。这些变量被连接起来形成一个编码的字符串。该编码字符串被解码以形成JavaScript代码串。该代码被设置为函数体,然后执行。

让我们一行一行:

第1行:

゚ω゚ノ = /`m´)ノ ~┻━┻   //*´∇`*/['_'];

゚ω゚ノ - 全局变量
/`m´)ノ ~┻━┻ / - 正则表达式
/*´∇`*/ - 多行评论
['_'] - 获取正则表达式的属性_

由于RegExp没有_属性,变量゚ω゚ノ包含值undefined

第2行:

o = (゚ー゚) = _ = 3;

定义变量o゚ー゚_,并将每个值设置为3

第3行:

c = (゚Θ゚) = (゚ー゚) - (゚ー゚);

定义变量c゚Θ゚并将其值设置为0。 (゚ー゚3,因此(゚ー゚) - (゚ー゚)゚ー゚ - ゚ー゚相同,与3 - 3相同。现在c゚Θ゚两者都包含1;

第4行:

(゚Д゚) = (゚Θ゚) = (o ^ _ ^ o) / (o ^ _ ^ o);

定义变量゚Д゚并重新定义变量゚Θ゚^o_3都是o ^ _ ^ o3 ^ 3 ^ 33 ^ 3相同 03 ^ 033 / 3 然后1゚Д゚ ゚Θ゚1现在都包含(゚Д゚) = { ゚Θ゚: '_', ゚ω゚ノ: ((゚ω゚ノ == 3) + '_')[゚Θ゚], ゚ー゚ノ: (゚ω゚ノ + '_')[o ^ _ ^ o - (゚Θ゚)], ゚Д゚ノ: ((゚ー゚ == 3) + '_')[゚ー゚] };

第5行:

(゚Д゚) = {
    ゚Θ゚: '_',
    ゚ω゚ノ: ((゚ω゚ノ == 3) + '_')[゚Θ゚],
    ゚ー゚ノ: (゚ω゚ノ + '_')[o ^ _ ^ o - (゚Θ゚)],
    ゚Д゚ノ: ((゚ー゚ == 3) + '_')[゚ー゚]
};

使用换行符和缩进:

゚Д゚

゚Θ゚重新定义为对象文字,其中包含属性゚ω゚ノ゚ー゚ノ゚Д゚ノ゚Д゚.゚Θ゚
゚Д゚.゚ω゚ノ是“_” ((undefined == 3) + "_")[1]"false_"[1]"a"゚Д゚.゚ー゚ノ (undefined + "_")[3 ^ 3 ^ 3 - 1]"undefined_"[2]"d"゚Д゚.゚Д゚ノ ((3 == 3) + "_")[3]"true_"[3]"u"(゚Д゚)[゚Θ゚] = ((゚ω゚ノ == 3) + '_')[c ^ _ ^ o];

第6行:

゚Д゚.゚Θ゚ = ((undefined == 3) + "_")[1 ^ 3 ^ 3];

与:

相同
゚Д゚.゚Θ゚ = "false_"[1];

与以下内容相同:

゚Д゚.゚Θ゚

所以"a"(゚Д゚)['_']((゚Д゚)['_'](゚ε゚ + (゚Д゚)[゚o゚] + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + (゚Θ゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + ((゚ー゚) + (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (゚ー゚) + (゚Д゚)[゚ε゚] + ((゚ー゚) + (゚Θ゚)) + (c ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚ー゚) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚Θ゚) + (c ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + ((゚ー゚) + (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + ((゚ー゚) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + ((゚ー゚) + (゚Θ゚)) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚ー゚) + (c ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚Θ゚) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + (゚Θ゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + (゚Θ゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) - (゚Θ゚)) + (o ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + (o ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + (゚Θ゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (c ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚ー゚) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + ((゚ー゚) + (゚Θ゚)) + (゚Θ゚) + (゚Д゚)[゚o゚])(゚Θ゚))('_');

第7 - 16行:

所以它继续,为变量和对象属性分配字符串和数字。直到最后一行:

第17行:

゚ω゚ノ    // undefined
o       // 3
゚ー゚     // 4
_       // 3
c       // 0
゚Θ゚     // 1
゚Д゚     /* {
            "1": "f",
            ゚Θ゚: "_",
            ゚ω゚ノ: "a",
            ゚ー゚ノ: "d",
            ゚Д゚ノ: "e",
            c: "c",
            o: "o",
            return: "\\",
            ゚Θ゚ノ: "b",
            constructor: "\"",
            _: Function
        } */
゚o゚     // "constructor"
゚ε゚     // "return"
o゚ー゚o   // "u"

此时,我们有以下变量:

゚Д゚['_'](
    ゚Д゚['_'](
        ゚ε゚ + 
        ゚Д゚[゚o゚] + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        ゚ー゚ + 
        ゚Θ゚ + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        (゚ー゚ + ゚Θ゚) + 
        ゚ー゚ + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        ゚ー゚ + 
        (゚ー゚ + ゚Θ゚) + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        ((o ^ _ ^ o) + (o ^ _ ^ o)) + 
        ((o ^ _ ^ o) - ゚Θ゚) + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        ((o ^ _ ^ o) + (o ^ _ ^ o)) + 
        ゚ー゚ + 
        ゚Д゚[゚ε゚] + 
        (゚ー゚ + ゚Θ゚) + 
        (c ^ _ ^ o) + 
        ゚Д゚[゚ε゚] + 
        ゚ー゚ + 
        ((o ^ _ ^ o) - ゚Θ゚) + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        ゚Θ゚ + 
        (c ^ _ ^ o) + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        ゚ー゚ + 
        (゚ー゚ + ゚Θ゚) + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        (゚ー゚ + ゚Θ゚) + 
        ゚ー゚ + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        (゚ー゚ + ゚Θ゚) + 
        ゚ー゚ + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        (゚ー゚ + ゚Θ゚) + 
        (゚ー゚ + (o ^ _ ^ o)) + 
        ゚Д゚[゚ε゚] + 
        (゚ー゚ + ゚Θ゚) + 
        ゚ー゚ + 
        ゚Д゚[゚ε゚] + 
        ゚ー゚ + 
        (c ^ _ ^ o) + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        ゚Θ゚ + 
        ((o ^ _ ^ o) - ゚Θ゚) + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        ゚ー゚ + 
        ゚Θ゚ + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        ((o ^ _ ^ o) + (o ^ _ ^ o)) + 
        ((o ^ _ ^ o) + (o ^ _ ^ o)) + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        ゚ー゚ + 
        ゚Θ゚ + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        ((o ^ _ ^ o) - ゚Θ゚) + 
        (o ^ _ ^ o) + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        ゚ー゚ + 
        (o ^ _ ^ o) + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        ((o ^ _ ^ o) + (o ^ _ ^ o)) + 
        ((o ^ _ ^ o) - ゚Θ゚) + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        (゚ー゚ + ゚Θ゚) + 
        ゚Θ゚ + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        ((o ^ _ ^ o) + (o ^ _ ^ o)) + 
        (c ^ _ ^ o) + 
        ゚Д゚[゚ε゚] + 
        ゚Θ゚ + 
        ((o ^ _ ^ o) + (o ^ _ ^ o)) + 
        ゚ー゚ + 
        ゚Д゚[゚ε゚] + 
        ゚ー゚ + 
        ((o ^ _ ^ o) - ゚Θ゚) + 
        ゚Д゚[゚ε゚] + 
        (゚ー゚ + ゚Θ゚) + 
        ゚Θ゚ + 
        ゚Д゚[゚o゚]
    )(゚Θ゚)
)("_");

该行主要是一个大字符串连接。通过删除不必要的括号并添加换行符,我们可以使略微更具可读性:

return"\141\154\145\162\164\50\42\110\145\154\154\157\54\40\112\141\166\141\123\143\162\151\160\164\42\51"

该连接字符串的值为:

Function(Function("return\"\\141\\154\\145\\162\\164\\50\\42\\110\\145\\154\\154\\157\\54\\40\\112\\141\\166\\141\\123\\143\\162\\151\\160\\164\\42\\51\"")(1))("_")

因此,用文字替换所有变量,我们最终得到以下JavaScript,这些JavaScript在最后一行执行:

Function

断开该行,在中间我们看到连接的字符串被传递给Function("return\"\\141\\154\\145\\162\\164\\50\\42\\110\\145\\154\\154\\157\\54\\40\\112\\141\\166\\141\\123\\143\\162\\151\\160\\164\\42\\51\"") 构造函数,使字符串成为函数体:

Function

因此,该字符串被评估为JavaScript,function () { return"\141\154\145\162\164\50\42\110\145\154\154\157\54\40\112\141\166\141\123\143\162\151\160\164\42\51"; } 构造函数返回此函数:

Function("return\"\\141\\154\\145\\...\\51\"")(1)

该功能立即执行:

alert("Hello, JavaScript")

并返回字符串:

Function
嘿,看起来像JavaScript!但现在还没有。这只是一个字符串。但是该字符串被传递给另一个Function("alert(\"Hello, JavaScript\")") 构造函数,为我们提供了一个以JavaScript形式执行字符串的函数:

function () {
    alert("Hello, JavaScript");
}

这与:

相同
Function("alert(\"Hello, JavaScript\")")("_")

该功能立即执行:

{{1}}

我们最终调用了未经模糊处理的代码。

答案 1 :(得分:23)

随着我的javascript一天出现,一行一行地分解。注意我使用alert("Hello")

生成了我的
$ = ~[];   // var $ = -1
$ = 
    {
    ___ : ++$,              // ++(-1) == 0
    $$$$:(![]+"")[$],       // ![] == false, false + "" == "false", "false"[0] == "f"
    __$:++$,                // ++(0) == 1    
    $_$_:(![]+"")[$],       // ![] == false, false + "" == "false", "false"[1] == "a"
    _$_:++$,                // ++(1) == 2
    $_$$:({}+"")[$],        // {} + "" == "[object Object]", "[object Object]"[2] == "b"
    $$_$:($[$]+"")[$],      // 2[2] == undefined + "" == "undefined", "undefined"[2] == "d"
    _$$:++$,                // ++(2) == 3
    $$$_:(!""+"")[$],       // !"" == true + "" == "true", "true"[3] == "e"
    $__:++$,                // ++(3) == 4
    $_$:++$,                // ++(4) == 5
    $$__:({}+"")[$],        // ({} + "") == [object Object]", "[object Object]"[5] == "c"
    $$_:++$,                // ++(5) == 6
    $$$:++$,                // ++(6) == 7
    $___:++$,               // ++(7) == 8
    $__$:++$                // ++(8) == 9
};

$.$_ = 
    ($.$_=$+"")[$.$_$] +        // "[object Object]"[5] == "c" +  (also $.$_ = "[object Object]")
    ($._$=$.$_[$.__$]) +        // "[object Object]"[1] == "o" + (also $._$ = "o")
    ($.$$=($.$+"")[$.__$]) +    // $.$+"" == "undefined", "undefined"[1] == "n" + (also $.$$ = "n")
    ((!$)+"")[$._$$] +          // !$ == false, false+"" == "false", "false"[3] == "s" +
    ($.__=$.$_[$.$$_]) +        // "[object Object]"[6] == "t" (also $.__ = "t") +
    ($.$=(!""+"")[$.__$]) +     // !"" == true, true + "" == "true", "true"[2] == "r" +(also $.$="r")
    ($._=(!""+"")[$._$_]) +     // !"" == true, true + "" == "true", "true"[3] == "u" +(also $._="u")
    $.$_[$.$_$] +               // "[object Object]"[5] == "c" +
    $.__ +                      // "t" +
    $._$ +                      // "o" +
    $.$;                        // "r"

// $.$_ = "constructor"

$.$$ = 
    $.$ +                       // "r" +
    (!""+"")[$._$$] +           // "true"[3] == "e" +
    $.__ +                      // "t" +
    $._  +                      // "u" +
    $.$ +                       // "r" +
    $.$$;                       // "n" 
// $.$$ = "return"

$.$ = ($.___)[$.$_][$.$_];      // (0)["constructor"]["constructor"]
// $.$ = Function

// This is the part that changes when you change the input string.

$.$(                            // Function( 
    $.$(                        // Function (
        $.$$ +                  // "return"+
        "\""+                   // '"' +
        $.$_$_ +                // "a" + 
        (![]+"")[$._$_]+        // "l" + 
        $.$$$_+                 // "e" + 
        "\\"+                   // "\" +            
        $.__$+                  // "1" + 
        $.$$_+                  // "6" + 
        $._$_+                  // "2" +   (note '\162' = 'r')   
        $.__+                   // "t" + 
        "(\\\"\\"+              // '(\"\' +    
        $.__$+                  // 1 + 
        $.__$+                  // 1 + 
        $.___+                  // 0 +     (note '\110' = 'H')    
        $.$$$_+                 // e + 
        (![]+"")[$._$_]+        // "false"[2] == "l", "l" + 
        (![]+"")[$._$_]+        // "false"[2] == "l", "l" + 
        $._$+                   // "o" + 
        "\\\")"+                // '\")' +
        "\""                    // '"''
    )()                         // invoke
)();                            // invoke

我不是很多,它会创建一个字符串,然后调用它。

编辑 - 我没有时间解码其他版本,但我想它做了类似的事情,但是使用非拉丁字符。

答案 2 :(得分:12)

在控制台中输入$(运行代码后),然后展开对象。然后,您可以更轻松地分析它。

enter image description here

他们使用偷偷摸摸的方法抓取足够的单词/字符,并在$对象中引用它们,然后使用它们来构建程序并eval可能在Function(...)()调用中。

所以它应该归结为......

Function('alert("StackOverflow")')();

......或类似的东西。


开始放松它,......

$=~[];  // -1

$={
  0:++$,         //  0
  f:(![]+"")[$], // "f", (![]+"") is "false", and [$] gives index 0, or "f"
  1:++$,         //  1
  a:(![]+"")[$], // "a", (![]+"") is "false", and [$] gives index 1, or "a"
  2:++$,         //  2
  b:({}+"")[$],  // "b", ({}+"") is "[object Object]", and [$] gives index 2, or "b"
  d:($[$]+"")[$],// "d", ($[$]+"") is "undefined", and [$] gives index 2, or "d"
  3:++$,         //  3
  e:(!""+"")[$], // "e", (!""+"") is "true", and [$] gives index 3, or "e"
  4:++$,         //  4
  5:++$,         //  5
  c:({}+"")[$],  // "c", ({}+"") is "[object Object]", and [$] gives index 5, or "c"
  6:++$,         //  6
  7:++$,         //  7
  8:++$,         //  8
  9:++$          //  9
};

$.constructor=($.constructor=$+"")[$[5]]+($.o=$.constructor[$[1]])+($.return=($.$+"")[$[1]])+((!$)+"")[$[3]]+($.t=$.constructor[$[6]])+($.$=(!""+"")[$[1]])+($.u=(!""+"")[$[2]])+$.constructor[$[5]]+$.t+$.o+$.$;
$.return=$.$+(!""+"")[$[3]]+$.t+$.u+$.$+$.return;
$.$=($[0])[$.constructor][$.constructor];
$.$($.$($.return+"\""+$.a+(![]+"")[$[2]]+$.e+"\\"+$[1]+$[6]+$[2]+$.t+"(\\\"\\"+$[1]+$[2]+$[3]+$.t+$.a+$.c+"\\"+$[1]+$[5]+$[3]+"\\"+$[1]+$[1]+$[7]+"\\"+$[1]+$[6]+$[6]+$.e+"\\"+$[1]+$[6]+$[2]+$.f+(![]+"")[$[2]]+$.o+"\\"+$[1]+$[6]+$[7]+"\\\")"+"\"")())();

则...

$.constructor=($.constructor=$+"")[5]+($.o=$.constructor[1])+($.return=($.$+"")[1])+((!$)+"")[3]+($.t=$.constructor[6])+($.$=(!""+"")[1])+($.u=(!""+"")[2])+$.constructor[5]+$.t+$.o+$.$;
$.return=$.$+(!""+"")[3]+$.t+$.u+$.$+$.return;
$.$=(0)[$.constructor][$.constructor];
$.$($.$($.return+"\""+$.a+(![]+"")[2]+$.e+"\\"+$[1]+$[6]+$[2]+$.t+"(\\\"\\"+$[1]+$[2]+$[3]+$.t+$.a+$.c+"\\"+$[1]+$[5]+$[3]+"\\"+$[1]+$[1]+$[7]+"\\"+$[1]+$[6]+$[6]+$.e+"\\"+$[1]+$[6]+$[2]+$.f+(![]+"")[2]+$.o+"\\"+$[1]+$[6]+$[7]+"\\\")"+"\"")())();

......呃,失去兴趣。

答案 3 :(得分:9)

由于其他每个答案都只是对您提供的代码的分析,因此我将扩展您自己如何生成这些代码(无需工具)。我相信这会让你更好地了解它是如何运作的。

这些混淆中的大多数都是基于JavaScript的一些特性/原则。第一个是变量名称可以使用 Unicode 字母(LuLlLtLmLoNl)和 Unicode 数字(Nd)。在您给出的第一个示例中,字符可能看起来像符号,但它们是Unicode字母或Unicode编号。

第二个是在JavaScript中向空中添加一个空字符串会将其转换为字符串。如果您还使用了字符串在JavaScript中类似于数组的结构这一事实,您可以轻松地创建类似:(false+"")[0]的内容,也可以编写(!1+"")[0]。从那时起,您可以逐字母撰写自己的字符串。

第三个是可以使用[]表示法访问每个对象属性。例如:window["alert"]("test")window.alert("test")相同。如果你将它与前一段混合,我认为你可以很容易地看到它可以去的地方。

我们开始时唯一缺少的是对windowFunction的引用。其他答案,已经为您提供了一种访问Function的方法,可以使用eval。为了让window变得艰难,最简单的方法是通过这种方式通过Array.concat泄漏:

t= [].concat;
a = t()[0]; // "a" now contains window

获得window后,您可以使用window["eval"]或直接致电window["alert"]

这就是你实际做这些混淆的基础。其余的只是前几点的变化。如果你想了解更多信息,我做了几篇博文,你可以在这里找到它们:http://holyvier.blogspot.com/2011/10/javascript-obfuscation-introduction.html