INDEX
スクリプト・コードの暗号化
Windows Script Encoder
VBScript や JScript と言ったスクリプト言語は、メモ帳などのテキストエディタで簡単に作成し実行することが出来る。しかし、それが故にソースコードを簡単に見ることが出来る。また、ユーザーによって不用意に改変することも出来てしまう。
そこで Script Encoder を使用することで、作成したスクリプトをエンコード(符号化)して、スクリプトのソースが安易に表示されたり変更されないように保護することが出来る。
ただし、エンコードしたスクリプトは、WSH か IE でしか実行できない。特にHTMLやASPの埋め込み、外部jsファイルをエンコードした場合、IE以外のブラウザではエラーとなってしまう。
- Script Encoder Overview (MSDN)
インストール
Microsoft のダウンロードセンターから Windows Script Encoder をダウンロードする。
ダウンロードした sce10jp.exe を実行しインストールを行う。デフォルトでは、「C:\Program Files\Windows Script Encoder」に本体やヘルプなどがコピーされる。
エンコード処理
Script Encoder は、コマンドラインツールなので以下のように実行する。実行すると元となる sample.vbs がエンコードされ、sample.vbe が作成される。
C:\Program Files\Windows Script Encoder> screnc sample.vbs sample.vbe
平文で書かれたスクリプトが、人には判読できない文字列に置き換えられる。
>type sample.vbs
' Windows Script Encoder サンプル
'**Start Encode**
wscript.echo("hello world !!")
' コメントも
wscript.echo("日本語サンプル")
>type sample.vbe ' Windows Script Encoder サンプル '**Start Encode**#@~^TAAAAA==@#@&hd1DbwYc+14WvJ4+^VG~SWD^[Pe"J*@#@&B, コメントも@#@&hdm.raY +14WvJ日本語サンプルEb@#@&PRAAAA==^#~@
2バイト文字 (日本語)
スクリプトに含まれる2バイト文字はエンコードされない。コメントおよびメッセージなどに2バイト文字を使用した場合、エンコードされずにスクリプトの中に残る。
エンコードマーカー
Script Encoder は、スクリプトコードのみをすべてエンコードします。エンコードマーカーを指定することで、エンコードを始める位置を指定することができる。例えば、著作権の表示などと言ったものを残すことが出来る。
マーカーがなければ、スクリプト全体がエンコードされますが、マーカーが最後にあると、何もエンコードされません。マーカーは行コメントから含めて正確に指定する必要がある。
- VBScript エンコード マーカー
- '**Start Encode**
<SCRIPT LANGUAGE="VBScript"> 'Copyright 1998. XYZ Productions. All rights reserved. '**Start Encode** ' ここにコードを記述します。 </SCRIPT>
- JScript エンコード マーカー
- //**Start Encode**
<SCRIPT LANGUAGE="JScript"> //Copyright 1998. ZYX Productions. All rights reserved. //**Start Encode** // ここにコードを記述します。 </SCRIPT>
言語指示子・ファイル拡張子
エンコードした後は、スクリプトファイル拡張子や<SCRIPT> タグ内の言語指示子が、次のように変わる。
- VBScript スクリプトファイル拡張子
- .vbe
- VBScript の言語指示子
- <SCRIPT LANGUAGE="VBScript.Encode">
- JScript スクリプトファイル拡張子
- .jse
- JScript の言語指示子
- <SCRIPT LANGUAGE="JScript.Encode">
エンコーダ・オプション
Script Encoder の構文は、以下のようになっている。
SCRENC [/?] [/s] [/f] [/xl] [/l 言語] [/e 拡張子] inputfile outputfile
オプション
Script Encoder には、以下のようなオプションが用意されている。
| 指定項目 | 内容 |
|---|---|
| /s | 作業中に画面に何も表示しない |
| /f | 入力ファイルを上書きする(元のファイルは残らない) |
| /xl | ASP ファイルの最初に @language ディレクティブを追加しない |
| /l <言語> | エンコードする既定のスクリプト言語(JScript|VBScript)を指定 |
| /e <拡張子> | 特定のファイルタイプに入力ファイルを関連付ける |
| inputfile | エンコードする入力ファイルの名前(ワールドカード使用可能) |
| outputfile | 生成する出力ファイルの名前(入力がワールドカードの時はディレクトリ) |
Lオプション スクリプト言語
エンコードするファイル内に言語属性が含まれていない場合に、このオプションで指定した言語と判断して処理が行われる。
省略された場合、HTML および スクリプトコンポーネントは JScript が既定の言語になり、ASP は VBScript が既定の言語になる。テキストの場合は、そのファイルの拡張子 (.js または .vbs) によって規定のスクリプト言語が判断される。
Eオプション ファイル拡張子
入力ファイルの拡張子だけではファイルタイプが判断できない場合に指定する。よって、Script Encoder が認識出来ない拡張子の入力ファイルでも、指定された拡張子のファイルと同じように処理が行われる。
オプションに既定値はなく、未指定で認識できない拡張子のファイルの場合、Script Encoder はそこで失敗する。
エンコード可能な種類
Script Encoder では、種類のファイルが処理できる。
ASP
この書式は、<SCRIPT> ... </SCRIPT> タグまたは <% ... %> タグの中に埋め込まれたスクリプトと、有効な HTML を含む Active Server Page で構成される。
ASP として識別されるファイル拡張子は、.asp、.asa、.cdx です。
HTML
この書式は、有効な HTML と組み込みスクリプトを含むテキストファイルで構成される。
HTML として識別されるファイル拡張子は、.htm と .html です。
スクリプト コンポーネント
この書式は、<SCRIPT> ... </SCRIPT> タグで囲まれた有効なスクリプトコードを含むテキストファイルで構成される。
スクリプトコンポーネントとして認識されるファイル拡張子は、.sct と .wsh です。
テキスト
この書式は、タグのないスクリプトのみのテキストファイルで構成される。
テキストとして識別されるファイル拡張子は、.js と .vbs ですが、エンコードすると、それぞれ .jse および .vbe に変わる。
補足
エンコードされたスクリプトの解読
Note that this encoding only prevents casual viewing of your code; it will not prevent the determined hacker from seeing what you've done and how.
このエンコードは、コードの安易な表示を防ぐことが目的であり、執拗なハッカーによる覗き見を防ぐものではないことに注意してください。
ヘルプなどにも書かれているようにエンコードしたスクリプトは、デコードすることが可能でツールも存在する。
Windows Script File (.wsf)
Script Encoder にスクリプトコンポーネントとして関連づけされている「.wsh」は、WSHでは設定ファイル (Windows Script Host Settings File) として関連づけされていて、中身は実行するスクリプトファイルへのリンクや設定が保存されているだけでスクリプトコードは含まれていない。
逆に、WSHでスクリプトファイルとして使用される「.wsf (Windows Script File)」は、コードが含まれるが Script Encoder の有効な拡張子として認識されない。そのため、wsf をエンコードする場合は、"/e sct" を指定する必要がある。
また、スクリプトの内容にもいくつか注意が必要となる。
- 「<?xml version="1.0" encoding="UTF-8" ?>」と言ったXML宣言を記述出来ない。
- Shift JIS 以外の文字コードを使用できない。
- wsfでXML宣言に正しく文字コード指定すればUTFやEUCなども使える。
- エンコードはされるが、実行時にメッセージは文字化けを起こす。
- スクリプト全体を「<!-- // -->」やCDATAセクション内で記述することが出来ない。
- </SCRIPT>の直前までがスクリプトとして扱われるため。
- HTMLの場合、「<SCRIPT><!-- ... // --></SCRIPT>」と言った書き方をよくする。
- XMLの場合、CDATAセクション内に書くことで、中のマークアップを解釈しないように出来る。
この辺は、Script Encoder が 2001/10/19 公開で随分と古いせいもあるのかな。
参考
- WSHの暗号化 - Script Encoderの紹介
- WSHスクリプト・コードを暗号化する
最終更新時間:2010年02月22日 15時39分18秒 指摘や意見などあればSandBoxのBBSへ。