钩子要点

来源:互联网 发布:淘宝小二招聘条件 编辑:程序博客网 时间:2024/05/01 13:15

    钩子要点

    上次修改时间: 2007-8-3, 22:48

     

    SetWindowsHookEX 安装一个应用程序定义的钩子过程到一个钩子链中。最后安装排在链的前面。

    钩子可与某个线程相关,也可与运行同一桌面下所有线程。

    安装钩子过程来监控系统的某些类型的事件。

    HHOOK SetWindowsHookEx(      

        int idHook,
        HOOKPROC 
    lpfn,
        HINSTANCE 
    hMod,
        DWORD 
    dwThreadId  
    );

     

    得到当前线程的ID

    DWORD GetCurrentThreadId(void);

     

    删除通过SetWindowsHookEx安装的钩子

    BOOL UnhookWindowsHookEx(    

        HHOOK hhk
    );

     

     

    主要程序如下:

     

    // 全局变量保存钩子变量和窗口变量

    HHOOK g_hKeyboard = NULL;

    HHOOK g_hMouse = NULL;

    HWND g_wnd = NULL;

    //

    LRESULT CALLBACK MouceProc(  int nCode,

       WPARAM wParam,

       LPARAM lParam

       )

    {

     

    return 1; // 返回非0值将屏蔽

    }

     

    LRESULT CALLBACK KeyProc(  int nCode,

       WPARAM wParam,

       LPARAM lParam

       )

    {

    //         if(VK_SPACE == wParam ) // || VK_RETURN == wParam )

    //                 return 1;

    //         else if (VK_F4 == wParam && 1 == (lParam>>29 & 1) ) // 屏蔽组合键

    //                 return 1;

    //         else

    //                 return CallNextHookEx(g_hKeyboard,nCode,wParam,lParam);

     

    ::MessageBox(g_wnd,_T("点击F2"),_T("结束钩子"),MB_OK);

     

    if( VK_F2==wParam)

    {

    // SendMessage( g_wnd, WM_CLOSE, 0, 0 );

    UnhookWindowsHookEx(g_hKeyboard);

    UnhookWindowsHookEx(g_hMouse);

    }

     

    return 1;

    }

     

    //

    g_wnd = m_hWnd;

    g_hMouse = SetWindowsHookEx(WH_MOUSE,MouceProc,NULL,GetCurrentThreadId());

    g_hKeyboard = SetWindowsHookEx(WH_KEYBOARD,KeyProc,NULL,GetCurrentThreadId());

     

    --------------------------------------

    可见这是相当牛B的钩子。

    如果要屏蔽所有系统的所有鼠标和键盘消息,就更牛逼了,呵呵

     

    设置全局的钩子与所有线程相关,需要将钩子放在动态链接库中

    1。建立一个基于控制平台的动态链接库,放上个类似上面的钩子,代码如下:

    // Hook.cpp : Defines the entry point for the DLL application.

    //

     

    #include "stdafx.h"

    #include "windows.h"

    #include "tchar.h"

     

     

    #ifdef _MANAGED

    #pragma managed(push, off)

    #endif

     

    HWND g_hWnd = NULL;

    HHOOK g_hMouse = NULL;

    HHOOK g_hKeyBoard = NULL;

     

    // BOOL APIENTRY DllMain( HMODULE hModule,

    //                        DWORD  ul_reason_for_call,

    //                        LPVOID lpReserved

    //                                          )

    // {

    //     return TRUE;

    // }

     

    LRESULT CALLBACK MouceProc(  int nCode,

       WPARAM wParam,

       LPARAM lParam

       )

    {

     

    return 1; // 返回非0值将屏蔽

    }

     

    LRESULT CALLBACK KeyboardProc(  int nCode,

       WPARAM wParam,

       LPARAM lParam

       )

    {

    if( VK_F4==wParam)

    {

    //SendMessage( g_wnd, WM_CLOSE, 0, 0 );

    UnhookWindowsHookEx(g_hKeyBoard);

    UnhookWindowsHookEx(g_hMouse);

    }

     

    return 1;// 返回非0值将屏蔽

    }

     

    void SetHook(HWND hwnd)

    {

    g_hWnd = hwnd;

    g_hMouse = SetWindowsHookEx(WH_MOUSE,MouceProc,GetModuleHandle( _T("Hook.dll")),0);

    g_hKeyBoard= SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle(  _T("Hook.dll")),0);

    }

     

     

     

    #ifdef _MANAGED

    #pragma managed(pop)

    #endif

     

     

    2.定制一个Def文件,书写导出函数:

    LIBRARY        "Hook"

     

    EXPORTS

    SetHook         @2

     

    SEGMENTS  // 设置节属性

    MySec  read write share

     

  1. 建一个客户端程序:
  2. 静态加载函数,在工程设置中加入.lib文件,然后声明:

    //////////////////////////////////////////////////////////////////////////

    // 作为全局钩子动态链接库的客户端

    _declspec(dllimport) void SetHook();

     

    界面控制调用。

    void CHookTestDlg::OnBnClickedButton2()

    {

    // TODO: Add your control notification handler code here

     

    SetHook();

    }

     

  3. 可用于锁定用户的操作,或者记录下键盘信息。这应该是最简单的黑客手法了.
  4.  

    通过创建新的节在不同的进程之间共享数据:

    Dumpbin -headers Hook.dll

    查看本dll的所有的节

     

    #pragma data_seg(".Mysec");

    // 放入一个变量,必须初始化

    #pragma data_seg

     

    为连接器提供一个选项,主要设置共享设置。

    #pragma comment(linker,"/section:.Mysec,RWS");

     

     

    这种方式可用于通过动态链接库共享数据

     

     

 
  
原创粉丝点击