記事検索

検索ワードを入力してください。
Sky Tech Blog
APIフックでの​ジャンプ命令の​サイズと​競合回避に​ついて

APIフックでの​ジャンプ命令の​サイズと​競合回避に​ついて

セキュリティソフトは、Windows APIに割り込む「APIフック」を使用し、ログ取得やパラメータチェックを行います。SKYSEA Client Viewもこの手法を採用しており、特に相性問題を避けるために共通のジャンプ命令(0xE9)を使用しています。

セキュリティソフトでは、Windowsが公開しているAPIに割り込みを行う「APIフック」という手法がしばしば採用されています。
SKYSEA Client Viewでもこれを採用しています。

「APIフック」とは、Windowsが公開しているAPI、例えば、CreateProcessW APIがコールされた場合に、自社製品のコードを実行させて、ログを取得したりパラメータ内容をチェックしたりする手法です。

具体的には、kernelbase.dllで公開されているCreateProcessW APIの先頭を書き換え、自社製品のコードにジャンプさせて実装されています。
以下がCreateProcessWの先頭がジャンプ命令に書き換わっている様子です。

アセンブラのジャンプ命令は数多く種類がありますが、奇妙なことに各社のセキュリティソフトは同じ種類のジャンプ命令(0xE9)を使っています。

なぜでしょうか?

それは、他のセキュリティソフトと相性問題を起こしにくいからです。

APIフックは、自社の処理を行った後、待避したオリジナルのコードを実行して元の場所に戻さなければなりません。
戻る場所は、ジャンプ命令のサイズとオリジナルのアセンブラのサイズによって決まります。

もし、複数のセキュリティソフトが同じAPIにフックをかけた場合、ジャンプ命令の長さが異なると致命的な問題が発生する場合があります。

戻る位置は、ジャンプ命令のサイズによって変化するため、長いジャンプ命令を書き込まれると、こちらは書き換えられた途中に戻ってしまってクラッシュします。

逆に短いジャンプ命令を使われると、こちらがその場所以降を書き換えてしまうのでクラッシュします。

ジャンプ命令が5バイトである「E9 XX XX XX XX」はちょうど使い勝手もよく、相性問題回避の効果もあり、このジャンプ命令を採用する製品が多い理由となっています。


XFacebookLINE
Sky株式会社のソフトウェア開発や製品、採用に関するお問い合わせについては、下記のリンクをご確認ください。
お問い合わせ
ホーム