1

我正在使用 Windows Hooks 制作键盘记录器。代码位于 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 回答