どのようにMinHookライブラリでC++からBitBltをフィルタリングできますか?

BitBlt関数をフックするには、MinHookライブラリを使う必要があります。

  1. MinHookライブラリをダウンロードしてインストールします。ソースコードはMinHookのGitHubページ(https://github.com/TsudaKageyu/minhook)からダウンロードできます。インストール手順はページの説明に従ってください。
  2. MinHook のヘッダーファイルとライブラリファイルをプロジェクトに含み、新しい C++ プロジェクトを作成します。
  3. Windows.h ヘッダー ファイルをプロジェクトにインクルードし、BitBlt 関数を使用します。
  4. プログラム起動時にMinHookのMH_Initialize関数を呼び出し、MinHookライブラリを初期化する。
  5. オリジナルのBitBlt関数ポインタとカスタムBitBlt関数ポインタを定義します。 元のBitBlt関数がポインタを使用して元のBitBlt関数のアドレスを格納し、カスタムのBitBlt関数はBitBlt関数を置き換えるためのものです。
typedef BOOL(WINAPI* PBITBLT)(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop);

PBITBLT pOriginalBitBlt = NULL;
PBITBLT pCustomBitBlt = NULL;
  1. BitBlt関数をフィルタリングするために、カスタムのBitBlt関数を生成する
BOOL WINAPI CustomBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop)
{
    // 过滤操作
    if (nWidth > 100 && nHeight > 100)
    {
        // 此处可以插入您自定义的操作
        return TRUE;
    }

    // 如果不需要过滤,则调用原始的BitBlt函数
    return pOriginalBitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop);
}
  1. MH_CreateHook関数でMinHookを利用してフックを作成し、MH_EnableHook関数でフックを有効する。
MH_CreateHook(&BitBlt, &CustomBitBlt, reinterpret_cast<LPVOID*>(&pOriginalBitBlt));
MH_EnableHook(&BitBlt);
  1. プログラム終了前に、MinHookのMH_Uninitialize関数呼び出してリソースを解放します。
MH_Uninitialize();

ミニフックというライブラリを活用することでBitBlt関数をフィルターできます。BitBlt関数が呼び出されると、まずカスタムのBitBlt関数が呼び出され、フィルター条件を満たす場合はカスタムの処理を実行し、満たさない場合は元のBitBlt関数を呼び出します。

bannerAds