孙鑫 第二十课HOOK

来源:互联网 发布:java数据库编程 编辑:程序博客网 时间:2024/06/06 01:09

说明

20个视频终于看完了,看到最后有点不给力了,有点累了,走走停停,全套视频看了很长时间了,中间浪费了很长时间,

三天打鱼两天晒网。

现在是2011年5月27日 09:22:40,马上就六月份了,想来这个视频看了有两个多月吧,惭愧啊!

废话不说,写完孙鑫老师视频的最后一个笔记吧,关于这节课的数据库就省略了,已经过时了,就不提了。



钩子分为局部钩子和全局钩子,顾名思义,局部钩子也叫线程钩子, 只能对某一进程中的某一线程起到作用。

全局钩子可以对正在桌面上运行的所有进程中的所有线程进行监视。

全局钩子依托与DLL,安装 / 释放钩子的函数都写在DLL中,钩子消息处理函数也在DLL中。


钩子的作用就是当期望的事件发生的时候在这一事件(消息)发送到目的窗口前处理这个一消息。钩子消息处理函数都是回调函数!


简单介绍下几个函数

①安装钩子

HHOOK   SetWindowsHookEx(

int                 idHook,      //钩子种类

HOOKPROC    lpfn,          //钩子过程函数,每种钩子种类对应相应的钩子过程函数的格式, 格式基本类似

HINTSTANCE  hMod,       //钩子函数所在模块的句柄,如为局部钩子此参数为NULL,如为全局钩子则为DLL句柄(GetModuleHandle)

DWORD         dwThread, //线程ID,如为局部钩子则此参数用GetCurrentThreadId取得,如为全局钩子此参数为0

);

eg.

//局部钩子, 鼠标钩子

HHOOK  hMouse = SetWindowsHookEx(WH_MOUSE, MouseProc, NULL, GetCurrentThreadId());


//全局钩子,GetMessage钩子,在DLL中

HHOOK  h_gMessage = SetWindowsHookEx(WH_GETMESSAGE, MessageProc, GetModuleHandle("xxx.dll"), 0);


 

②获得当前模块或DLL的句柄

HMODULE  GetModuleHandle(

LPCTSTR  lpModuleName  //模块名字,null-terminated字符串,.exe或.dll格式的模块,如果没有后缀则自动认为是.dll,

                                     //如果为NULL,则返回调用进程的句柄

);

eg.

HINSTANCE  hModule = GetModuleHandle("Dlltest.dll");

返回Dlltest.dll的句柄,HINSTANCE和HMODULE可以通用



③取消钩子

BOOL  UnhookWindowsHookEx(

HHOOK  hhk //hook句柄, SetWindowsHookEx返回的句柄

);

eg.

UnhookWindowsHookEx(hMouse);

UnhookWindowsHookEx(h_gMessage);



实例

一个全局钩子,依托于DLL,由于是全局钩子,因此要注入每个正在桌面上运行的进程,对于每个变量,每个进程

都有各自的值,为了让各个进程共用一份变量的拷贝,用如下的方式:

#pragma data_seg("Myseg") //开始,定义新的数据段

int a = 0;                            //必须初始化

#pragma data_seg();           //结束


#pragma comment(linker, "/section:Myseg, RWS");  //设置该数据段的读写共享


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

说明 该全局钩子的作用是截获系统中的消息,并且进行处理,只是简单示例


//GetMessage.dll

#define WIN_DEF  _declspec(dllexport)

#include <afxwin.h>

typedef unsigned short    WORD 


#pragma data_seg("Msgseg")

HWND  g_hWnd = NULL;  //窗口句柄,不一定用到,只是示例

#pragma data_seg()

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


HHOOK g_hMessage = NULL;

FILE* pFile = NULL;


//消息函数,回调函数是由系统调用的,lParam为一指向MSG结构体的指针,wParam为PM_REMOVE或PM_NOREMOVE

LRESULT  CALLBACK  GetMsgProc(

int          code, 

WPARAM  wParam,

LPARAM  lParam)

{

    if(code < 0)

    {

        return CallNextHookEx(g_hMessage, code, wParam, lParam);

    }

    else

    {

        MSG* pMsg = (MSG*)lParam;

        if( (WORD)(pMsg->message) == WM_CHAR && wParam == PM_REMOVE)

        {

            char szChar[1] = {'\0'};

            sprintf(szChar,"%c",pMsg->wParam);

            fwrite(szChar, 1, sizeof(szChar), pFile);

            fflush(pFile);

        }//if


    }//else

}//GetMssageProc



WIN_DEF BOOL  _stdcall  StartHook(HWND hWnd)

{

    g_hWnd = hWnd;

    g_hMessage = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, GetModuleHandle("GetMessage.dll"), 0);

    if(NULL == g_hMessage)

    {

        return FALSE;

    }

    pFile = fopen("keyboardRecord.txt", w+);

}



WIN_DEF  BOOL  _stdcall  StopHook()

{

    fclose(pFile);

    return UnhookWindowsHookEx(g_hMessage);

}


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

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

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



//在某一进程中安装钩子

/////////////////////////////////MyDlg.h//////////////////////////////////////////

#pragma comment(lib, "GetMessage.lib")

_declspec(dllimport) BOOL  _stdcall  StartHook(HWND hWnd);

_declspec(dllimport) BOOL  _stdcall  StopHook();

 

/////////////////////////////////MyDlg.cpp//////////////////////////////////////////

BOOL CMyDlg::OnInitDialog()

{

    //codes

    if( !StartHook(m_hWnd) ) //安装钩子

    {

        MessageBox("安装钩子失败!");

        return FALSE;

    }

    //codes

}



CMyDlg::~CMyDlg()

{

    StopHook();

}

 

 孙鑫 第二十课HOOK - 大灰狼 - 大灰狼 的博客

 

 

原创粉丝点击