JavaScript難読化処理
|
サイコムのDualコアCPU搭載PC[GZ1000P45]、[GZ900A79]が熱い! 10.その他のテクニック今までいくつかの難読化の方法を見てきましたが、これでもほぼ十分とも言えますが、他に知っておいたら、組み合わせ次第では、より強力になる難読化法をご紹介します。a. ダミーの関数・変数を混ぜる
ファイルサイズは多少増える結果になりますが、何も必要なfunction、プロパティだけを定義しかしてはいけないわけではありません。ダミーの変数・関数を混ぜておくことはとても有効です。その際、自分が混乱しない自信があるのであれば、大文字・小文字の違いだけの変数・まぎらわしい文字(「0」と「O」、「1」と「l」など)を使用するのも手でしょう。
b. 意味のない関数を混ぜる
実際、某大手広告配信用JavaScriptで見たことがありますが、「function hoge2(s){return s;}(***一杯何か別のJavaScriptが続く***)a=hoge2(x);」のようなものを見たことがあります。結局、「a=x;」と代入しているにすぎないのですが、hoge2関数がどこにあるかを探すだけで一苦労しますので、難読化に成功します。単純な手法ですが、効果的です。
c. URLエンコードの独自バージョンを作成し、英数字までURLエンコードしてしまう
第6章でURLエンコードを利用する方法を説明しましたが、これだと「String.fromCharCode」「length」などの英数字がそのまま見えてしまっている問題がありました。そこで、第7章では、アルファベットを一文字ずつずらす戦法に出たのでした。 ここでは、別の方法をご紹介します。URLエンコードの仕様として、できるだけデータ転送量が減るように?、アルファべとや数字はそのままです。そのために、Javacriptのキーワードもそのまま表示されていました。しかし、英数字までURLエンコードすることができれば、かなり分かりにくくなります。たとえば、「String.fromCharCode」という文字コードを普通にURLエンコードすれば、「String.fromCharCode」そのままか「String%2EfromCharCode」です。しかし、英数字までURLエンコードするようにすれば、「%53%74%72%69%6e%67%2e%66%72%6f%6d%43%68%61%72%43%6f%64%65」になります(下記のフォームで試してみください)。これをunescapeメソッドでURLデコードすれば、元の「String.fromCharCode」に戻りますが、この「%53〜」の形では一目では元の文字列が分かりません。 d. 関数やプロパティ設定を可能な限りシャッフルさせる
登場順番が重要な場合もありますが、どちらが先でも問題ない場合も多いです。関連するプロパティ設定などがバラバラだとメンテナンスしにくくて大変ですが、完成品をいじくるのであれば、気を付ければ問題ありません。もちろん、バックアップの作成は必須です。 e. JSファイルを複数に分割する
<script type="text/javascipt" src="a.js"></script>
<script type="text/javascipt" src="b.js"></script> のように複数のファイルに分割させます。 複数に分けたJSファイルの読み込まれる順番までは(基本的には)指定できませんので、onload時に実行される部分が変な風に分割されないように気をつける必要がありますが、そうでない場合には、分割させてもOKです。JSファイルAで定義されている関数hogehoge1がファイルAに定義されていなければ、それだけで解読は困難になります。hogehoge1がファイルBに定義されており、そのhogehoge1の中で別の関数hogehoge2の呼び出しがある場合に、hogehoge2がファイルBに定義されておらず、ファイルAに定義されているなら、解読するには、あちこち見なければならず、「敵」を焦らせることができます。 ただし、1ファイルにまとめておくことで、ボリューム的にそれだけで「敵」を圧倒させることができるという面もありますので、ファイルを分割することで、かえって読みやすくなる(読む気を起こさせる結果になる)ようなことがないように注意しなければなりません。 f. AJAXを利用する
前項の「e. JSファイルを複数に分割する」に似ていますが、JSファイルを分割し、かつ、それらのJSファイルを全てヘッダーに最初から記述しておいてロードさせるのではなく、JSファイルAから動的に別のJSファイルBをロードさせる手もあるかもしれません。いわゆるAJAXを活用します。ただし、この場合、クロスブラウザに作成するのに多少の手間がかかるでしょうし、また古いブラウザは完全に切り捨てなければならない場合も出てくるでしょう。
また、ヘッダーの中に入れているJSファイルAがロード完了されていることは保証されているとしても、ファイルBのロード状況ははっきりと分からないため、しっかりと調べてから実行するようにしないと、思わぬエラーになる可能性があります。特にブロードバンド環境ではうまくいっても、ナローバンド環境では動かないという現象が発生した場合に、デバッグが大変になりますので、その点は注意した方がいいです。 g. 関数名・プロパティ名などはできるだけ短く、類推不可能なものに
このヒント集のサンプルでは、checkInput関数の名称はオリジナルから変更しませんでした。JSファイル内での名称を変更すれば、当然、HTMLファイル内での呼び出し元の部分を書き換えなければなりません。それを説明するのが面倒でしたので、サンプルではオリジナルのままの名称にしていました。
最後のページでは、専用ソフトを利用した難読化の方法をご紹介します。checkInputという名称はいかにも、「そのまま」ですし、丸わかりの原因になります。JavaScriptの予約語でなければ、「a();」でも「b();」でもいいわけですし、自分が混乱しない範囲で置き換えてみましょう。また、大文字・小文字の違いをJavaScriptは区別しますので、「c();」と「C();」は別物になります。これを利用すると効果的でしょう。逆に変数名を長くして、「Hgf16773482992」と「Hgf16774382992」で区別するようにするなどの方法も有効かもしれません。 目次: |