JavaScript をパック・アンパックする手順

パックは、定番の Base62 パッカーが使う eval(function(p,a,c,k,e,d){…}(…)) 形式のラッパーに JavaScript を書き換えます。各単語は、整列した一意な単語の辞書へのインデックスに置き換わり、ペイロード側では引用符・バックスラッシュ・改行が削除ではなくエスケープされて元のテキストが保たれます。アンパックはそのペイロードをこのページ内で評価し、得られた JavaScript を表示します。

これは暗号化ではなく難読化で、アンパックは貼り付けたコードを実行します。信頼できるスクリプトだけを扱ってください。どちらのボタンも入力欄のテキストだけを処理し、送信は行わず、実行中にページから外部へのリクエストも発生しません。

  1. 上の欄に JavaScript を貼り付けます。読み戻したい場合は、パック済みの eval(function(p,a,c,k,e,d){…}) をそのまま貼り付けます。
  2. 「JavaScript をパック」を押します。結果欄に、パック済みペイロードと単語辞書を引数に持つ 1 行のラッパーが表示されます。
  3. 「コピー」でラッパーを取り出すか、「クリア」で両方の欄を空にします。
  4. 逆方向は、パック済みのペイロードを貼り付けて「JavaScript をアンパック」を押します。ページ内で評価され、返されたソースが表示されます。
  5. 入力に eval が含まれない場合、評価できない場合、文字列が返らない場合は、空の結果ではなく理由を示すヒントが表示されます。

2 つのボタンの動作

パッカーが出力するラッパー

単語(英数字・アンダースコア・$)は Base62 のインデックス(0-9、a-z、A-Z の順)に置き換えられ、一意な単語は整列されてペイロードと一緒に運ばれる辞書に入ります。ペイロードはシングルクォートの文字列なので、引用符・バックスラッシュ・改行は削除ではなくエスケープされます。// コメントはコメントのまま残り、セミコロンのない文も改行を保ちます。

出力は普通の JavaScript です。ページに貼り付ければ動作し、ラッパーを評価するアンパッカーならどれでも元のソースに戻せます。この版では、エスケープされた引用符、バックスラッシュを含む正規表現、テンプレートリテラル、ブロックコメント、セミコロンなしのコード、CJK テキスト、$ 付き識別子、JSON テキスト、60 語を超える辞書で往復をバイト単位で確認しています。

ペイロードを読み戻す

アンパックは、文字列として評価できるペイロードなら何でも受け付けます。同じラッパーを別の場所で使って作られたパックも対象です。結果欄は読み取り専用でシンタックスハイライト付き、コピーボタンでテキストをそのままコピーできます。

アンパックは入力内容をこのページ内で評価します(eval() ラッパーの仕組みそのものです)。信頼できるコードだけをアンパックしてください。評価時にエラーが出た場合や JavaScript のテキスト以外が返った場合は、空欄ではなくメッセージで知らせます。

実測したサイズと時間

パックはコードを 1 行にまとめ、繰り返しの多いコードでは小さくなります。ハンドラ関数 2.7 KB は 1.8 KB、16.7 KB は 11 KB、85 KB は 55 KB になり、Chrome での所要時間はパックが 1〜5 ms、アンパックが 0.3〜3 ms でした。

ラッパーは仕様上いつでも元に戻せるため、結果は「ざっと見られたくないときの難読化」であり、秘密の保護ではありません。ここでも他のアンパッカーでも貼り付ければソースは復元できます。

最近使ったツール: