Now Loading !!!
web tool

【Windows Scrip Encoder】

Windows Script Encoder を用いる


 IE(インターネットエクスプローラ)を用いたアプリケーションで作成したスクリプトを安易に覗かれないようにするためにテキストをエンコードするソフトウエア、 Microsoft社の Windows Scripting Encoder を実際に使用してみました。マニュアルを読んでもさっぱりうまくいかず。四苦八苦したあげくようやく使えるようになった次第を書き留めたメモです。

は じ め に

ことの起こり

 会社の業務で業務日報作成システムを構築しています。このシステムは、各社員が自分のパソコンでその日の業務内容や営業情報等を所定の報告書様式で作成・保存しておき、インターネット接続時に一括して会社サーバーにデータ送信する、というもので、出張や外出が多い仕事柄、インターネット接続できない状況でも日報作成できるようにしてあります。すなわちローカルで使用することを前提にしています。
 システムの構築ツールはブラウザ(IE6またはIE7)での使用を前提に下記を用いました。

  • ローカル側(クライアントサイド)は os:Windows XP SP2上で「html+javascript+vbscript」
  • インターネットサーバー側はos:Windows2000Server 上で「asp+javascript+vbscript+SQL Server」

 ここで問題になるのは、クライアント側にインストールされるファイルのスクリプトのソースが丸見えになること。社員限定とはいえ、自由に改竄することができますし、設定値やサーバーアドレス等も丸見えなので、サーバーのセキュリティ面からも大いに不安です。そこで、Microsoft社の Windows Script Encoder を使用し、スクリプトをエンコードして簡単には読めないようにすることにしました。

拝借させて頂いた智恵

 実際に使用するにあたり、次のサイトで教えを乞いました。改めて御礼申し上げます。

【Windows Script Encoder】を使ってみた

 ソフトウェア【Windows Script Encoder】のダウンロード

 ソフトをマイクロソフト社のホームページから無料でダウンロードすることができます。

 上記のページには、【Windows Scripting Encoder】の摘要可能なOSとして Windows XP の記載がありません。もしかすると、このページで述べている種々の問題点はそのへんが原因なのかも知れませんが、一応、使用することはできるようです。

 ダウンロードした自己解凍exeファイルを実行すると、標準では
      [インストール先] C:\Program Files\Windows Script Encoder
にインストールされ、また、マニュアル「Windows Scripting Encoder ドキュメント」がスタートメニューに登録されます。以下、上記の状態にインストールされたものとして話を進めます。

エンコードするファイルの構成

 【Windows Script Encoder】を用いてエンコードするファイルの構成は、Cドライブ直下で模擬的に下記のようになっているものとします。すなわちsampleフォルダにあるhtml/jsファイルをエンコードして新たにencodeフォルダにファイルを作成します。

ドライブ C: sample(folder) エンコード前のファイル保存フォルダ
  │       ├─ sample.html エンコード前のhtmlファイル
  │       └─ sample1.js htmlファイルで使用する外部jsファイル
  encode(folder) エンコードしたファイルの保存先フォルダ
           ├─ sample.html エンコード後のhtmlファイル
           └─ sample1.js エンコード後の外部jsファイル

 コマンドプロンプトによるエンコードの実行

 【Windows Script Encoder】によるファイルのエンコードは、コマンドプロンプトを用いて行います。なお、細かい説明はマニュアルを参照して下さい。

  1.  コマンドプロンプトを開く
  2.  cd C:\Program Files\Windows Script Encoder と入力し[Enter]
  3.  画面上に C:\Program Files\Windows Script Encoder>と表示される

■外部jsファイル

 最初にsampleフォルダのsample1.jsをエンコードしてみます。

  (コマンドプロンプトでエンコード実行)
screnc C:\sample\*.js C:\encode とコマンドプロンプトに入力して[Enter]をクリック

 上記では、ファイル名を直接指定しないで、「sampleフォルダのすべてのjsファイルをエンコードしてencodeフォルダに新たにファイルを作成する」という指定にしています。jsファイルはjavascriptのファイルとして自動認識されるので、特にオプション設定は必要ありません。ファイル名を指定してエンコードされたファイル名を変更することが可能です。

 jsファイルは下記のようにエンコードされました。

  (エンコード前:sample/sample1.js)
function fnSample1(){
alert("スクリプト(1):HTMLファイルからリンクする外部jsファイルに書き込まれたjavascriptです。");
}
  (エンコード後:encode/sample1.js)
#@~^ZAAAAA==W!x^DkKxP6xUC:aVnFv#`@#@&PP,~l^+DDcEスクリプト`8#=CPHJファイルからリンクする外部%kファイルに書き込まれたLC\mdmMk2Oです。r#i@#@&)@#@&6BIAAA==^#~@

 2バイト文字(日本語)はエンコードされません。

 ここで注意しなければならないのは、「エンコードしたいのはjsファイルだけ」だとしても「jsファイルをエンコードしただけでは不十分だ」ということです。すなわち、このjsファイルを外部javascriptファイルとしてリンクしているhtmlファイルの方もエンコードしておかなけれはなりません。htmlファイルにスクリプトが書き込まれていずエンコードの必要がない場合でも、です。

■htmlファイル

 故に、次に上記のjsファイルを外部javascriptファイルとしてリンクしているhtmlファイルをエンコードします。

  (コマンドプロンプトでエンコード実行)
screnc C:\sample\*.html C:\encode とコマンドプロンプトに入力して[Enter]をクリック

 上記も指定方法はjsファイルの場合と同様です。htmlファイルも自動認識されるのでオプション指定の必要はありません。

 htmlファイルは下記のようにエンコードされました。

  1.  javascriptの部分 <script type="text/javascript">〜</script>間がエンコードされている
  2.  外部jsファイルを指定している部分 <script type="text/javascript" src="... が、自動的に <script type="text/JScript.Encode" src="... に変更されている

 タグ内の言語指示子(というそうです)が「javascript→JScript.Encode」となっていますが、JScriptは使用していなくてもこのままで動きます。また、<!--及び//-->もエンコードされていることに注意して下さい。<!--及び//-->は記述しないでエンコードし、エンコード後に書き込んでもよいと思います。
   エンコード前のsample.htmlを開く
   エンコード後のsample.htmlを開く
 vbscriptの場合は「vbscript→VBScript.Encode」となります。

  (エンコード前:sample/sample.html)
<html>
<head>
<title>Script Encoder Sample(HTML)</title>
<script type="text/javascript" src="sample1.js"></script>
<script type="text/javascript">
<!--
function fnSample(){
alert("スクリプト(0):HTMLファイルに書き込まれたjavascriptです。");
}
//-->
</script>
</head>
<body>
<p>
HTMLファイルのサンプルです。
</p>
<p>
<a href="javascript:fnSample()">スクリプト(0)</a><br>
<a href="javascript:fnSample1()">スクリプト(1)</a><br>
</p>
</body>
</html>
  (エンコード後:encode/sample.html)
<html>
<head>
<title>Script Encoder Sample(HTML)</title>
<script type="text/JScript.Encode" src="sample1.js"></script>
<script type="text/JScript.Encode">#@~^awAAAA==@#@&@!Z O@#@&0!x1OkKx~0 ?ChaV+vb @#@&P,~~l^+MYcJスクリプトcT*)uKtJファイルに書き込まれたLm\Cd1Dk2Oです。r#I@#@&N@#@&&JO @*@#@&yxMAAA==^#~@</script>
</head>
<body>
<p>
HTMLファイルのサンプルです。
</p>
<p>
<a href="javascript:fnSample()">スクリプト(0)</a><br>
<a href="javascript:fnSample1()">スクリプト(1)</a><br>
</p>
</body>
</html>

【Windows Script Encoder】をWindows XP(SP2)で動かす【キモ】

マニュアルとの相違点

 ここまでの道のりは決して平坦ではなく、はっきり言えば何度「やめようか」と思ったかも知れないぐらい手間ひまかけました。その最大の原因はマニュアル(Windows Script Encoder ドキュメント)どおりでは動かないこと。Windows XPで動く保証がないヤツを使おう、というのだから当然と言えば当然なのではありますが。

■マーカー指定できない

 マニュアルでは「エンコードを始める位置を識別するために、ソースコード内でマーカーを使用します。」としてjavascriptのサンプルソースを記載しています。

<SCRIPT LANGUAGE="JScript">
//Copyrightc 1998. ZYX Productions. All rights reserved.
// **Start Encode**
// ここにコードを記述します。
</SCRIPT>

 すなわち**Start Encode**以降がエンコードされそれ以前はエンコードされないということですが、実際にやってみるとすべてがエンコードされてしまい、そのスクリプトを実行するとエラーになります。vbscriptの場合でも同様です。

■拡張子は変わらない

 マニュアル内にはjsファイルとvbsファイルは「エンコードすると、それぞれ .jse および .vbe に変わります」という記載がありますが、実際には変わりません。私の読みいかも知れませんが。ファイルの拡張子が変わったらhtmlやスクリプトに記述してあるファイル名もすべて変更する必要があるのかないのか。エンコードしたあとには変更できない、ということでなにやらヘンな感じではあります。

スクリプト内でのエンコードの自動実行

■バッチファイル

 ファイルをサーバーにアップロードするする場合、元ファイルから一時的にエンコードしたファイルを作成しそれをFTPでアップロードするようにしています。実際にはエンコードを自動的に行うためvbscriptを用いて自動化していますが、コマンドプロンプトでのエンコードはbatファイルを実行するようにしています。batファイルの実際例を下記に記載します。

  (エンコードを自動実行するためのバッチファイルの例:script_encode.bat)
cd C:\Program Files\Windows Script Encoder

screnc C:\webfiles\common_files\*.js C:\temp\common_files
screnc C:\webfiles\common_files\*.vbs C:\temp\common_files
screnc C:\webfiles\main\*.js C:\temp\main
screnc C:\webfiles\main\*.vbs C:\temp\main
screnc /e html C:\webfiles\main\*.html C:\temp\main
screnc /l vbscript /e html C:webfiles\*.hta C:\temp
  • htmlは自動認識されるので特にそのままパスを記述すればいいはずなのですが、時々うまくいかないようなので、あえて「特定のファイルに関連付けする」ために /e html とオプション指定しています。
  • htaファイルを使用しているので /e html とオプション指定してhtmlファイルに関連付け、また、/l vbscript として規定のスクリプトをvbscriptに指定しています。
  • 通常、batファイルはダブルクリックすると実行されてしまうので、拡張子を.txtに変更してテキストエディタでオープンします。

■vbscript内でバッチファイルを実行

 vbscriptで上記のバッチファイルを実行する例は下記の通りです。

  (script_encode.batを実行するvbscriptの例)
window.Open "C:\webfiles\script_encode.bat","win_encode"

その他の留意事項

■テキストの改変不可

 エンコード後「エンコードされたテキストを 1 文字でも変更すると、スクリプト全体の整合性が失われ、使用できなくなります」(Windows Script Encoder ドキュメント)。 エンコードされていないhtmlのタグ等の変更は可能です。

■デコード可能

 webに専門的な知識のあるひとならばツールを入手して簡単にデコードできます。そこまで手間暇かけてデコードする、というひとはそう沢山はいないはずですが。

■日本語はエンコードされない

 前述しているように2バイト文字(日本語)はエンコードされません。ひとさまにみられたくないこと等をあからさまに書いたりしないようにしましょう。

■間違っても元ファイルを上書きエンコードしないこと

 エンコードするとき /f とオプション指定すると「入力ファイルに出力ファイルが上書き」されます。すなわち元ファイルが残りません。くれぐれもご注意下さい。サーバー等にアップロードするときは、本文中に記載されているようにアップロード用の一時ファイルを作った方がいいと思います。

■テキストエディタ

 私はテスキトエディタとしてTeraPadを使用していますが、エンコードされたファイルをTeraPadでオープンすると「Null文字を含むファイルです。Null文字は半角スペースに変換しました。」とメッセージされます。Windows標準のNotoPadでは問題ありません。TeraPadの設定で変わるかも知れませんが、特に試していません。


PageTop
【更新記録】
※(2007.05.19) v1.01 一般公開しました。
【AccessCounter】 
アクセスカウンター
※本ページの記載内容を充分理解の上、ご使用下さい。使用されたことにより不利益等が発生しても一切の責任を負いません。
※本ページはA4サイズの用紙に印刷できるようになっていますが、右側がはみ出す場合は、ブラウザで余白の設定を行って下さい。
※印刷時、ナビゲーション用リンク文字やボタン、表示説明用エリア等は印刷されません。
※印刷設定が「背景を印刷」するになっていないと、背景として設定されている画像は印刷されません。
Copyright(C) 2007 web工房 All Rights Reserved.
  URI:http://www.webstudio.jp/