続 ウィルスバスター2008

action_game.exeがウィルスバスター2008からDLLインジェクションで怒られる問題で、さすがに警告がうざくなってきたので調査しました。
再現する最小コードを調べたところ、dinput.dllをロードするだけで再現しました。

#define DIRECTINPUT_VERSION 0x0500
#pragma comment(lib, "dinput.lib")

#include <windows.h>
#include <dinput.h>

int main()
{
    // 何かアドレスを使っておかないと、DLLがリンクされないので
    if (&DirectInputCreateA)
        return 0;
    else
        return 1;
}


ウィルスバスター2008が指摘しているのは、NtSetWindowsHookEx()の呼び出しです。
おそらくこれはDirectInputが排他モードを実装するのに使用していると思われます。
試しにdi_key_buttonを「DLLインジェクション」の監視をオン/オフの状態で動かしてみたところ、オンの状態ではキーボードの入力を受け取ることができませんでした。


というわけでNtSetWindowsHookEx()の呼び出しは正当なものだと思われるので、dinput.dllを例外登録しようと思ったんですが、.exeか.comしか登録できないみたいで断念。
監視自体をオフにしました。
DirectInput利用アプリは全部引っかかると思うんですけど、商用アプリだと事前に例外登録されてるっぽいです。
そもそもこの手のフックはDLLからしかできないはずなんで、DLL単位で指定できないと意味がない気もするんですが、、、。