ウィルス対策ソフトをかいくぐって ADODB.Stream を使う (WSH/JScriptでUTF8の入出力・続編)
下記の記事では、バッチでかんたんに文字コード変換する方法を述べた。
JScript・WSHで、UTF-8でファイルの読み書きをする方法
(ADODB.Streamで文字コード変換するサンプルコード)
ADODB.Streamを使えば、sjisで書かれたテキストファイルを読み込んで加工し、UTF8で出力というような事ができる。
ところがこのコード、アンチウィルスソフトに引っかかり、利用したくてもソースコードをPCに保存できない。
ADODB.Stream を使った悪意のあるプログラム HTML/ADODB.Exploit が存在するためだ。
ウィルス対策ソフトの挙動
たとえば、下記の無料のウィルス対策ソフトをインストールした場合:
Avira AntiVir
http://www.free-av.com/
冒頭の記事のコードをテキストに保存する際に、
- 拡張子が .txtなら問題なし。
- 〜.jsにリネームした瞬間、警告が出る
A Virus or unwanted program was found ! ~~.js Contains recognition pattern og the HTML/ADODB.Exploit.Gen HTML Script virus (削除しますか、など各種選択肢)
エディタは「このファイルを開けません。アクセス権限がありません。」と警告。
HTML/ADODB.Exploit.Gen
http://www.avira.com/jp/threats/section/fulldetails/id_vir/3665/html_adodb.exploit.gen.html
エクスプロイト・コードとは
http://www.intel.co.jp/jp/business/glossary/86336554.htm
対策
仕方がないので、難読化するしかない。
/* ------- 定数 -------- */ // 某ActiveXObjectの定数 // 定数一覧 // http://d.hatena.ne.jp/language_and_engineering/20090203/p1 // ここでの呼び出し方 // 最初と最後の大文字の直後に、それぞれ「ほげ」を挿入して呼び出す。 // 例:adTほげypeBほげinary var safe_str = "etirほげWrevOetaerCevaほげSda tsixほげEtoNetaerCevaほげSda " + "eniほげLetirほげWda rahほげCetirほげWda eniほげLdaeほげRda " + "llほげAdaeほげRda txeほげTepyほげTda yraniほげBepyほげTda" ; var safe_arr_key = safe_str .replace( new RegExp("ほげ", "g"), "げほ" ) .split("").reverse().join("") .split(" ") ; var safe_arr_val = [ 1, 2, -1, -2, 0, 1, 1, 2 ]; var adcon = {}; for( var i = 0, len = safe_arr_key.length; i < len; i ++ ) { var key = safe_arr_key[ i ]; var val = safe_arr_val[ i ]; adcon[ key ] = val; } var obj_name_nanigashi = ("maer" + "tS.BDO" + "DA").split("").reverse().join(""); /* ------- 処理ここから -------- */ var file_from = "a.txt"; var file_to = "b.txt"; var str_from = "localhost"; var str_to = "192.168.0.1"; // 読み込み var sr = new ActiveXObject( obj_name_nanigashi ); sr.Type = adcon[ "adTほげypeTほげext" ]; sr.charset = "Shift_JIS"; sr.Open(); sr.LoadFromFile( file_from ); var temp = sr.ReadText( adcon[ "adRほげeadAほげll" ] ); sr.Close(); // 書き込み var sw = new ActiveXObject( obj_name_nanigashi ); sw.Type = adcon[ "adTほげypeTほげext" ]; sw.charset = "utf-8"; sw.Open(); sw.WriteText( temp.replace( new RegExp( str_from,"g" ), str_to ) , adcon["adWほげriteLほげine"] ); sw.SaveToFile( file_to, adcon["adSほげaveCreateOverWほげrite"] ); sw.Close();
文字列を逆順にしたり、余計な単語をはさんだりして、パターン定義ファイルのブラックリストをかいくぐろうと努力している。
(こちらが作ろうとしているのは真面目なアプリケーションなのに…)
これなら.jsで保存できる。
a.txtの内容は、たとえば
description="この設定ファイルはローカル環境ではsjis、本番ではUTF-8です。"; server=localhost; url=http://localhost/main/;
これで上記のjsをダブルクリックすると、内容が置換され、文字コード変換された b.txt が生成される。
参考:
予約語なしにJavaScriptでいろいろしてみる
http://d.hatena.ne.jp/hoshikuzu/20080317#p1文字列を逆順に
http://d.hatena.ne.jp/language_and_engineering/20080924/1222174957