こんにちは!日々の業務自動化、本当にお疲れ様です。
マクロの記録や単純な自動化から一歩進んで、「より堅牢で、プロフェッショナルなスクリプトを作りたい」そう思えるようになったなら、あなたはもうワンランク上のエンジニアの扉を叩いています。
今回は、VBScriptを使った実用的なセキュリティ対策、「スクリプトの自己改ざん検知(セーフティロジック)」について徹底解説します。
「VBScriptなんて古い技術でしょ?」と侮るなかれ。現場で動く自動化スクリプトだからこそ、「誰かに書き換えられていないか」「誤って中身が破損していないか」を起動時に自分でチェックできる仕組みがあると、システムの信頼性は劇的に跳ね上がります。
ここをクリアすれば、WSH(Windows Script Host)やファイルシステムの仕組みまでグッと理解が深まりますよ。一緒に優しく、深く、学んでいきましょう!
—
1. なぜ「自己改ざん検知」が必要なのか?
業務でVBScriptを共有サーバーなどに配置して運用していると、こんな不安が頭をよぎりませんか?
- 「他の人がうっかりコードを書き換えてエラーが出るようになった」
- 「悪意のある第三者に中身を書き換えられて、予期せぬ動作をしたらどうしよう……」
通常、プログラムは「動かしてみるまで壊れているか分からない」のが普通です。しかし、プロの現場では「起動した瞬間に、自分自身の健康状態(インテグリティ)を自分で検査する」のが定石です。
今回は、VBScriptが起動したときに、「自分自身のファイルに誰の手も加わっていないか(ハッシュ値の照合)」をチェックし、もし異常があれば即座に安全に停止する仕組みを作ります。
—
2. 仕組みの全体像:どうやって自分をチェックするのか?
仕組みはとってもシンプルです。料理に例えるなら、「レシピのコピー(合言葉)と、今のレシピの重さを比べる」ようなものです。
1. 自分のファイルパスを特定する:今動いているVBScriptがどこにあるのかを自分で知る(`WScript.ScriptFullName`)。
2. ハッシュ値(指紋)を計算する:ファイルの中身を暗号学的なアルゴリズム(SHA-256など)に通し、一意の「指紋(ハッシュ)」を生成する。
3. 正解と比較する:あらかじめ安全な状態で記録しておいた「正しい指紋」と、今計算した「実際の指紋」を突き合わせる。
4. 判定する:一致すればそのまま処理を続行!一致しなければ(改ざんされていたら)「危ない!」とアラートを出して強制終了。
これをVBScriptの標準機能とWMI(Windows Management Instrumentation)やPowerShellの力を借りてスマートに実現します。
—
3. 実装コード:自己改ざん検知付きVBScript
以下のコードをメモ帳などに貼り付け、拡張子を `.vbs` にして保存してください。
(※初回実行時の流れが分かりやすいようにコメントを丁寧に記載しています)
‘ ==============================================================================
‘ スクリプト名: SelfIntegrityCheck.vbs
‘ 概要: 起動時に自分自身のハッシュ値を検証し、改ざんを検知するセーフティロジック
‘ ==============================================================================
Option Explicit
‘ ——————————————————————————
‘ 【設定エリア】事前に安全な状態で算出したこのファイルのSHA-256ハッシュ値をここに記述します
‘ ※最初はダミー値を入れているため、初回実行時に表示される実際のハッシュ値に書き換えてください
‘ ——————————————————————————
Const EXPECTED_HASH = “YOUR_KNOWN_GOOD_SHA256_HASH_HERE”
Sub Main()
Dim fso, scriptPath, currentHash
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 1. 起動している自分自身のファイルパスを取得
scriptPath = WScript.ScriptFullName
‘ 2. 自分自身のSHA-256ハッシュ値を取得する
currentHash = GetFileSHA256(scriptPath)
‘ デバッグ用:現在のハッシュ値を確認したい場合はコメントアウトを外してください
‘ WScript.Echo “現在のハッシュ値: ” & currentHash
‘ 3. 初回セットアップ用の親切設計(ダミー値のまならハッシュを教えて止まる)
If EXPECTED_HASH = “YOUR_KNOWN_GOOD_SHA256_HASH_HERE” Then
MsgBox “【初回セットアップ】” & vbCrLf & _
“このスクリプトの現在のハッシュ値は以下の通りです。” & vbCrLf & _
“コード内の EXPECTED_HASH にこの値を設定してください。” & vbCrLf & vbCrLf & _
currentHash, vbInformation, “初期化ウィザード”
Exit Sub
End If
‘ 4. ハッシュ値の照合(改ざん検知のコアロジック)
If UCase(currentHash) <> UCase(EXPECTED_HASH) Then
‘ 異常検知!セキュアに即座に停止
MsgBox “【警告】スクリプトの改ざんまたは破損を検知しました!” & vbCrLf & _
“セキュリティ保護のため、処理を中断します。”, vbCritical, “致命的なエラー”
WScript.Quit
End If
‘ 5. 検証クリア!本来の業務処理を実行
Call RunBusinessLogic()
End Sub
‘ ——————————————————————————
‘ 補助関数: PowerShellを利用して高速かつ確実にファイルのSHA-256ハッシュを取得する
‘ ——————————————————————————
Function GetFileSHA256(filePath)
Dim shell, exec, cmd, hashResult
Set shell = CreateObject(“WScript.Shell”)
‘ PowerShellを呼び出してファイルのハッシュを計算させる(VBScript単体ではハッシュ計算が難しいため)
cmd = “powershell -NoProfile -ExecutionPolicy Bypass -Command “”(Get-FileHash -Path ‘” & filePath & “‘ -Algorithm SHA256).Hash”””
‘ コマンドを実行して結果を取得
Set exec = shell.Exec(cmd)
hashResult = exec.StdOut.ReadAll
‘ 余計な改行コードを取り除いて返す
GetFileSHA256 = Trim(Replace(hashResult, vbCrLf, “”))
End Function
‘ ——————————————————————————
‘ 本来の業務処理を記述する場所
‘ ——————————————————————————
Sub RunBusinessLogic()
MsgBox “安全性が確認されました。正常に業務処理を実行します!”, vbInformation, “実行成功”
‘ ここに実際のファイル処理や自動化ロジックを書いていきます
End Sub
‘ メイン処理の呼び出し
Main
—
4. コードの深掘り解説:ここがエンジニアの腕の見せ所
① `WScript.ScriptFullName` による自己認識
VBScriptが今どこから実行されているのかを動的に取得するのがこのプロパティです。ファイル名が変更されたり、別のフォルダに移動させられたりした場合でも、自分のフルパスを正確に把握できます。
② VBScriptの限界を突破する「PowerShellの召喚」
VBScript単体には、高度な暗号ハッシュ(SHA-256など)を計算するネイティブな関数がありません。そこで、Windowsに標準搭載されているPowerShellを裏側で呼び出し(`WScript.Shell`の`Exec`メソッド)、計算結果を受け取るという技を使っています。
この「適材適所で他のツールをスマートに使いこなす」アプローチこそが、業務自動化エンジニアの真骨頂です。
③ 大文字・小文字の揺れを防ぐ `UCase`
ハッシュ値(`A1B2C3…`)はアルファベットを含みます。環境や取得方法によって大文字・小文字が混ざることがあるため、比較する際は必ず `UCase()` で大文字に統一してから比較するのが、バグを未然に防ぐプロの知恵です。
—
5. 初学者が陥りやすい罠とエラー対策
- 罠1: 初回起動時にエラーになる
- 対策: 上記のコードは親切設計にしてあり、最初の定数 `EXPECTED_HASH` がダミーのままだと、メッセージボックスで「本当のハッシュ値」を教えてくれます。それをコピーしてコードに貼り付け直せば完了です。
- 罠2: コードを1文字でも修正したら動かなくなった
- 対策: 仕様です! スペースを1つ追加しただけでも、ハッシュ値はガラリと変わります。「自分でコードを直したときは、新しいハッシュ値に更新し直す」というルールを覚えておいてください。これがまさに「改ざんが確実に検知できている証拠」になります。
—
おわりに
お疲れ様でした!今回はVBScriptを用いた「自己改ざん検知ロジック」という、少し一歩進んだセキュリティ&インテグリティの技術を解説しました。
ただ動くだけのスクリプトから、「安全性と堅牢性を備えたシステム」へ。
このコードをあなたのツールボックスに加えておけば、周囲からの見る目が変わること間違いなしです。
ここをクリアしたあなたなら、どんな自動化の課題もスマートに解決できるはず。
明日からのVBScriptライフを、より安全に、より楽しくしていきましょう!
