【入門編】【未ドキュメントCOMコンポーネント解析】TypeLib (TLBInf32) を用いたCOMオブジェクトのプロパティ・メソッド自動抽出 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

【禁断の技術】仕様書なきレガシー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に挑んでみてください。あなたがそのオブジェクトを掌握した瞬間、自動化の可能性は無限大に広がります。

何か詰まったら、いつでも戻ってきてくださいね。また次の深淵でお会いしましょう。

タイトルとURLをコピーしました