2009-02-16
ウィルス対策ソフトをかいくぐって ADODB.Stream を使う (WSH/JScriptでUTF8の入出力・続編)
javascript, MS, tips |
下記の記事では、バッチでかんたんに文字コード変換する方法を述べた。
JScript・WSHで、UTF-8でファイルの読み書きをする方法
(ADODB.Streamで文字コード変換するサンプルコード)
ADODB.Streamを使えば、sjisで書かれたテキストファイルを読み込んで加工し、UTF8で出力というような事ができる。
ところがこのコード、アンチウィルスソフトに引っかかり、利用したくてもソースコードをPCに保存できない。
ADODB.Stream を使った悪意のあるプログラム HTML/ADODB.Exploit が存在するためだ。
ウィルス対策ソフトの挙動
たとえば、下記の無料のウィルス対策ソフトをインストールした場合:
冒頭の記事のコードをテキストに保存する際に、
A Virus or unwanted program was found ! ~~.js Contains recognition pattern og the HTML/ADODB.Exploit.Gen HTML Script virus (削除しますか、など各種選択肢)
エディタは「このファイルを開けません。アクセス権限がありません。」と警告。
http://www.avira.com/jp/threats/section/fulldetails/id_vir/3665/html_adodb.exploit.gen.html
エクスプロイト・コードとは
対策
仕方がないので、難読化するしかない。
/* ------- 定数 -------- */ // 某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
- 32 http://d.hatena.ne.jp/hoshikuzu/
- 24 http://d.hatena.ne.jp/hoshikuzu/20090313
- 21 http://www.google.co.jp/search?q=ADODB.Stream&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 20 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4SKPB_ja&q=システム開発 言語
- 17 http://reader.livedoor.com/reader/
- 16 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=vpT&q=開発 人気 言語 単価&btnG=検索&lr=lang_ja
- 11 http://72.14.235.132/search?q=cache:KF42P0e_g8EJ:d.hatena.ne.jp/language_and_engineering/20090214/p1+IE6+javaScript+セミコロンがない エラー&hl=ja&ct=clnk&cd=4&gl=jp&lr=la
- 9 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=javascript+ADOdb+警告&num=50
- 7 http://d.hatena.ne.jp/
- 7 http://www.google.co.jp/search?hl=ja&q=ADODB.Stream&btnG=Google+検索&meta=lr=lang_ja&aq=f