1。种类
   有这么多种挂钩,是不是必须一种目的用一种挂钩,还有各种挂钩是否有自己的实现过程?
2。用法
   每种挂钩该如何使呀,就是说具体的实现方法,有什么出入。
   譬如说:WM_JOURNALRECORD和WM_JOURNALPLAYBACK、、WM_KEYBOARD 、、
   WM_MOURSE的VC实现方法

解决方案 »

  1.   

    各个挂钩有各自的用处,象WM_KEYBOARD就是采集键盘的响应,具体如何用,你查查msdn,
      

  2.   

    简单的功能说明我这里有
    我重点在,他们的区别,和使用方法,实现方法
    MSDN我看不懂
    那种东西,需要有底子
    小弟不才,愚钝的很,而且没这方面经验
    所以请有经验的朋友提携一下讲的详细点,还有能不能动点真格的,写写实例小弟这里不胜感激!!!
    大家一起帮忙解决,关注的UPUPUP
      

  3.   

    HOOK API怎么用
    谢谢
      

  4.   

    那为什么不看前辈的代码??
    www.VCKbase.com那里就有的是。
      

  5.   


    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钩子。
      

  6.   

    很感谢 sum_1找到的原码
    不过能不能再详细分析一下
    在哪里加入SetWindowsHookEx
    在哪里加入消息处理过程MsgProc
    还有,这个过程的地址如何获得?再有如果要做全局钩子,就要做DLL
    这是该参么处理?
    分析一下好学习
    160分在等着你们呢!!!
      

  7.   

    通常我们都是把”钩子”做成动态链接库,这样的好处是可以是系统内的每个进程访问。但是也可以在系统中直接调用,我的建议还是用动态库。如果用动态库的话,那么SetWindowsHookEx()中的第三个参数就是该动态链接库模块的句柄;对于一个只供单个进程访问的”钩子”,可以将其”钩子”过程放在安装”钩子”的同一个线程内,此时SetWindowsHookEx()中的第三个参数为该线程的hInstance。安装”钩子”有两种方法:1.你可以把他做成动态连接库文件,和程序一起编译。2.你可以在程序的任何地方直接调用。
      

  8.   

    呵呵.
    关于钩子问题,俺来谈一谈.
    想做成全局的钩子,必须做成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);
    哈哈.
    紧供参考.
      

  9.   

    我介绍一下在http://www.csdn.net/magazine/download.shtm中的编写WIN32 API钩子。中的源代码
    它分成二个部分一个是钩子的安装程序(HOOKTEXT.EXE),一个是CALLBACK函数所在的DLL(APIHOOK.DLL)
    当安装程序运行时就加入动态连接库(APIHOOK.DLL)调用DLL中的安装函数,
    安装函数调用SetWindowsHookEx进行安装钩子(参数与TopLevel所说的相同)CALLBACK函数的地址已传入SetWindowsHookEx,
    在DLL预载处和HOOKTEXT.EXE代码最末尾有UnhookWindowsHookEx(hHook);函数
    卸载钩子
    其中还包括HOOK API安装代码.(这份HOOK API的代码很经典,希望你好好研究)
    过些天我会把HOOK API的源代码加上注释帖在版面上,在这之前希望自己先看一下.
      

  10.   

    /*做一个安装程序,装入APIHOOK.dll(动态连接)

    摘自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);
    }
      

  11.   

    /********apihook.cpp***************************************/
    #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;

    }
    /****************************************
      

  12.   

    看WINDOWS核心编程~
    那里有介绍~
      

  13.   

    谢谢sum_1(sum_1) 的大力支持
    同时也感谢各位的支持
    请问哪里能找到WINDOWS核心编程的电子版——免费的谢谢诸位,仍然欢迎大家积极热情参加讨论!!!(((160分重赏悬红)))还有请问诸位,如果添加钩子在动态链接库,而钩子过程在程序里,可不可以?
    如果可以该怎么做?还有就是如果我要做键盘记录器还需要什么知识?
    如果我想用KEYBORD钩子,将键盘信息存在缓冲区内,然后如果切换输入焦点再将缓冲区内的数据连同这个窗体的名称一起存取在文件中!我如何实现?如何动态确知输入焦点的改变?
      

  14.   

    为了能让更多得人看到我得帖子
    自己也来UP
    UPUPUPUPUP
      

  15.   

    我猜你是否想做个类似键盘幽灵的程序,WINDOWS消息钩子中确实有记录键盘,鼠标消息钩子,和键盘,鼠标回放钩子。我也不知到因该怎么用。WINDOWS消息钩子过程放在那都一样。
    如果是HOOK API的话就有区别,放在主程序里时只能为当前程序挂钩,放在DLL中时就没有限制。
    你说:
    “添加钩子在动态链接库,而钩子过程在程序里”
    安装过程和CALLBACK的钩子过程为什么要分开呢。(这不是制造混乱吗)所以不可以。
      

  16.   

    http://www.china-pub.com/computers/common/info.asp?id=131
    中有。(前三章电子版免费)
      

  17.   

    哈哈,帖子我会尽快结的,不过这里人气还不错
    所以留下来,大家多探讨一下
    如果那位等不及要分,可以先记下
    或是到另一张贴留个名,到人数就结!!!
    http://www.csdn.net/expert/topic/753/753841.xml?temp=.1548731
      

  18.   


    如果各位有兴趣,能不能教教小弟如何截获WIN API
    听说很不错,多学点总是好的
    还有www.xfocus.net有一个apihook.exe
    不知该怎么用,会的能不能说明一下,THANKS!
      

  19.   

    http://www.csdn.net/magazine/download.shtm中就有一份截获WIN API的源代码,仔细看一看很容易看懂的,再有我在上面的发言中对原理和用法已经说的很清楚.