【禁断の技術】仕様書なきレガシーCOMを丸裸にする ― TLBInf32による「自動解析」の奥義
こんにちは。現場の最前線で自動化を支え続けてきたエンジニアです。
皆さんは、開発現場で「ドキュメントが一切残っていない謎のDLL」を渡され、途方に暮れたことはありませんか?「これを使えば業務が自動化できる」と言われたものの、中身がブラックボックスでは、まさに手探りで暗闇を歩くようなものです。
通常、そんな時は諦めてリバースエンジニアリングの海に漕ぎ出すわけですが、実はVBScriptの世界には、COMオブジェクトの内部構造を自ら語らせる「TLBInf32.dll」という秘密兵器が存在します。
今日は、この「動的解析」という極めて強力な手法を伝授しましょう。これをマスターすれば、あなたはもう「仕様書待ち」の無力な存在ではありません。
—
1. なぜ「TLBInf32」なのか?
`TLBInf32.dll`(TypeLib Information)は、Microsoftが提供しているCOMコンポーネントの型情報にアクセスするためのライブラリです。
通常、COMオブジェクトは「インターフェース」という決まり事で動いています。VBScriptはこれを利用するだけですが、TLBInf32を使えば、「オブジェクトがどんなメソッドを持ち、どんな引数を要求しているか」という設計図そのものを、実行時に抽出できます。
注意:魔法を使う前の準備
このライブラリは標準インストールされていない場合があります。もしお使いの環境で見当たらない場合は、`TLBInf32.dll`をシステムに登録(`regsvr32`)してください。
—
2. 実践:謎のCOMを丸裸にするコード
それでは、さっそく解析用スクリプトを書いていきましょう。このスクリプトは、指定したCOMコンポーネントの「全メソッド名」と「引数情報」をテキストファイルに書き出します。
‘ 解析対象のProgID(例: Excel.Applicationや、解析したい独自DLLのProgID)
Dim targetProgID : targetProgID = “Excel.Application”
Dim tli, interfaceInfo, member
‘ TLIアプリケーションオブジェクトを生成
Set tli = CreateObject(“TLI.TLIApplication”)
‘ オブジェクトのタイプ情報を取得
Set interfaceInfo = tli.InterfaceInfoFromObject(CreateObject(targetProgID))
‘ 結果出力用ファイルの設定
Dim fso, logFile
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set logFile = fso.CreateTextFile(“ComponentAnalysis.txt”, True)
logFile.WriteLine “— 抽出開始: ” & targetProgID & ” —”
‘ メンバー(メソッド・プロパティ)を走査
For Each member In interfaceInfo.Members
‘ メンバー名と、それがメソッドかプロパティかを出力
logFile.WriteLine “Name: ” & member.Name & ” (Type: ” & member.MemberType & “)”
‘ 引数がある場合はその情報を抽出
If member.Parameters.Count > 0 Then
logFile.WriteLine ” [引数リスト]”
Dim param
For Each param In member.Parameters
logFile.WriteLine ” – ” & param.Name
Next
End If
Next
logFile.Close
Set tli = Nothing
MsgBox “解析完了!ComponentAnalysis.txtを確認してください。”
—
3. コードの解説:ここが「本質」です
このコードの肝は、`TLIApplication`という「解析用オブジェクト」を介している点にあります。
- `InterfaceInfoFromObject`: ここが入り口です。インスタンス化したオブジェクトを投げ込むだけで、その背後に隠れた「型定義(TypeLib)」の扉を開きます。
- `Members` コレクション: オブジェクトが持つ全ての能力(メソッドやプロパティ)が格納されている宝箱です。ここをループで回すだけで、隠された機能が次々と露わになります。
- `MemberType`: これを確認することで、「これが実行可能なメソッドなのか、値をセットするプロパティなのか」を判別できます。
陥りやすいエラーと対策
1. 「コンポーネントを作成できません」: プログラムID(ProgID)が間違っているか、レジストリに正しく登録されていません。まずは `CreateObject` が通るか確認しましょう。
2. セキュリティ制限: 権限が不足しているとDLLの読み込みに失敗します。管理者権限で実行するか、実行環境のセキュリティ設定を見直してください。
—
4. 最後に:エンジニアとしての心構え
この手法は極めて強力ですが、同時に「諸刃の剣」でもあります。
ドキュメント化されていない機能は、開発者が意図的に隠している「非公開メソッド」である可能性が高いです。これらを使うことは、将来的なOSアップデートやパッチ適用時にコードが動かなくなるリスクを孕んでいます。
しかし、「仕様書がない」という絶望的な状況下で、自ら光を照らし道を作る姿勢こそが、一流のエンジニアへの第一歩です。
VBScriptは、もはや古い言語だと言われることもあります。ですが、OSの深淵に直接触れ、ブラックボックスを解析するこの感覚は、どんなモダンな言語にも負けない「エンジニアリングの醍醐味」です。
さあ、恐れずに謎のDLLに挑んでみてください。あなたがそのオブジェクトを掌握した瞬間、自動化の可能性は無限大に広がります。
何か詰まったら、いつでも戻ってきてくださいね。また次の深淵でお会いしましょう。
