難読化されたjsに関して、使用ツールの特定と復元方法について


以下のように難読化されたjsのコードがあります。

[code]

    zSbTF_sh = 26496;
    bas_sh = Math.floor((7 & 5) * (33 | 0x0f) * (11 ^ 0x5b) / (23 << 3) * Math.sqrt(23 >> 3)) * (29 | 82) - Math.pow(11, 3);
    Bas_sh = navigator.userAgent.indexOf("Mac") != -1 ? Math.ceil((7 << 2) * (9 | 4) / (0x0b & 7)) - (10 ^ 2) : (7 << 4) + (10 >> 2);
    sfc_sh = String.fromCharCode;
    
    function Sf_sh() {
        var ht = "", nu, i;
        for (i = 0; i < Sf_sh.arguments.length; i++) {
            nu = eval(Bas_sh + Sf_sh.arguments[i]);
            ht += sfc_sh(nu);
        }
        return ht;
    }
    ww_sh = eval(Sf_sh(-14, -3, -15, 3, -5, -13, -4, 2));
    dd_sh = eval(Sf_sh(5, -9, -4, -14, -3, 5));
    al_sh = alert;
    
    function sf_sh() {
        var ht = "", nu, i;
        for (i = 0; i < sf_sh.arguments.length; i++) {
            nu = eval(bas_sh + sf_sh.arguments[i]);
            ht += sfc_sh(nu);
        }
        return ht;
    }
    
[/code]

このコードに関して、何のツールを使って難読化処理がされたのかを  
特定することは可能でしょうか？  
また、ある程度見やすい形に復元することは可能でしょうか？

どなたかわかる方いらっしゃいましたら、よろしくお願いします。




該当のソースコードは [SHTML](http://shtml.jp/) という Windows 用のソフトウェアを使って難読化されています。
体験版を使い、JS Encoder > エキスパートモード（？）でソースコードを変換すると、質問で挙げられたものとそっくりの出力が得られます。

_Original_ :

[code]

    window.alert("Hello");
[/code]

_Converted_ :

[code]

    diOLa_sh = 19054;
    bas_sh = Math.ceil((0x27 << 5) * Math.E * Math.LN10 * Math.PI / 2) + (17 ^ 7) * (5 | 7);
    Bas_sh = navigator.userAgent.indexOf("Mac") != -1 ? Math.ceil((7 << 2) * (9 | 4) / (0x0b & 7)) - (10 ^ 2) : (7 << 4) + (10 >> 2);
    sfc_sh = String.fromCharCode;
     
    function Sf_sh() {
        var ht = "",
            nu, i;
        for (i = 0; i < Sf_sh.arguments.length; i++) {
            nu = eval(Bas_sh + Sf_sh.arguments[i]);
            ht += sfc_sh(nu);
        }
        return ht;
    }
    ww_sh = eval(Sf_sh(-14, -3, -15, 3, -5, -13, -4, 2));
    dd_sh = eval(Sf_sh(5, -9, -4, -14, -3, 5));
    al_sh = alert;
     
    function sf_sh() {
        var ht = "",
            nu, i;
        for (i = 0; i < sf_sh.arguments.length; i++) {
            nu = eval(bas_sh + sf_sh.arguments[i]);
            ht += sfc_sh(nu);
        }
        return ht;
    }
    m1x26767_sh = Sf_sh(-42, -13, -6, -6, -3);
    dd_sh.alert(m1x26767_sh);
[/code]

変数名の末尾 `_sh` は、SHTML の略称でしょうね。解説記事らしきものもありました。ドメイン所有者が同じことから、これも制作者の書いた SEO
用の宣伝記事だと思われます。

  * [JavaScript難読化処理のためのヒント [9．String.fromCharCodeメソッドを少し変形させる]](http://www.broadband-xp.com/obfuscation/string.html)

しかし、この程度の暗号化は子供だましにしかなりません。専用のツールを使っても良いですが、解読には Chrome の Dev Tool
で足りると思います。ソースコードの最後に、

[code]

    debugger;
    
[/code]

を追加して、該当の JavaScript を読み込ませるでもよいし。質問に書かれた部分だけに対しては、以下のようにしてから、自分で置き換えても良いでしょう。

[code]

    diOLa_sh = 19054;
    bas_sh = Math.ceil((0x27 << 5) * Math.E * Math.LN10 * Math.PI / 2) + (17 ^ 7) * (5 | 7);
    Bas_sh = navigator.userAgent.indexOf("Mac") != -1 ? Math.ceil((7 << 2) * (9 | 4) / (0x0b & 7)) - (10 ^ 2) : (7 << 4) + (10 >> 2);
    sfc_sh = String.fromCharCode;
     
    vars_buf = ""; // ■ 追加分
    
    function Sf_sh() {
        var ht = "",
            nu, i;
        for (i = 0; i < Sf_sh.arguments.length; i++) {
            nu = eval(Bas_sh + Sf_sh.arguments[i]);
            ht += sfc_sh(nu);
        }
        vars_buf += "Sf_sh(" + Array.prototype.slice.call(arguments) + ") = \"" + ht + "\"\n"; // ■ 追加分
        return ht;
    }
    ww_sh = eval(Sf_sh(-14, -3, -15, 3, -5, -13, -4, 2));
    dd_sh = eval(Sf_sh(5, -9, -4, -14, -3, 5));
    al_sh = alert;
     
    function sf_sh() {
        var ht = "",
            nu, i;
        for (i = 0; i < sf_sh.arguments.length; i++) {
            nu = eval(bas_sh + sf_sh.arguments[i]);
            ht += sfc_sh(nu);
        }
        vars_buf += "sf_sh(" + Array.prototype.slice.call(arguments) + ") = \"" + ht + "\"\n"; // ■ 追加分
        return ht;
    }
    m1x26767_sh = Sf_sh(-42, -13, -6, -6, -3);
    dd_sh.alert(m1x26767_sh);
    
    alert(vars_buf); // ■ 追加分
[/code]

