1

Windows フックを使用してキーロガーを作成しています。コードは DLL 内にあります。入力された文字はファイルに書き込まれます。ただし、問題は、フォーカスがアプリケーション ウィンドウにあるとき以外の文字がファイルに記録されないことです。FILE * は共有メモリ セグメントで宣言されています。

    #pragma data_seg("SHARED")
    .
    .
    FILE* iFile = NULL;
    #pragma data_seg()

フック関数内でファイルを開くと、すべて問題ないようです。

    EXPORT LRESULT CALLBACK KHookProc(int nCode, WPARAM wparam, LPARAM lparam)
    {
                    .
                    .
                    .
        iFile =  fopen("c:\\games\\log.txt","a+");
        fwrite((char *)(&c),1,1,iFile);
        fclose(iFile);

    }
}

フック(すべてのプロセスに共通)の設定中にそれを開くと、アプリケーションのキーストロークがキャプチャされます。

EXPORT void SetKBHook()
{
if(hhook==NULL)
{   
    hhook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KHookProc,g_hinstance,NULL);
    if(hhook == NULL)
    {
        DWORD err = GetLastError();
        err;
    }

    iFile =  fopen("c:\\games\\log.txt","a+");
}
}

ヘルプ。誰でも?

4

2 に答える 2

0

FILE ポインタを共有メモリ セグメントに配置する代わりに、名前付きミューテックスを使用してフックの各インスタンスが個別にファイルに書き込み、相互に破壊しないようにすることをお勧めします。工夫を凝らしたい (場合によってはパフォーマンスを向上させたい) 場合は、フックから入力を受け取り、ファイルへの書き込みのみを行う別のログ プロセスを作成できます。

これは実際にはマルチプロセスフックに関する質問であるため、キーロガーを作成しているという顔を無視しました。キーロガーで悪質なことをしないでください。

于 2012-05-16T17:19:38.157 に答える
0

ポインター変数はプロセス間で共有できますが (リンカーに正しい引数を渡す場合)、FILE* が指しているヒープ割り当てデータ構造も、基になる Win32 ファイル ハンドル (および関連するカーネル モード ファイル オブジェクト) も共有できません。 ) が共有されます。

単一のプロセス (キーロガーを起動するプロセス) でファイル ハンドルを開き、IPC メカニズムを使用してこのプロセスにデータを転送し、(適切に同期された) 書き込みを処理するのが最善です。

これは、あらゆる種類の正当なキーロギングの目的で問題なく機能し、ファイルハンドルを自分で起動していないプロセスに共有しようとする多くの頭痛を回避します...最初のタスクで成功した場合の同期ブルーは言うまでもありません.

于 2012-05-16T17:43:20.680 に答える