尝试编写GLOBAL CBT HOOK,
这是我的代码,但是我的挂钩应用程序没有收到任何消息,也没有将dll写入测试文件。
这是我的代码:
#include "stdafx.h"
#include "GlobalHook.h"
#include "Stdafx.h"
#include <iostream>
#include <fstream>
#define DLL_EXPORT
#include "GlobalHook.h"
#include <windows.h>
using namespace std;
#pragma comment(lib, "User32.lib")
#pragma unmanaged
HINSTANCE dllHandle;
#pragma data_seg("ASEG")
HWND prnt = 0;
#pragma data_seg()
#pragma comment(linker, "/section:ASEG,RWS")
HHOOK hHook;
int x = 0;
BOOL APIENTRY DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
PVOID lpReserved ) // reserved
{
// Perform actions based on the reason for calling.
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
dllHandle = hinstDLL;
return TRUE;
break;
}
}
LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode < 0)
{
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
if(nCode == HCBT_MINMAX)
{
SendNotifyMessage(prnt, WM_USER + 3, wParam, lParam);
if(x == 0)
{
ofstream myfile;
myfile.open ("C:\\example.txt");
myfile << "Dies in ein File.";
myfile.close();
x = 1;
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
extern "C"
{
DECLDIR int SetHook( HWND parent )
{
prnt = parent;
hHook = SetWindowsHookEx(WH_CBT, CBTProc, dllHandle, 0);
return 1;
}
DECLDIR void UninstallHook( void )
{
if(UnhookWindowsHookEx(hHook))
{
}
}
DECLDIR int Add(int a, int b)
{
return (a + b);
}
}
答案 0 :(得分:0)
使用全局钩子需要“注入DLL”。您的DLL将被注入到每个正在运行的进程中(使用UI线程)。注入DLL时,模块中的任何全局变量都将为NULL / 0。您必须缓存要在全局可访问区域中发送消息的窗口句柄。最简单的地方是使用桌面窗口属性。
请参阅GetProp和SetProp。
请注意,如果您希望全局挂钩在64位Windows上运行,则需要同时具有32位和64位注入DLL以及32位和64位注入器应用程序。否则,您只会挂钩与注入器/ DLL具有相同位数的应用程序。
答案 1 :(得分:0)
一般结构似乎很合理。
#pragma comment(linker, "/section:ASEG,RWS")
RWS可能需要成为rws
我会删除CBTProc,这样你只需要在每个minmax上登录文件,这样你就可以看到你的dll已经正确注入了。
WM_USER是在单个应用程序中使用而不是跨应用程序(尽管你可以侥幸逃脱)。考虑RegisterWindowMessage()
如果注入的应用程序属于较低的私有级别,您可能需要强制您的接收应用程序允许使用ChangeWindowMessageFilter
也可以尝试连接WH_CALLWNDPROC,WH_GETMESSAGE以查看是否可以通过其他消息。
您的窗口也会被挂钩,请确保您没有进入消息发送循环。 您正在使用SendMessage转发消息,它将导致应用程序的消息泵被阻止,如果该应用程序也是您自己处理您将锁定的消息。
indllmain你可以使用outputdebug来记录加载dll的应用程序