JavaScript難読化処理
 のためのヒント

▼▽ Instant Access Menu ▽▼



【BB.excite】Bフレッツ 接続料無料キャンペーン実施中!
(5月31日まで)


2.日本語メッセージを英数字だけの文字列に変換する

他人が書いたJavaScriptを解析する際に、その取っ掛かりとして、エラーメッセージを中心に見ていくことにより、プログラムの特定個所が、どのあたりの処理にかかわるものであるかを類推する方法があります。例えば、いくら先程のページのように改行がないソースに仕上げても、「名前を入力してください。」「フリガナは必須です。」などの日本語メッセージは丸丸残っています。これでは、この日本語メッセージを中心に、どの「{」と「}」が呼応するかなどを読み解かれ、改行・インデントつきの読みやすいソースに「逆戻し」されやすくなります。

そこで、これらの日本語をASCII文字(英数字only)にすることを考えます。String.fromCharCode()メソッドを使います。例えば、「あいうえお」という文字列は、「String.fromCharCode(12354,12356,12358,12360,12362);」と表すことができます。ですから、「alert("あいうえお");」は「msg=String.fromCharCode(12354,12356,12358,12360,12362);alert(msg);」と変換することができます。

このような日本語変換は、比較的簡単なJavaScript(charCodeAt()メソッドを使用。)で可能ですが、自分で作るのが面倒な方は、下記のフォームを利用してください。下記に、「名前を入力してください。」を入力して変換してください。「String.fromCharCode(21517,21069,12434,20837,21147,12375,12390,12367,12384,12373,12356,12290);」となりましたね?
変換したい文字列を入力してください。

  
↓ 変換結果が表示されます。

このようにして、他の日本語メッセージも変換できます。ここで、もう一ひねりして、それぞれの日本語エラーメッセージを別の変数名に写しておく際に、単純に連番をふると分かりやすくなりますので、わざとmsg10、msg8、msg11、msg5・・・というふうに数字が前後無茶苦茶になるようにします。そして、日本語メッセージを一個所に集めておき、どのメッセージ(すでに英数字だけになっています。)がどこに入るのか容易には分からないようにします。

ただし、自分でも分からなくなり、メンテナンスがとても面倒になりますので、プログラムの作成段階では、どの変数がどのエラーメッセージに対応するかをコメントで書いておいて、サーバに公開する前に、先程のページで紹介した方法でコメントを一括削除するのがいいでしょう。順番に気をつけないと大変なことになりそうです。

即ち、ソース1-2を一旦次のように書き換えます。
ソース2-1

ここから、コメントを削除し改行を削除(テキストエディターを使った方法はこちらをご参照ください。)します。

ソース2-2
どうですか?

この難読化したソースを実際に外部ファイル化して、下記の入力フォーム・サンプルで入力チェックができるようにしています。難読化しても問題なく動作することを確認してください。

▼ よくある入力フォームとJavaScriptによるチェック(検証用サンプル)
名前:
フリガナ:
メールアドレス:
  

 このフォームで使われているJavaScript
この方法を使った場合のメリットとして、「敵」に分かりにくくなるだけでなく、日本語が一切出現しないので、Shift_JISで保存することができることです。普通、EUC-JPのホームページなら外部ファイルの文字コードもEUC-JPで保存したり、UTF-8のホームページなら外部ファイルの文字コードもUTF-8の文字コードにしたりしますが、バグを抱えたブラウザによっては、外部ファイルの文字コードが特定の文字コード以外だと文字化けしたりとか、ややこしい問題が起こることがあるのですが、それがなくなるのはメリットですね。

 実は、このString.fromCharCodeメソッドを使った難読化は、Flashのスクリプト言語であるActionScriptの難読化にも利用可能です。swfファイルは、バイナリーファイルですし、JSファイルのように丸見えではないはずなのに、難読化がなぜ必要かと思われます方もおられるでしょうが、難読化は今や必須とも言えます。ActionScriptを解析できるソフトが販売されています。しかも闇でではなく、VectorAmazonなどでも入手できます。swfファイルだと「(AcitionScriptの)ソースは見えない」と思って、パスワードやデータファイルの場所など大切な情報を書いてしまっている場合がありますので、なおさら気をつけないといけないです。)


逆に、この方法を使った場合のデメリットは、まずデバッグ・メンテナンスがしにくくなることです。ですから、できるだけ完成していて、しばらくはいじくる必要のないJavaScriptに対して施す必要があります。また、想定しているエラーパターンを全てチェックするために、想定しているエラーメールアドレスのパターンをまとめておき、すべてのケースで、想定したメッセージが表示されることをチェックするようにします。順番を入れ替えたりしているうちに、自分でも思わぬミスをしている可能性があります。

また、いま一つのデメリットは、ファイルサイズがとても増えることです。このサンプルでは約2倍にもなりました。そこで、ファイルサイズの減量を考えます。まず目につくのは、String.fromCharCodeが何度も登場するようになりましたので、これをもっと簡単で短い名称に変えられないかを考えます。

  目次:

連絡先:info@broadband-xp.com
【PR】 HTML・JavaScript暗号化ソフト「SHTML」

(免責事項)このホームページの内容に起因する如何なるトラブルに対しても責任を持ちえません。必ず自己責任でご利用ください。