首页
社区
课程
招聘
[求助]关于HOOK的问题
发表于: 2005-5-18 14:36 4699

[求助]关于HOOK的问题

2005-5-18 14:36
4699
下面是个自己写的小程序,但总达不到效果,请高手指点!

#include <iostream.h>
#include <windows.h>

HHOOK hKeyboard = NULL ;

LRESULT CALLBACK KeyboardProc ( int code, WPARAM wParam, LPARAM lParam )
{
	if ( wParam == VK_CONTROL )
		cout << "CONTROL" << endl ;

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

int main( )
{

	hKeyboard = SetWindowsHookEx ( WH_KEYBOARD, KeyboardProc, 0, GetCurrentThreadId() ) ; 

	if ( hKeyboard == NULL )
	{
		cout << "Set hook failed! " << endl ;
		exit ( 1 ) ;
	}

	Sleep ( 100000 ) ;

	cout << "finish" << endl ;
	UnhookWindowsHookEx ( hKeyboard ) ;

	return 0;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
2
你的程序没有建立窗口,没有呼叫 GetMessage or PeekMessage ,系统应该不会呼叫 HOOK proc

MSDN -> SetWindowsHookEx -> KeyboardProc

KeyboardProc

The KeyboardProc hook procedure is an application-defined or library-defined
callback function used with the SetWindowsHookEx function. The system
calls this function whenever an application calls the GetMessage or PeekMessage
function and there is a keyboard message ( WM_KEYUP or WM_KEYDOWN) to be
processed.
2005-5-18 14:53
0
雪    币: 111
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
cout << "CONTROL" << endl ;

cout ?
out到哪里去了?
程序本身是不会被Hook的
2005-5-19 11:30
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
猪头!
你豪客联
加上你的中文 显英语丫!
2005-5-19 13:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
?主,不是呃?忤的.SetWindowsHookEx一定至少要一?message pump如GetMessage之?在哕行,最好是建立一??形window?接收Hook的信息.但呃?只限於忤程式本身的嫔.如果要忤整?windows的嫔,必?要??DLL把KeyboardProc?出.??程序,MSDN有真明.
2005-5-19 13:38
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
6
受教了!

还有一个弱的问题要请教各位:
如何利用进程名(比如notepad.exe )来得到进程ID或者是进程句柄?在API中的“Process and Thread Functions”这一部分没有这一个函数啊
2005-5-19 14:32
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
首先你可以通过进程快照或者枚举来获取进程pid
然后调用OpenProcess获取Handle,不过在你能确定主窗口的情况下,你可以调用GetWindowThreadProcessID来获取进程&线程ID
2005-5-19 15:27
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
8
最初由 huoshan 发布
首先你可以通过进程快照或者枚举来获取进程pid
然后调用OpenProcess获取Handle,不过在你能确定主窗口的情况下,你可以调用GetWindowThreadProcessID来获取进程&线程ID


这个我知道啊,我说的是如何利用进程名称(例如notepad.exe)来得到句柄或ID,而不想通过窗口或者进程枚举
2005-5-19 16:57
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
汗~~~~~难道要系统给你一个
Handle OpenProcess(LPCSTR lpProcName)?
2005-5-19 17:39
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
10

大家不要怪我啊,菜鸟一只,不知道那些可以直接调用,那些不可以。
2005-5-19 19:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
最初由 北极星2003 发布


这个我知道啊,我说的是如何利用进程名称(例如notepad.exe)来得到句柄或ID,而不想通过窗口或者进程枚举


可以呃?
DWORD GetPidByName(LPCTSTR lpName)
{
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (hSnapshot == INVALID_HANDLE_VALUE)
		return 0;
	DWORD dwPid = 0;
	PROCESSENTRY32 pe;
	pe.dwSize = sizeof(PROCESSENTRY32);
	if (Process32First(hSnapshot, &pe))
		do
		{
			string name = lpName, exe = pe.szExeFile;
			transform(name.begin(), name.end(), name.begin(), tolower);
			transform(exe.begin(), exe.end(), exe.begin(), tolower);
			if (name == exe)
			{
				dwPid = pe.th32ProcessID;
				break;
			}
		} while (Process32Next(hSnapshot, &pe));
	CloseHandle(hSnapshot);
	return dwPid;
}
2005-5-19 22:04
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
12
非常感谢!!
2005-5-19 23:51
0
游客
登录 | 注册 方可回帖
返回