

以下のように難読化された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]

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

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


CC BY-SA 3.0
2015-02-10T17:28:49.020
6273
2015-02-11T08:18:46.933
2015-02-10T23:45:46.750
33
8209
question
javascript
難読化されたjsに関して、使用ツールの特定と復元方法について


難読化ツールは分からないですが、この手の圧縮を目的としていない難読化の解読は実行してみるのが手っ取り早いです。

質問のコードを上から見ていくと

> bas_sh = Math.floor((7 & 5) * (33 | 0x0f) * (11 ^ 0x5b) / (23 << 3) *
> Math.sqrt(23 >> 3)) * (29 | 82) - Math.pow(11, 3);

これには変数が入っていませんので定数に直せます。実行結果は`12349`でした。

> Bas_sh = navigator.userAgent.indexOf("Mac") != -1 ? Math.ceil((7 << 2) * (9
> | 4) / (0x0b & 7)) - (10 ^ 2) : (7 << 4) + (10 >> 2);

これは三項演算子が入っているので別々に評価すると、`Math.ceil((7 << 2) * (9 | 4) / (0x0b & 7)) - (10 ^
2)`も`(7 << 4) + (10 >> 2)`も`114`となることが分かります。なので`navigator.userAgent`はダミーです。

最後に以下の関数です。

[code]

    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));
    
[/code]

途中で`eval`を使用していますが、`Bas_sh`も`Sf_sh`の引数も数値であるためこれはダミーです。  
次の`ht`の初期値は""なので、`sfc_sh`つまり`String.fromCharCode`で一文字ずつ文字列を追加する関数と判断できます。

なので実際に実行してみると`Sf_sh(-14, -3, -15, 3, -5, -13, -4, 2)`は"document"、`Sf_sh(5, -9,
-4, -14, -3, 5)`は"window"となることが分かります。つまり最終的には

[code]

    ww_sh = document;
    dd_sh = window;
    al_sh = alert;
    
[/code]

というコードだと分かります。


CC BY-SA 3.0
2015-02-11T00:11:20.977
6284
2015-02-11T00:11:20.977
5750
6273
answer


FirebugやFirefoxDeveloperEdition等を使えば多少分かるかもしれません。

Firebug  
![Firebug](https://i.stack.imgur.com/ozOrD.png)

FirefoxDeveloperEdition  
![FirefoxDeveloperEdition](https://i.stack.imgur.com/GnrJS.png)


CC BY-SA 3.0
2015-02-11T02:50:01.217
6290
2015-02-11T02:50:01.217
3516
6273
answer


ita_3yさんのコメントに書くべきなのでしょうが・・・  
改行できないと辛いので解答欄に書きます。

1・Firebugのスクリプトタブにある「すべて」のリスト部分を「評価スクリプトを表示」を含むものを選ぶ。  
2・すぐ右のjsリストから対象のevalを選ぶ。  
3・表示されたJSを整形ツールで整形する。

これでだいたい解読出来ると思います。

参考  
<http://code.xenophy.com/?p=868>

整形ツール例  
<http://www.enjoyxstudy.com/misc/20060911/code_paste.html>

他に使ったことはないですが、「Caffeine Monkey」という手段も有ります。  
Caffeine Monkey  
<http://www.secureworks.com/cyber-threat-intelligence/tools/caffeinemonkey/>  
解説サイト  
<http://kinshachi.ddo.jp/blog/comp/archives/000799.html>


CC BY-SA 3.0
2015-02-11T07:12:18.267
6302
2015-02-11T07:12:18.267
5479
6273
answer


該当のソースコードは [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]


CC BY-SA 3.0
2015-02-11T08:18:46.933
6306
2015-02-11T08:18:46.933
4978
6273
answer