どのようにMinHookライブラリでC++からBitBltをフィルタリングできますか?
BitBlt関数をフックするには、MinHookライブラリを使う必要があります。
- MinHookライブラリをダウンロードしてインストールします。ソースコードはMinHookのGitHubページ(https://github.com/TsudaKageyu/minhook)からダウンロードできます。インストール手順はページの説明に従ってください。
- MinHook のヘッダーファイルとライブラリファイルをプロジェクトに含み、新しい C++ プロジェクトを作成します。
- Windows.h ヘッダー ファイルをプロジェクトにインクルードし、BitBlt 関数を使用します。
- プログラム起動時にMinHookのMH_Initialize関数を呼び出し、MinHookライブラリを初期化する。
- オリジナルの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;
- 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);
}
- MH_CreateHook関数でMinHookを利用してフックを作成し、MH_EnableHook関数でフックを有効する。
MH_CreateHook(&BitBlt, &CustomBitBlt, reinterpret_cast<LPVOID*>(&pOriginalBitBlt));
MH_EnableHook(&BitBlt);
- プログラム終了前に、MinHookのMH_Uninitialize関数呼び出してリソースを解放します。
MH_Uninitialize();
ミニフックというライブラリを活用することでBitBlt関数をフィルターできます。BitBlt関数が呼び出されると、まずカスタムのBitBlt関数が呼び出され、フィルター条件を満たす場合はカスタムの処理を実行し、満たさない場合は元のBitBlt関数を呼び出します。