見出し画像

#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

いいなと思ったら応援しよう!