スポンサーリンク

ウィルス対策ソフトをかいくぐって ADODB.Stream を使う (WSH/JScriptでUTF8の入出力・続編)



下記の記事では、バッチでかんたんに文字コード変換する方法を述べた。

JScript・WSHで、UTF-8でファイルの読み書きをする方法 
(ADODB.Streamで文字コード変換するサンプルコード)

http://d.hatena.ne.jp/language_and_engineering/20090203/p1

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