【问题标题】:Opening a shared file inside a DLL在 DLL 中打开共享文件
【发布时间】:2012-05-16 17:11:43
【问题描述】:

我正在使用 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+");
}
}

帮助。有人吗?

【问题讨论】:

    标签: c++ windows file dll shared-memory


    【解决方案1】:

    虽然指针变量可以在进程之间共享(如果您将正确的参数传递给链接器),但 FILE* 指向的堆分配数据结构和底层 Win32 文件句柄(以及相关的内核-模式文件对象)是共享的。

    您最好在单个进程(启动键盘记录器的进程)中打开文件句柄,然后使用 IPC 机制将数据传输回该进程,然后该进程将处理(正确同步的)写入。

    这对于任何合法的键盘记录目的都可以正常工作,并且可以避免在尝试将文件句柄共享到您没有自己启动的进程中时遇到很多麻烦...更不用说同步忧郁了,如果您第一次成功的话任务。

    【讨论】:

      【解决方案2】:

      我建议不要将 FILE 指针放在共享内存段中,而是建议挂钩的每个实例使用命名的互斥锁分别写入文件,以确保它们不会相互破坏。如果您想变得花哨(可能会提高性能),您可以创建一个单独的日志记录进程,该进程接收来自钩子的输入,除了写入文件之外什么都不做。

      我忽略了您正在编写键盘记录器的面孔,因为这实际上更多是关于多进程挂钩的问题。请不要对键盘记录器进行任何恶意操作。

      【讨论】:

      • 哈哈没有恶意的目的,只是一些鬼混和钩子练习。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多