USB自動実行ウイルス対策

最近、私の周辺でUSBの自動実行で拡散するウイルスが流行った模様。
ということで、自動実行に関する整理。

自動実行を無効にする

基本は、この通り。
よりセキュリティを高めるための設定: 自動再生を無効にする
抜粋すると

Vista は、Microsoftの手順通り
Windows 2000 / XP Professional / Server 2003 は、「gpedit.msc」で
「gpedit.msc」のない「XP Home」等では、上記サイトの添付レジストリ

なお、「gpedit.msc」は、スタートメニューの「ファイル名を指定して実行」で実行する。
添付のレジストリで変更する場合は、xp-disable-autorun.regをダブルクリックで実行です。

自動実行がなくなるので

CDの自動実行は、右クリック・メニューに維持されるようですが、他が不明。
対象のドライブ直下にある、Autorun.infのopen指定を実行するだけだけど、
Autorun.infを開いて、対象のプログラムを探すのは、面倒。


ということで、それを行うWSHJScriptを書いてみた。
以下を、autorun.jsといった名前で保存してください。

// Autorun

var fso = new ActiveXObject('Scripting.FileSystemObject');

function GetPath(fullPath) {
	var nPos = -1;
	while(fullPath.indexOf("\\", nPos + 1) > 0)
		nPos = fullPath.indexOf("\\", nPos + 1);
	var ret = fullPath.substr(0, nPos + 1);
	if(nPos < 0) ret = "";
	return ret;
}

function GetProfile(strSection, strKey, varDefault, strIniPath) {
	var ret;

	// Initialize
	if(strSection == null || strKey == null) {
		ret = "";
	} else {
		ret = varDefault;
	}

//	var fso;
	var f;
	var strLine, strS, strK;
	var fSectionFound;
	var nKsep;
	var reLTrim = /^\s*(\S.*)$/, reRTrim = /^(.*\S)\s*$/, reSec = /^\[(.+)\]/;
	var reDq = /^"(.*)"$/, reEsc = /\\/g, reTarSec, reTarKey;

//	fso =  new ActiveXObject("Scripting.FileSystemObject");
	f = fso.OpenTextFile(strIniPath);

	fSectionFound = false;
	if(strSection) reTarSec = new RegExp("^" + strSection.replace(reEsc, "\\\\") + "$", "i");
	if(strKey) reTarKey = new RegExp("^" + strKey.replace(reEsc, "\\\\") + "$", "i");

	while(!f.AtEndOfStream) {

		strLine = f.ReadLine().replace(reLTrim, "$1");
		if(strLine.length > 0) {

			// Control inside target section or not.
			nKsep = strLine.indexOf("=");

			if(strLine.match(reSec)) {
				strS = strLine.replace(reSec, "$1");
				if(strSection == null) {
					ret += strS + "\n";
				} else {
					fSectionFound = (strS.match(reTarSec) != null);
				}

			} else if(fSectionFound && nKsep > 0) {
				strK = strLine.substr(0, nKsep).replace(reRTrim, "$1");
				if(strKey == null) {
					ret += strK + "\n";
				} else if(strK.match(reTarKey)) {
					ret = strLine.substr(nKsep + 1).replace(reLTrim, "$1").replace(reRTrim, "$1");
					if (ret.match(reDq)) {
						ret = ret.replace(reDq, "$1");
					}
					break;
				}

			}

		}

	}

	f.Close();
	f = null;
	//fso = null;

	return ret;
}




var FILE = "Autorun.inf";
var SECTION = "Autorun";
var OPEN = "open";
var SHELL = "shell\\";
var reSHELL = /^shell\\/i;
var lenSHELL = 7;
var COMMAND = "\\command";
var PRINT = "print";

var wsh = new ActiveXObject('WScript.Shell');
main()


function help(path) {
	// Read Settings
	WScript.Echo("Target File    : " + path);
	WScript.Echo("Target Program : " + GetProfile(SECTION, OPEN, "", path));
	WScript.Echo("Target Icon    : " + GetProfile(SECTION, "icon", "", path));

	var strAllKey, strKey
	var pos
	strAllKey = GetProfile(SECTION, null, null, path);
	pos = strAllKey.indexOf("\n");
	while(pos > 0) {
		strKey = strAllKey.substr(0, pos);
		if(strKey.match(reSHELL) && strKey.indexOf("\\", lenSHELL) < 0) {
			WScript.Echo("Target Shell   : " + strKey.substr(lenSHELL - 1) + "=" + GetProfile(SECTION, strKey, "", path) + "=" + GetProfile(SECTION, strKey + COMMAND, "", path));
		}
		strAllKey = strAllKey.substr(pos + 1);
		pos = strAllKey.indexOf("\n");
	}
}


function runCommand(path, cmd) {
	var strKey, strCommand
	if(cmd == null) {
		strKey = OPEN;
	} else {
		strKey = SHELL + cmd + COMMAND;
	}
	strCommand = GetProfile(SECTION, strKey, "", path);
	if(strCommand && strCommand.length > 0) {
		wsh.Exec(strCommand);
	} else {
		WScript.Echo(strKey + " Command Not Found!");
	}
}


function main() {
	// initialize
	var path, cmd, cd, fname = FILE;
	if(WScript.Arguments.length < 1) {
		WScript.Echo("args : (target path) [{ " + PRINT + " | (shell command) }]");
		return;
	}
	path = WScript.Arguments.item(0);
	if(!fso.FolderExists(path)) {
		cd = GetPath(path);
		fname = path.substr(cd.length);
		if(cd.length == 0) cd = ".";
		path = cd;
	}
	cmd = null;
	if(WScript.Arguments.length > 1) {
		cmd = WScript.Arguments.item(1);
	}
	cd = wsh.CurrentDirectory;
	wsh.CurrentDirectory = path;


	if(cmd && cmd.match(PRINT)) {
		help(fname);
	} else {
		runCommand(fname, cmd);
	}
	wsh.CurrentDirectory = cd;

}

で、このファイルを「C:\Documents and Settings\(ユーザID)\SendTo」に入れて、
Autorun.infを右クリック、「送る」>「autorun.js」と選らんで起動するとか。
デスクトップに置いて、対象の「Autorun.inf」や「D:」といったドライブ名を、
ドラッグ&ドロップするとか。


ま、ご自由に。