このツールが元に戻すもの
多くの JavaScript 難読化ツール——このサイト自身のものも含めて——は、少数の機械的で純粋に静的な変換でコードを書き換えます。すべての文字列リテラルを1つの配列にまとめ、使用箇所をゲッター関数の呼び出しに置き換える、通常の文字を \xNN や \uNNNN のシーケンスにエスケープする、単純な算術を等価だが長い式に展開する、実際のコードを常に真または常に偽の if で包む、a.b を a['b'] と書き換える、といった具合です。このツールはこれら5つを正確に元に戻します。
- 文字列配列のインライン化 —
var _s = ["foo", "bar"]; function _g(i){ return _s[i]; }のようなパターンを見つけ、インデックスがリテラル数値である_g(0)形式の呼び出しを実際の文字列に置き換えます。その後、配列と関数が他から参照されていなければ削除します。 - エスケープのデコード —
\x48\x69をエスケープされた形式ではなくHiとして表示します。 - 定数畳み込み —
1 + 2を3に、"a" + "b"を"ab"に、といった類似のリテラル演算を行います。推測が必要になるもの(リテラルの 0 での除算など)は避けます。 - 無効な分岐の削除 —
if (true) { A } else { B }は単にAになります。while (false) {}は完全に消去されます。 - 角括弧からドットへ —
nameが有効な識別子であればobj['name']はobj.nameになります。
このツールが行わないこと
これは AST 上の静的パターンマッチングであり、汎用の難読化解除ツールではありません。コードを一切実行しないため、eval ベースのローダーを展開したり、実行時の値に依存する不透明な条件式を解決したり、上記の単純なリテラル if/while/三項演算子のケースを超える制御フロー平坦化を元に戻したりすることはできません。変数名はそのまま残ります——_0x1a2b は _0x1a2b のままです。ファイルが「文字列配列+ゲッター関数」の形に正確に一致しない場合、そのステージは単に置き換え件数を0件として報告するだけで、別のパターンを推測することはありません。
仕組み
コードは acorn で AST に解析され、値がすでにリテラルであると証明できる場合にのみ動作する手書きの変換によって走査・書き換えられ、astring で再生成されます。どのサーバーにも何も送信されません。解析と書き換えはすべてブラウザ内で行われます。
使い方
エディタに JavaScript を貼り付けるか入力して実行してください。サマリーには各ステージが何回発動したかが正確に表示されるので、何が変わって何が変わらなかったかが分かります。結果はコピーするか .js ファイルとしてダウンロードできます。
Tiny Online Tools







