Techtouch Developers Blog

テックタッチ株式会社の開発チームによるテックブログです

BHO (Browser Helper Object) をめぐる冒険

adventCalendar-day6

この記事はテックタッチアドベントカレンダー6日目の記事です。 すこし時空がねじれまして5日目は misty による Elasticsearch を使っていくために最低限知っておきたいこと の予定です!?

Windowsチームの伊藤です。最近子供と一緒にワギャンランドで遊んでいます。しりとり、神経衰弱、そしてタケコプターと見せかけてワギャンのアタマがぐるんぐるん回るなど、子供ウケが非常に良いです。好きなしりとりのカードは「しがらきやき」です。

この記事は何

「あと十分ばかりで大事な電話がかかってくるわよ」
彼女ははっか煙草を吸って「BHO のことよ」と言った。
「そして冒険が始まるの」

というほど壮大な話ではないです。BHO を扱っていて体験した不思議をご紹介します。Internet Explorer(以下IE)の話になり今更感がありますが、世の中にはこんな不思議があるというのを垣間見ていただければなあと思います。

BHOとは

Wikipedia によると

Browser Helper Object (BHO) とは Internet Explorer および Windows エクスプローラで使用するプラグインを、第3者でも作成することができるようにする Microsoft Windows の仕組み、及びその仕組みによって生成された COM オブジェクトのことである。1997年に Internet Explorer のバージョン4より実装された。

とあります。IE が備えていない機能であってもにユーザーが IE の機能拡張を行うことができる仕組みです。IE 版 Google ツールバーや、PDF を IE で表示する Acrobat Reader のプラグインなどこれを使って実装されていました。また、マルウェア方面でよく出てくる技術でもあったため、あまり良い印象を持っていない方もいらっしゃるかと思います。 つまり、JavaScript だけでは実現できない機能を提供することができるのですが、JavaScript から扱うと不思議な動きをすることがあります。

VBArrayを知っていますか

COM の SAFEARRAY に対する JavaScript のインターフェースで、TypeScript の lib.scripthost.d.ts にも型が定義されています。lib.scripthost.d.ts のコメントを引用すると、

Enables reading from a COM safe array, which might have an alternate lower bound, or multiple dimensions.

とあります。COM の SAFEARRAY を読むことができちゃいます。

COM とはプラットフォームに依存しないソフトウェア部品を扱うための技術です。BHO の観点では、ブラウザの機能をBHOから取り扱ったり、ネイティブと JavaScript をまたいで処理をやりとりしたりするところで出てきます。このネイティブと JavaScript の間で配列データをやり取りしたいときに出てくるのが SAFEARRAY であり、その JavaScript のインターフェースが VBArray と言うわけです。

VBArrayにまつわる挙動

この VBArray の実体である SAFEARRAY を JavaScrpt からみてみます。まず SAFEARRAY が返る関数 func() を呼び出して VBArray なオブジェクトを取得します。

f:id:techtouch:20201205011559p:plain
SAFEARRAY を取得する

lib.scripthost.d.ts の定義どおりのプロパティが生えているので VBArray っぽいです。ただ変数への代入を評価したら undefined になる気がするんですが何も出ていないようにみえますね…。この程度ならまあ。 次に SAFEARRAY の index 0 を取り出してみます。

f:id:techtouch:20201205011714p:plain
SAFEARRAY の先頭要素を取得する

見えないですね…恥ずかしがり屋さんです。と見せかけて実は取れます。実際には数値が返っていて、console.log() に渡せば見ることは出来ます。またちゃんと演算は出来ているのでたしかに数値として扱えているらしいです。

f:id:techtouch:20201205011806p:plain
この SAFEARRAY の index 0 は数値らしい

今度は vbarray 自体を boolean context で評価してみます。 vbarray ? 'Truthly' : 'Falsly' は Truthly か Falsly か…

f:id:techtouch:20201205012002p:plain
SAFEARRAY を boolean として評価する

Falsly らしいです。素直じゃないですね。

BHOが公開するオブジェクトに生えている関数

BHOが a というオブジェクトを公開し、そこに boolean 値を返す関数 isSupported() を用意してみました:

f:id:techtouch:20201205012113p:plain
不思議な関数 isSupported

値を返すのに undefined な関数。そして unknown 型…?

まとめ

「一般論をいくら並べても人はどこにも行けない。俺は今とても昔のMicrosoft的な話をしてるんだ 」

最近の Microsoft は結構好きです。

明日の記事は ikazo_y による「AWS MFAをセキュアかつ一撃で認証するCLIコマンド作ってみた」です。実用性をひしひしと感じるタイトルですね。お楽しみに!