关于windows hook的问题

JamOfCode 2011-07-01 01:05:51
最近在研究windows hook,有很多疑惑, 关于如何挂钩可以给个示例代码吗,比如给A进程挂钩,需要监控A进程中的WM_MOUSE_LL消息, 打印到console就行。
...全文
130 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
许文君 2011-07-05
  • 打赏
  • 举报
回复
代码上看不出问题所在,但printf是无法输出的。个人怀疑你的hmodule有问题,你试下用virtualquery去获得看看
Lactoferrin 2011-07-04
  • 打赏
  • 举报
回复
发了//
JamOfCode 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lactoferrin 的回复:]

很多例程这两个都需要共享的吧
因此都是错的,误导其他人
你把电子邮箱发上来,我给你一个可用的
[/Quote]

wh85125@163.com

谢谢了啊~~~~
Lactoferrin 2011-07-04
  • 打赏
  • 举报
回复
很多例程这两个都需要共享的吧
因此都是错的,误导其他人
你把电子邮箱发上来,我给你一个可用的
JamOfCode 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 lactoferrin 的回复:]

发了//
[/Quote]

看了你的,能注入,但是我写的跟你一样的只是包装了一个hookprocess导出,为什么不行啊。。。我已经没有共享那两个变量
JamOfCode 2011-07-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lactoferrin 的回复:]

#pragma data_seg("ShareData")

HHOOK hk = NULL;
HINSTANCE hModule = NULL;

#pragma data_seg

#pragma comment(linker,"/section:ShareData,RWS")
这两个不要共享
[/Quote]

这两个不共享?? 那hModule的地址在两个进程中就不一样了吧,而且我看很多例程这两个都需要共享的吧~

threadID是被注入进程的thread 我已经检查过了。。。。我认为注入成功后,我在那个窗口上移动鼠标,应该先调用hookFun,因为是在被注入进程的hookDLL中
Lactoferrin 2011-07-03
  • 打赏
  • 举报
回复
检查threadId是不是属于那个进程
Lactoferrin 2011-07-03
  • 打赏
  • 举报
回复
#pragma data_seg("ShareData")

HHOOK hk = NULL;
HINSTANCE hModule = NULL;

#pragma data_seg

#pragma comment(linker,"/section:ShareData,RWS")
这两个不要共享
JamOfCode 2011-07-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lactoferrin 的回复:]

你怎么知道没有被注入,那些printf("hookfun\n"),cout都无法输出到你的控制台
如果要在其它进程输出调试文本,不要使用printf,cout这类的,用OutputDebugStringA
[/Quote]

我运行了我的注入函数后用360查看进程中的dll,没有看到我的hookDLL文件
Lactoferrin 2011-07-03
  • 打赏
  • 举报
回复
你怎么知道没有被注入,那些printf("hookfun\n"),cout都无法输出到你的控制台
如果要在其它进程输出调试文本,不要使用printf,cout这类的,用OutputDebugStringA
JamOfCode 2011-07-03
  • 打赏
  • 举报
回复
是threadId问题, 改掉之后SetWindowsHookEx返回hhook值, 但是被注入的进程DLL依然没有成功注入 hookfun也没有被调用
JamOfCode 2011-07-03
  • 打赏
  • 举报
回复
getlasterror返回 87, 我估计是hModule的问题、、、
JamOfCode 2011-07-03
  • 打赏
  • 举报
回复
DLL代码

#define DllTestAPI extern "C" __declspec(dllexport)

#include "hookDLL.h"

#include <windows.h>
#include <iostream>
using namespace std;

#pragma data_seg("ShareData")

HHOOK hk = NULL;
HINSTANCE hModule = NULL;

#pragma data_seg

#pragma comment(linker,"/section:ShareData,RWS")

LRESULT CALLBACK HookFun(int code, WPARAM wParam, LPARAM lParam)
{
printf("hookfun\n");

return CallNextHookEx(hk, code, wParam, lParam);
}

BOOL WINAPI DllMain(_In_ void * _HDllHandle, _In_ unsigned _Reason, _In_opt_ void * _Reserved)
{
switch(_Reason)
{
case DLL_PROCESS_ATTACH:
{
cout<<"DLL_PROCESS_ATTACH"<<endl;
if (hModule == NULL)
{
hModule = (HINSTANCE)_HDllHandle;
}

break;
}
case DLL_PROCESS_DETACH:
{
cout<<"DLL_PROCESS_DETACH"<<endl;
break;
}
case DLL_THREAD_ATTACH:
{
cout<<"DLL_THREAD_ATTACH"<<endl;
break;
}
case DLL_THREAD_DETACH:
{
cout<<"DLL_THREAD_DETACH"<<endl;
break;
}
}

return TRUE;
}

bool HookProcess(int threadId)
{
hk = SetWindowsHookEx(WH_MOUSE, HookFun, hModule, threadId);
return hk != NULL;
}


为什么调用HookProcess会返回0

挂钩代码

#include <windows.h>
#include <iostream>
#include "..\\hookDLL\\hookDLL.h"

using namespace std;
#pragma comment(lib,"..\\hookDLL\\Debug\\hookDLL.lib")

int main()
{
HWND hwnd = FindWindow(TEXT("wnd1"), TEXT("Icon Demo"));
if (hwnd != NULL)
{
int threadId;
GetWindowThreadProcessId(hwnd, (LPDWORD)&threadId);
if(HookProcess(threadId) == false)
{
cout<<"failed"<<endl;
}
}
return 0;
}

Lactoferrin 2011-07-01
  • 打赏
  • 举报
回复
GetForegroundWindow+GetWindowThreadProcessId
Lactoferrin 2011-07-01
  • 打赏
  • 举报
回复
看一下焦点是不是在那个进程的窗口上
JamOfCode 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lactoferrin 的回复:]

WM_MOUSE_LL只能是全局钩子
这个用来屏蔽鼠标右键
LRESULT CALLBACK LowLevelMouseProc(
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
if(wParam==WM_RBUTTONDOWN||wParam==WM_RBUTTONUP||wParam==WM_RBUTTONDBLCLK)return ……
[/Quote]

那如果是进程B想屏蔽进程A的鼠标右键,又应该怎么写??~?~
Eleven 2011-07-01
  • 打赏
  • 举报
回复
CreateRemoteThread(),写个dll
Lactoferrin 2011-07-01
  • 打赏
  • 举报
回复
WM_MOUSE_LL只能是全局钩子
这个用来屏蔽鼠标右键
LRESULT CALLBACK LowLevelMouseProc(
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
if(wParam==WM_RBUTTONDOWN||wParam==WM_RBUTTONUP||wParam==WM_RBUTTONDBLCLK)return 1;
return CallNextHookEx(0,nCode,wParam,lParam);
}

int main()
{
MSG msg;HHOOK hook;
hook=SetWindowsHookExW(14,LowLevelMouseProc,GetModuleHandleW(0),0);
while(GetMessageW(&msg,0,0,0))DispatchMessageW(&msg);

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧