#160 Component Object Model
WindowsのComponent Object Model (COM)は、プログラムをコンポーネントとして、別のプログラムから呼び出せるようにしたものです。.NETの前身となるものらしく、ちょっと古い技術ではありますが、今でも使われています。
攻撃者視点でみると、ラテラルムーブメントの手法にDCOM Execがあります。DCOMはCOMを拡張したもので、ネットワーク越しに利用できるCOMです。
理解を深めるためには、触ってみるのが一番です。
自分で一から作るのは難しそうだったので、Microsoftのサンプルを参考にしてみましょう。
リポジトリには、4つのユースケースに対応したサンプルコードが用意されてます。
COMSampleServer (プログラムを公開している側)
COMSampleClient (プログラムを利用する側)
COMSampleProxy (?)
COMSampleService (?)
COMSampleServer
COMサーバーは、IClassFactoryインターフェイスを継承している必要があります。IClassFactoryはさらに、IUnknownインターフェイスを継承していて、COMオブジェクトの管理に必要な処理を定義しています。
IUnknown::AddRef COMオブジェクトへの参照カウンタを増やす
IUnknown::QueryInterface COMオブジェクトへのポインタを取得する
IUnknown::Release COMオブジェクトへの参照カウンタを減らす
IClassFactory::CreateInstance COMオブジェクトを作成する
IClassFactory::LockServer サーバーが終了しないようロックする。
COMサーバーを公開するには、CLSIDをシステムレジストリに登録します。レジストリでは、CLSIDとEXEやDLLが紐づけられていて、COMクライアントは、CLSIDを指定することでサーバーのインターフェースにアクセスできます。
COMSampleClient
COMサーバーのインターフェースにアクセスして、処理を実行できます。まず、CLSIDを指定してCOMサーバーを起動します。COMサーバーでは、COMオブジェクトがインスタンス化され、クライアント側にポインタが返されます。クライアントは、ポインタを通じてCOMサーバーのインターフェースにアクセスできます。
とまあ簡潔に整理してみましたが、調べてみるとまだまだ奥が深いようです。
DLLサロゲート?
Monikerってなに?
OLEとは?
安全なの?
あんまりコアに触る技術ではないですが、名前はよく聞くので、しっかり理解しておきたいです。
今日は疲れたので、また今度…
EOF