1。种类
有这么多种挂钩,是不是必须一种目的用一种挂钩,还有各种挂钩是否有自己的实现过程?
2。用法
每种挂钩该如何使呀,就是说具体的实现方法,有什么出入。
譬如说:WM_JOURNALRECORD和WM_JOURNALPLAYBACK、、WM_KEYBOARD 、、
WM_MOURSE的VC实现方法
有这么多种挂钩,是不是必须一种目的用一种挂钩,还有各种挂钩是否有自己的实现过程?
2。用法
每种挂钩该如何使呀,就是说具体的实现方法,有什么出入。
譬如说:WM_JOURNALRECORD和WM_JOURNALPLAYBACK、、WM_KEYBOARD 、、
WM_MOURSE的VC实现方法
解决方案 »
- 请问在给数据卡升级固件的程序中下载一段时间后就出错是为什么?
- winsock中的MSG_OOB有什么作用
- 在EditBox中写入数行文字,如何实现自动滚屏?
- 在控件上画图时的一个小问题?
- 怎样将一个CString类型的字符串复制到剪贴板?
- ????得到一个进程的ID用哪个API得到此进程句柄????
- 请教:怎样设置Win2000 PRO ,屏蔽Application Popup传递消息的骚扰???送高分还有一个帖子,送100分,共150分
- 关于拨号和判断当前是否在线???
- ADO连接数据库 读取一条记录的字段值
- 请教:进程间共享一个数据块的方法
- 如何在SDI程序中显示一个CListView的对象?
- fqq零分!
我重点在,他们的区别,和使用方法,实现方法
MSDN我看不懂
那种东西,需要有底子
小弟不才,愚钝的很,而且没这方面经验
所以请有经验的朋友提携一下讲的详细点,还有能不能动点真格的,写写实例小弟这里不胜感激!!!
大家一起帮忙解决,关注的UPUPUP
谢谢
www.VCKbase.com那里就有的是。
SetWindowsHookEx(WH_GETMESSAGE,&MsgProc,hModDLL,0);
安装WH_GETMESSAGE消息钩子使每个程序运行时调用MsgProc自定义函数
LRESULT CALLBACK MsgProc(int code,WPARAM wParam,LPARAM lParam)
{ //以下加入自己的代码
...... //调用钩子链中的下一个钩子
return CallNextHookEx(hHook,code,wParam,lParam);
}
以上代码应放在DLL中.详细请看 http://www.csdn.net/magazine/download.shtm中的编写WIN32 API钩子。
不过能不能再详细分析一下
在哪里加入SetWindowsHookEx
在哪里加入消息处理过程MsgProc
还有,这个过程的地址如何获得?再有如果要做全局钩子,就要做DLL
这是该参么处理?
分析一下好学习
160分在等着你们呢!!!
关于钩子问题,俺来谈一谈.
想做成全局的钩子,必须做成DLL形式.
局部的功能弱些.具体使用方法:
1.安装钩子.
HHOOK hHook = ::SetWindowsHookEx(
WH_GETMESSAGE, //钩子截获的消息类型.
GetMsgPro, //一个CallBack函数.
AfxGetInstanceHandle(), //如果是Dll就是Dll的hinstance.
GetCurrentThreadId() //当前线程的ID.
);
回调函数可以这样定义:
LRESULT CALLBACK GetMsgPro(int code, WPARAM wParam, LPARAM lParam);
2.根据回调函数进行相应的处理.
LRESULT CALLBACK GetMsgPro(int code, WPARAM wParam, LPARAM lParam)
{
如果code大于0,则是本窗体的消息.可以把lParam转成一个消息结构指针.
PMSG lpMsg = (PMSG)lParam; 如果code小于于0,
::CallNextHookEx(hHook, code, wParam, lParam);
}
3.卸载钩子.
::UnhookWindowsHookEx(hHook);
哈哈.
紧供参考.
它分成二个部分一个是钩子的安装程序(HOOKTEXT.EXE),一个是CALLBACK函数所在的DLL(APIHOOK.DLL)
当安装程序运行时就加入动态连接库(APIHOOK.DLL)调用DLL中的安装函数,
安装函数调用SetWindowsHookEx进行安装钩子(参数与TopLevel所说的相同)CALLBACK函数的地址已传入SetWindowsHookEx,
在DLL预载处和HOOKTEXT.EXE代码最末尾有UnhookWindowsHookEx(hHook);函数
卸载钩子
其中还包括HOOK API安装代码.(这份HOOK API的代码很经典,希望你好好研究)
过些天我会把HOOK API的源代码加上注释帖在版面上,在这之前希望自己先看一下.
摘自CSDN:................(本人加上注释)
*/
/******APIHOOK.H************************************************/
#include <imagehlp.h>#include <tlhelp32.h>
/*管理所挂接钩子的结构*/
typedef struct _APIHOOK32_ENTRY
{
LPCTSTR pszAPIName;
LPCTSTR pszCalleeModuleName;
PROC pfnOriginApiAddress;
PROC pfnDummyFuncAddress;
HMODULE hModCallerModule;
}APIHOOK32_ENTRY, *PAPIHOOK32_ENTRY;
/************************************************/
void _SetApiHookUp(PAPIHOOK32_ENTRY phk)
{
ULONG size; //获取指向PE文件中的Import中IMAGE_DIRECTORY_DESCRIPTOR数组的指针 PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)
ImageDirectoryEntryToData(phk->hModCallerModule,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&size); if (pImportDesc == NULL)
return; //在PE文件头中查找,看看有没有我们想要的DLL for (;pImportDesc->Name;pImportDesc++)
{
LPSTR pszDllName = (LPSTR)((PBYTE)phk->hModCallerModule+pImportDesc->Name);
if (lstrcmpiA(pszDllName,phk->pszCalleeModuleName) == 0)/*找到时*/
break;
} if (pImportDesc->Name == NULL)
{
return;
} //寻找我们想要的函数 PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA) ((PBYTE)phk->hModCallerModule+pImportDesc->FirstThunk);//IAT
for (;pThunk->u1.Function;pThunk++)
{
//ppfn记录了与IAT表项相应的函数的地址 PROC * ppfn= (PROC *)&pThunk->u1.Function;
if (*ppfn == phk->pfnOriginApiAddress)
{
//如果地址相同,也就是找到了我们想要的函数,进行改写,将其指向我们所定义的函数 WriteProcessMemory(GetCurrentProcess(),ppfn,&(phk->pfnDummyFuncAddress),sizeof(phk->pfnDummyFuncAddress),NULL);
return;
}
}
}/************************************************/
BOOL SetWindowsAPIHook(PAPIHOOK32_ENTRY phk)
{/********保护措施******************/
if (phk->pszAPIName == NULL)
{
return FALSE;
}
if (phk->pszCalleeModuleName == NULL)
{
return FALSE;
}
if (phk->pfnOriginApiAddress == NULL)
{
return FALSE;
} if (phk->hModCallerModule == NULL)/**为系统内的所有模块挂接(不包括本DLL自身)***/
{
MEMORY_BASIC_INFORMATION mInfo;
HMODULE hModHookDLL;
HANDLE hSnapshot;
MODULEENTRY32 me = {sizeof(MODULEENTRY32)};
VirtualQuery(_SetApiHookUp,&mInfo,sizeof(mInfo));
hModHookDLL=(HMODULE)mInfo.AllocationBase;/*本DLL的模块地址*/
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,0);/*初始化*/
BOOL bOk = Module32First(hSnapshot,&me);/*第一个模块*/
while (bOk)
{
if (me.hModule!=hModHookDLL)/*进行比较(不为自己的DLL挂接)*/
{
phk->hModCallerModule = me.hModule;/*需挂接的模块*/
_SetApiHookUp(phk);/*挂接*/
}
bOk = Module32Next(hSnapshot,&me);/*下一个模块*/
}
return TRUE;
}
else
{/*为指定的单个模块挂接*/
_SetApiHookUp(phk);
return TRUE;
}
return FALSE;
}
BOOL UnhookWindowsAPIHooks(APIHOOK32_ENTRY & hk)/*御载*/
{
PROC temp;
/*********交换函数地址**********/
temp = hk.pfnOriginApiAddress;
hk.pfnOriginApiAddress = hk.pfnDummyFuncAddress;
hk.pfnDummyFuncAddress = temp;
/******************************/
return SetWindowsAPIHook(&hk);
}
#include "stdafx.h"
#include "apihook32.h"
HMODULE hModDLL;
HHOOK hHook;
APIHOOK32_ENTRY hkA,hkW;
/*自定义CALLBACK函数*/
int WINAPI MyMessageBoxA(HWND hwnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType)
{
return MessageBoxA(hwnd,"It's coming from MyMessageBoxA",lpCaption,uType);
}
/*自定义CALLBACK函数*/
int WINAPI MyMessageBoxW(HWND hwnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType)
{
return MessageBoxW(hwnd,L"It's coming from MyMessageBoxW",lpCaption,uType);
}BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
hModDLL = (HMODULE)hModule;
hkA.hModCallerModule = NULL;/*如果为NULL时,为所有模块挂接*/
hkA.pszAPIName = "MessageBoxA";/*截获API函数名*/
hkA.pszCalleeModuleName = "user32.dll";/*所在连接库*/
hkA.pfnDummyFuncAddress = (PROC) & MyMessageBoxA;/*被挂接的函数CALLBACK*/
hkA.pfnOriginApiAddress = GetProcAddress(GetModuleHandle("user32.dll"),"MessageBoxA");/*读入MessageBoxA函数地址*/
/*上同*/
hkW.hModCallerModule = 0;
hkW.pfnOriginApiAddress = GetProcAddress(GetModuleHandle("user32.dll"),"MessageBoxW");
hkW.pszAPIName = "MessageBoxW";
hkW.pszCalleeModuleName = "user32.dll";
hkW.pfnDummyFuncAddress = (PROC) & MyMessageBoxW;
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:/*当连接库被连接时*/
/*安装钩子*/
SetWindowsAPIHook(&hkW);
SetWindowsAPIHook(&hkA);
return TRUE;
case DLL_PROCESS_DETACH:/*当连接库释放时*/
/*预载钩子*/
UnhookWindowsAPIHooks(hkW);
UnhookWindowsAPIHooks(hkA);
}
return TRUE;
}
/****************************************
那里有介绍~
同时也感谢各位的支持
请问哪里能找到WINDOWS核心编程的电子版——免费的谢谢诸位,仍然欢迎大家积极热情参加讨论!!!(((160分重赏悬红)))还有请问诸位,如果添加钩子在动态链接库,而钩子过程在程序里,可不可以?
如果可以该怎么做?还有就是如果我要做键盘记录器还需要什么知识?
如果我想用KEYBORD钩子,将键盘信息存在缓冲区内,然后如果切换输入焦点再将缓冲区内的数据连同这个窗体的名称一起存取在文件中!我如何实现?如何动态确知输入焦点的改变?
自己也来UP
UPUPUPUPUP
如果是HOOK API的话就有区别,放在主程序里时只能为当前程序挂钩,放在DLL中时就没有限制。
你说:
“添加钩子在动态链接库,而钩子过程在程序里”
安装过程和CALLBACK的钩子过程为什么要分开呢。(这不是制造混乱吗)所以不可以。
中有。(前三章电子版免费)
所以留下来,大家多探讨一下
如果那位等不及要分,可以先记下
或是到另一张贴留个名,到人数就结!!!
http://www.csdn.net/expert/topic/753/753841.xml?temp=.1548731
如果各位有兴趣,能不能教教小弟如何截获WIN API
听说很不错,多学点总是好的
还有www.xfocus.net有一个apihook.exe
不知该怎么用,会的能不能说明一下,THANKS!