葡京网投哪个正规 > 首页 > 简易Windows密码查看器,MFC线程钩子和全局钩子【葡京网投哪个正规】

原标题:简易Windows密码查看器,MFC线程钩子和全局钩子【葡京网投哪个正规】

浏览次数:110 时间:2020-03-25

第20课 钩子与数据库编程
1.Hook简介:作用是拦截某些消息,关键函数是SetWindowsHookEX()
2.示例程序:
   1.新建一基于对话框工程,InnerHook,此过程的钩子是只拦截本进程的。
   2.在OnInitDialog()中添加代码:
    g_hWnd=m_hWnd;
g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());设置了鼠标钩子
g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());设置了键盘钩子
   3.完成钩子函数的编写:
HHOOK g_hKeyboard=NULL;
HHOOK g_hMouse;
HWND g_hWnd=NULL;


第一部分:API函数简介

[标题]:简易Windows密码查看器
[时间]:2009-10-09
[摘要]:通过全局钩子获取当前鼠标处的窗口控件句柄,然后直接调用GetWindowText()获取密码文本。
[关键字]:密码、查看、星号、全局钩子、Hook、WM_COPYDATA、DLL、XP样式
[环境]:Visual Studio 2008、Visual C++ 6.0
[作者]:天堂露珠 ([email protected])

 

LRESULT CALLBACK MouseProc(
    int nCode,       // hook code
    WPARAM wParam,   // message identifier
    LPARAM lParam    // mouse coordinates
)
{
   return 1;
}

1.       **SetWindowsHookEx函数**

[正文]:     此密码查看器原理:通过全局钩子获取当前鼠标处的窗口控件句柄,然后直接调用GetWindowText()获取密码文本。工程在VC++6.0和VS2008中编译通过。 1、查看密码的DLL工程     因为查看密码功能要用到全局鼠标Hook,所以要把功能放到一个DLL中。 PasswordViewerMouseHookDLL.h: #pragma once #ifdef PSWMOUSEHOOKDLL_API_EXPORTS
#define PSWMOUSEHOOKDLL_API __declspec(dllexport)
#else
#define PSWMOUSEHOOKDLL_API __declspec(dllimport)
#endif /*
Winty:2009-09-29
调用SetHook()设置Hook,但无需卸载Hook,DLLMain中有清理。
*/
//My Declaration================================
#define MAXCOUNT 200 //密码最大长度
#define DWDATA_PSW_NOTIFY 1 //COPYDATASTRUCT的dwData自定义值 //密码信息结构体,用于发送
typedef struct tagPswNotify
{
    char psw[MAXCOUNT];//password/text
    POINT pt;//鼠标位置
    HWND hWnd;//控件句柄
} PSWNOTIFY , *PPSWNOTIFY; /*extern表示这里只是变量声明,变量定义在cpp文件中*/
extern PSWMOUSEHOOKDLL_API BOOL g_bReadySend;//WM_COPYDATA互斥的标志,因为WM_COPYDATA不能重叠
extern PSWMOUSEHOOKDLL_API HWND g_hWnd; //接收消息的窗体句柄
extern PSWMOUSEHOOKDLL_API HHOOK g_hhk; //钩子句柄
extern PSWMOUSEHOOKDLL_API BOOL g_bView;//是否需要查看密码 //鼠标钩子过程
PSWMOUSEHOOKDLL_API LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam );
//设置钩子(可在窗口的OnInitDialog()中调用)
PSWMOUSEHOOKDLL_API void SetHook(HWND hWnd); PasswordViewerMouseHookDLL.cpp: #include "stdafx.h" #define PSWMOUSEHOOKDLL_API_EXPORTS
#include "PasswordViewerMouseHookDLL.h" #include <stdio.h> //进程间共享数据,还要在链接器选项里添加:"/SECTION:.MyShare,RWS"
//或: #pragma   comment(linker,"/SECTION:.MyShare,RWS") 
//查看结果:dumpbin /headers *.DLL
#pragma data_seg(".MyShare")
HHOOK g_hhk = NULL;/*Hook句柄*/
HWND  g_hWnd = NULL;/*接收消息的窗口句柄*/
BOOL  g_bReadySend = TRUE;/*用于同步COPYDATA消息*/
#pragma data_seg()
#pragma   comment(linker,"/SECTION:.MyShare,RWS") BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
            break;
        case DLL_PROCESS_DETACH:
            if(g_hhk != NULL)
            {
                UnhookWindowsHookEx(g_hhk);
                g_hhk = NULL;
                g_hWnd = NULL;
            }
            break;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
            break;     }
    return TRUE;
} LRESULT CALLBACK MouseProc(
                           int nCode,      // hook code
                           WPARAM wParam,  // message identifier
                           LPARAM lParam   // mouse coordinates
)
{
    if(nCode == HC_ACTION)
    {
        PMOUSEHOOKSTRUCT pMouseHookStruct
            = reinterpret_cast<PMOUSEHOOKSTRUCT>(lParam);
        LONG x = pMouseHookStruct->pt.x;
        LONG y = pMouseHookStruct->pt.y;
        HWND hWnd = pMouseHookStruct->hwnd;         HWND hWndFromPoint = ::WindowFromPoint(pMouseHookStruct->pt);         if(hWndFromPoint != g_hWnd  &&  g_bReadySend)//不能获取显示密码的文本框的内容
        {
            g_bReadySend = FALSE;
            char psw[MAXCOUNT];
            ::GetWindowText(hWndFromPoint , psw , MAXCOUNT);
            PSWNOTIFY pswNotify;
            strcpy(pswNotify.psw , psw);
            pswNotify.pt.x = x;
            pswNotify.pt.y = y;
            pswNotify.hWnd = hWndFromPoint;             COPYDATASTRUCT cd;
            cd.lpData = &pswNotify;
            cd.cbData = sizeof(PSWNOTIFY);
            cd.dwData = DWDATA_PSW_NOTIFY;
            ::SendMessage(g_hWnd, WM_COPYDATA, NULL , (LPARAM)(LPVOID)&cd);
        }
    }     return CallNextHookEx(g_hhk , nCode , wParam ,lParam);
} void SetHook(HWND hWnd)
{
    g_hWnd = hWnd;
    g_hhk = SetWindowsHookEx(WH_MOUSE ,
                             MouseProc ,
                             GetModuleHandle("PasswordViewerMouseHookDLL") ,
                             NULL);
}     DLL要想将密码消息发送到主窗口显示,要用WM_COPYDATA消息(或其它进程间通信方式),否则会发送失败。如果用WM_SETTEXT,因为全局Hook发送的消息所带的字符串指针lParam可能不能被主窗口访问,从而造成访问异常。     g_bReadySend的设置是因为WM_COPYDATA消息不能连续发送,必须等前一条消息取走之后才能发送下一条消息。 2、显示密码的工程PasswordViewer     创建一个对话框工程PasswordViewer。 使用DLL步骤:

          其实网上谈钩子(HOOK)函数的原理、应用已经很多拉。我对HOOK理解也是略知一、二,只是想写几句,自娱自乐,于是写了:

LRESULT CALLBACK KeyboardProc(
    int code,        // hook code
    WPARAM wParam,   // virtual-key code
    LPARAM lParam    // keystroke-message information
)
{
   //if(VK_SPACE==wParam || VK_RETURN==wParam)如果是空格键
   /*if(VK_F4==wParam && (1==(lParam>>29 & 1)))拦截ALT+F4按键!
    return 1;
   else
    return CallNextHookEx(g_hKeyboard,code,wParam,lParam);*/
   if(VK_F2==wParam)按F2时程序可以退出,这是留的后门。否则程序无法关闭,只能用任务管理器来关闭它了。
   {
    ::SendMessage(g_hWnd,WM_CLOSE,0,0);
    UnhookWindowsHookEx(g_hKeyboard);当程序退出时最好将钩子移除。
    UnhookWindowsHookEx(g_hMouse);
   }
   return 1;
}
3.编写一个屏屏蔽所有进程和所有线程的钩子程序。此时这个钩子必须安装在DLL中,然后被某个程序调用才行。
   1.新建一个DLL工程名为Hook
   2.增加Hook.cpp
   3.代码如下:
#include <windows.h>包含头文件

函数原型

  • 把PasswordViewerMouseHookDLL工程生成的PasswordViewerMouseHookDLL.dll、PasswordViewerMouseHookDLL.lib,以及PasswordViewerMouseHookDLL.h复制到PasswordViewer工程。
    [参考资料]:
    [附件]:
  • 在PasswordViewerDlg.cpp 中加入#include "PasswordViewerMouseHookDLL.h"和#pragma comment(lib , "PasswordViewerMouseHookDLL.lib")

        目的:让键盘锁定一段时间,然后自动解锁。
  原理:利用全局钩子函数(键盘钩子)

HHOOK g_hMouse=NULL;
HHOOK g_hKeyboard=NULL;

HHOOK SetWindowsHookEx(

    如果要设置最后生成XP样式的窗口,得在PasswordViewerDlg.cpp 中加入 #pragma comment(linker,"/manifestdependency:"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'"")     PasswordViewerDlg.cpp主要代码为响应WM_COPYDATA消息,把消息内容显示到窗口上: BOOL CPasswordViewerDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
    if(pCopyDataStruct->dwData == DWDATA_PSW_NOTIFY && !g_bReadySend)
    {
        PPSWNOTIFY pPswNotify = (PPSWNOTIFY)pCopyDataStruct->lpData;         CString strMousePosition;
        strMousePosition.Format("(%3d,%3d)" , pPswNotify->pt.x ,pPswNotify->pt.y);
        m_strMousePosition = strMousePosition;
        CString strPsw;
        strPsw.Format("%s" , pPswNotify->psw);
        m_strPsw = strPsw;
        CString strHWnd;
        strHWnd.Format("%p" , pPswNotify->hWnd);
        m_strHWnd = strHWnd;
        UpdateData(FALSE);         g_bReadySend = TRUE;         return TRUE;
    }
    else
    {
        CString str(_T("未发现窗口"));
        m_strPsw = str;         UpdateData(FALSE);         return CDialog::OnCopyData(pWnd, pCopyDataStruct);
    }   
}     别忘了要在CPasswordViewerDlg::OnInitDialog()中调用DLL的SetHook(m_hWnd),初始化全局钩子。 3、运行     运行结果如图: 葡京网投哪个正规 1 cpp_PasswordViewer.jpg】 [附件]: PasswordViewer.zip: PasswordViewer.exe、PasswordViewerMouseHookDLL.dll、工程源代码

1  创建动态连接库,代码:

#pragma data_seg("MySec")新建了一个节,用于将下 面的这个变量设为全局共享。
HWND g_hWnd=NULL;这个变量是全局共享的。
#pragma data_seg()

  int idHook,        // hook type

本文出自 “wintysのブログ” 博客,请务必保留此出处

葡京网投哪个正规 2葡京网投哪个正规 3HookDll.cpp
葡京网投哪个正规 4//*****************************
葡京网投哪个正规 5//    全局HOOK        
葡京网投哪个正规 6//        UnReal@2005-12-29 
葡京网投哪个正规 7//*****************************
葡京网投哪个正规 8#include "stdafx.h"
葡京网投哪个正规 9#葡京网投哪个正规 ,pragma data_seg("mydata") 
葡京网投哪个正规 10HANDLE        g_hand = NULL;
葡京网投哪个正规 11HINSTANCE    g_hMod = NULL;
葡京网投哪个正规 12HHOOK        g_hKeyHook = NULL;
葡京网投哪个正规 13#pragma data_seg() 
葡京网投哪个正规 14
葡京网投哪个正规 15LRESULT CALLBACK KeyboardProc(int code,
葡京网投哪个正规 16            WPARAM wParam,
葡京网投哪个正规 17            LPARAM lParam)
葡京网投哪个正规 18葡京网投哪个正规 19葡京网投哪个正规 20{
葡京网投哪个正规 21    return 1;
葡京网投哪个正规 22}
葡京网投哪个正规 23BOOL APIENTRY DllMain( HANDLE hModule, 
葡京网投哪个正规 24                     DWORD ul_reason_for_call, 
葡京网投哪个正规 25                     LPVOID lpReserved)
葡京网投哪个正规 26葡京网投哪个正规 27葡京网投哪个正规 28{
葡京网投哪个正规 29    g_hMod = (HINSTANCE)hModule;
葡京网投哪个正规 30    return TRUE;
葡京网投哪个正规 31}
葡京网投哪个正规 32void test()        //测试函数
葡京网投哪个正规 33葡京网投哪个正规 34葡京网投哪个正规 35{
葡京网投哪个正规 36   MessageBox(NULL,"你的键盘将在3分钟之类无
葡京网投哪个正规 37                法进行输入,休息一下吧!",
葡京网投哪个正规 38              "UnReal友情提示",0);
葡京网投哪个正规 39}
葡京网投哪个正规 40void SetHook(HANDLE hand)
葡京网投哪个正规 41葡京网投哪个正规 42葡京网投哪个正规 43{
葡京网投哪个正规 44    g_hand = hand;
葡京网投哪个正规 45    g_hKeyHook = ::SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,g_hMod,0);
葡京网投哪个正规 46    
葡京网投哪个正规 47}
葡京网投哪个正规 48void UnSetHook()
葡京网投哪个正规 49葡京网投哪个正规 50葡京网投哪个正规 51{
葡京网投哪个正规 52    ::Sleep(3*60*1000);
葡京网投哪个正规 53    MessageBox(NULL,
葡京网投哪个正规 54                  "该工作拉  ^-^ ",
葡京网投哪个正规 55                  "UnReal友情提示",0);
葡京网投哪个正规 56    ::UnhookWindowsHookEx(g_hHook);
葡京网投哪个正规 57}

//#pragma comment(linker,"/section:MySec,RWS")
/*HINSTANCE g_hInst;

  HOOKPROC lpfn,     // hook procedure

[时间]:2009-10-09 [摘要]:通过全局钩子获取当前鼠标处的窗口控件句柄,然后直接调用GetWindowText()获取密码文本。...

2 创建调用程序,代码:

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,   // handle to the DLL module
    DWORD fdwReason,      // reason for calling function
    LPVOID lpvReserved    // reserved
)
{
   g_hInst=hinstDLL;
}*/

  HINSTANCE hMod,    // handle to application instance

葡京网投哪个正规 58葡京网投哪个正规 59System32.cpp
葡京网投哪个正规 60//*****************************
葡京网投哪个正规 61//        HOOK调用程序          *
葡京网投哪个正规 62//            UnReal@2005-12-29 *
葡京网投哪个正规 63//*****************************
葡京网投哪个正规 64
葡京网投哪个正规 65#include "stdafx.h"
葡京网投哪个正规 66typedef void (*PFUNC)();
葡京网投哪个正规 67typedef void (*PFUNCSET)(HANDLE hand);
葡京网投哪个正规 68typedef void (*PFUNCUNSET)();
葡京网投哪个正规 69
葡京网投哪个正规 70LRESULT CALLBACK MouseProc(int nCode,
葡京网投哪个正规 71               WPARAM wParam,
葡京网投哪个正规 72                      LPARAM lParam)
葡京网投哪个正规 73葡京网投哪个正规 74葡京网投哪个正规 75{
葡京网投哪个正规 76    return 1;
葡京网投哪个正规 77}
葡京网投哪个正规 78int APIENTRY WinMain(HINSTANCE hInstance,
葡京网投哪个正规 79                     HINSTANCE hPrevInstance,
葡京网投哪个正规 80                     LPSTR     lpCmdLine,
葡京网投哪个正规 81                     int       nCmdShow)
葡京网投哪个正规 82葡京网投哪个正规 83葡京网投哪个正规 84{
葡京网投哪个正规 85    HMODULE hMod = LoadLibrary("HookDll");
葡京网投哪个正规 86    if(hMod!=NULL)
葡京网投哪个正规 87葡京网投哪个正规 88    葡京网投哪个正规 89{
葡京网投哪个正规 90        PFUNCSET pFuncSet = (PFUNCSET)GetProcAddress(hMod,"SetHook");
葡京网投哪个正规 91        if(pFuncSet!=NULL)
葡京网投哪个正规 92葡京网投哪个正规 93        葡京网投哪个正规 94{
葡京网投哪个正规 95            pFuncSet(hInstance);
葡京网投哪个正规 96        }
葡京网投哪个正规 97
葡京网投哪个正规 98        PFUNC pFunc = (PFUNC)GetProcAddress(hMod,"test");
葡京网投哪个正规 99        if(pFunc!=NULL)
葡京网投哪个正规 100葡京网投哪个正规 101        葡京网投哪个正规 102{
葡京网投哪个正规 103            pFunc();
葡京网投哪个正规 104        }
葡京网投哪个正规 105        PFUNCUNSET pFuncUnSet = (PFUNCUNSET)GetProcAddress(hMod,"UnSetHook");
葡京网投哪个正规 106        if(pFuncUnSet != NULL)
葡京网投哪个正规 107葡京网投哪个正规 108        葡京网投哪个正规 109{
葡京网投哪个正规 110            pFuncUnSet();
葡京网投哪个正规 111        }
葡京网投哪个正规 112        FreeLibrary(hMod);
葡京网投哪个正规 113    }
葡京网投哪个正规 114        return 0;
葡京网投哪个正规 115}

LRESULT CALLBACK MouseProc(
    int nCode,       // hook code
    WPARAM wParam,   // message identifier
    LPARAM lParam    // mouse coordinates
)
{
   return 1;拦截了鼠标消息。
}

  DWORD dwThreadId   // thread identifier

3   将第一步生成的HookDll.dll 复制到装载dll的可执行文件目录,运行exe文件。
  msdn上查查函数SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId);设置idHook可以
        编写不同的钩子函数,有兴趣的朋友自己研究研究。
  呵呵^-^  上班时间,空了再写,再完善……

LRESULT CALLBACK KeyboardProc(
    int code,        // hook code
    WPARAM wParam,   // virtual-key code
    LPARAM lParam    // keystroke-message information
)
{
   if(VK_F2==wParam)如果是F2键,则退出。
   {
    SendMessage(g_hWnd,WM_CLOSE,0,0);
    UnhookWindowsHookEx(g_hMouse);当退出时将钩子卸掉。
    UnhookWindowsHookEx(g_hKeyboard);
   }
   return 1;
葡京正网网投 ,}

);

void SetHook(HWND hwnd)此函数设置了钩子。
{
   g_hWnd=hwnd;注意这种传递调用它的进程的句柄的方法,比较巧妙!
   g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);
   g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0);
}

函数功能:该函数将一个应用程序定义的挂钩处理过程安装到挂钩链中去,您可以通过安装挂钩处理过程来对系统的某些类型事件进行监控,这些事件与某个特定的线程或系统中的所有事件相关.具体参数详见MSDN;

Hook.DEF的代码如下:
LIBRARY Hook
EXPORTS
SetHook   @2
SEGMENTS
MySec READ WRITE SHARED   也可以设置节的属性。
     4.新建一个工程调用此钩子函数。工程名为HookTest,基于对话框的。在OnInitDialog()中调用SetHook(),要事先声明_declspec(dllimport) void SetHook(HWND hwnd);
       然后在Project->Setting->Link->加入..HookDebugHook.lib,并将Hook.Dll拷贝到当前目录。
int cxScreen,cyScreen;
cxScreen=GetSystemMetrics(SM_CXSCREEN);
cyScreen=GetSystemMetrics(SM_CYSCREEN);
SetWindowPos(&wndTopMost,0,0,cxScreen,cyScreen,SWP_SHOWWINDOW);将窗口保持在最前面。
SetHook(m_hWnd);
     5.DLL的调试方法,设置断点,然后运行时断点时,step into即可。
4.数据库编程
   1.ODBC,ADO简介:ADO可以认为是建立在ODBC上的。
    ADO的三个核心对象
Connection对象
    Connection对象表示了到数据库的连接,它管理应用程序和数据库之间的通信。 Recordset和Command对象都有一个ActiveConnection属性,该属性用来引用Connection对象。
Command对象
    Command对象被用来处理重复执行的查询,或处理需要检查在存储过程调用中的输出或返回参数的值的查询。
Recordset对象
    Recordset对象被用来获取数据。 Recordset对象存放查询的结果,这些结果由数据的行(称为记录)和列(称为字段)组成。每一列都存放在Recordset的Fields集合中的一个Field对象中。
   2.演示在VB中使用ADO的方法,方法比较简单,使用方便。另外在VB中演示了Connection和Command和Recordset的方法,用这三种方法都可以执行SQL语句。
   3.在VC中利用ADO访问数据库。
     1.新建一个基于对话框的工程,名为ADO。
     2.在对话框中放一ListBox和一个Button控件。
     3.在使用时须导入MSADO15.dll,方法是在StdAfx.h中#import "D:Program FilesCommon FilesSystemadomsado15.dll" no_namespace rename("EOF","rsEOF")
     至少于将EOF改名为rsEOF,是为了避免与文件中的EOF重名。然后编译程序,将产生的debug目录下的两个文件MSADO15.tlh和MSADO15.tli加到工程中,其目的只是方便我们查看而已。并不是编译需要它。
     ADO也是COM组件,须初始化COM库方法是CoInitialize(NULL);使用完后须CoUninitialize();
     代码如下:
     void CAdoDlg::OnBtnQuery()
{
// TOD Add your control notification handler code here
CoInitialize(NULL);初始化
_ConnectionPtr pConn(__uuidof(Connection));产生connection智能指针
_RecordsetPtr pRst(__uuidof(Recordset));产生recordset智能指针
_CommandPtr pCmd(__uuidof(Command));产生command智能指针

举例:

pConn->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=pubs";数据库信息
pConn->Open("","","",adConnectUnspecified);打开数据库

线程钩子:

//pRst=pConn->Execute("select * from authors",NULL,adCmdText);用记录集查询数据
//pRst->Open("select * from authors",_variant_t((IDispatch*)pConn),
// adOpenDynamic,adLockOptimistic,adCmdText);
pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn));
pCmd->CommandText="select * from authors";用这种方法也可以查询数据
pRst=pCmd->Execute(NULL,NULL,adCmdText);
while(!pRst->rsEOF)将查询到的数据加到列表框咯。
{
   ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(
    (_bstr_t)pRst->GetCollect("au_lname"));
   pRst->MoveNext();
}

HHOOK g_hMouse;//全局变量,保存钩子的句柄

pRst->Close();
pConn->Close();
pCmd.Release();
pRst.Release();
pConn.Release();
CoUninitialize();
}

LRESULT CALLBACK MouseProc(

  int nCode,      // hook code

  WPARAM wParam,  // message identifier

  LPARAM lParam   // mouse coordinates

)

{

  //……

}

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

2.       **CallNextHookEx函数**

函数原型:

LRESULT CallNextHookEx(

  HHOOK hhk,      // handle to current hook

  int nCode,      // hook code passed to hook procedure

  WPARAM wParam,  // value passed to hook procedure

  LPARAM lParam   // value passed to hook procedure

);

函数功能:调用下一个钩子

3.       UnhookWindowsHookEx

函数原型:

BOOL UnhookWindowsHookEx(

  HHOOK hhk   // handle to hook procedure

);

第二部分:HOOK与DLL

1.线程钩子的创建过程:

 1. 声明一个全局的HHOOK类型的变量,用于保存创建钩子的句柄,如:

HHOOK g_hMouse;//全局变量,保存钩子的句柄

 2. 在应用程序的初始化函数中,安装钩子;注意SetWindowsHookEx的参数!

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

3.       编写处理钩子消息的回调函数:

LRESULT CALLBACK MouseProc(

  int nCode,      // hook code

  WPARAM wParam,  // message identifier

  LPARAM lParam   // mouse coordinates

)

{

    //编写需要处理的部分

         return 1;

//不需要处理的部分,调用

return CallNextHookEx(g_hMouse, nCode, wParam, lParam);

}

4.       卸载钩子函数

UnhookWindowsHookEx(g_hMouse);

2.系统钩子的创建过程:

运行机制:DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。当进程在载入DLL时,操作系统自动把DLL地址映射到该进程的私有空间,也就是进程的虚拟地址空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间。也就是说每个进程所拥有的相同的DLL的全局数据,它们的名称相同,但其值却并不一定是相同的,而且是互不干涉的。因此,在Win32环境下要想在多个进程中共享数据,就必须进行必要的设置。在访问同一个Dll的各进程之间共享存储器是通过存储器映射文件技术实现的。也可以把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。必须给这些变量赋初值,否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数据段中。#pragma data_seg预处理指令用于设置共享数据段。例如:

#pragma data_seg("SharedDataName")

HHOOK hHook=NULL;

#pragma data_seg()

在#pragma data_seg("SharedDataName")和#pragma data_seg()之间的所有变量将被访问该Dll的所有进程看到和共享。再加上一条指令

#pragma comment(linker,"/section:.SharedDataName,rws")

那么这个数据节中的数据可以在所有DLL的实例之间共享。所有对这些数据的操作都针对同一个实例的,而不是在每个进程的地址空间中都有一份。

 

系统钩子的创建需要将钩子的放在DLL中,因此其重建构成需要两部分:1.编写程序,生成Dll;2.编写应用程序调用Dll中的函数

2.1 DLL中的代码的编写

方案 1:源代码:http://download.csdn.net/detail/nuptboyzhb/4202102

1.       新建一个扩展MFC类型DLL工程;

2.       将DLL的句柄参数和要安装钩子的句柄声明为共享数据:

#pragma data_seg("Titlename") //名称任意起

        HHOOK glhHook=NULL; //安装的鼠标钩子句柄

        HINSTANCE glhInstance=NULL;//DLL实例句柄

#pragma data_seg()

注意:共享数据必须初始化,否则微软编译器会把没有初始化的数据放到.BSS段中,从而导致多个进程之间的共享行为失败。

3.       新建一个CMouseHook的导出类,用于实现钩子的安装和卸载

class AFX_EXT_CLASS CMouseHook:public CObject //AFX_EXT_CLASS**宏声明类为导出类**

{

public:

       CMouseHook();//钩子类的构造函数

       ~CMouseHook();//钩子类的析构函数

       BOOL StartHook(HWND hWnd);//安装钩子函数

       BOOL StopHook();//卸载钩子函数

};

注意:AFX_EXT_CLASS用于声明该类为导出类;

4.       编写安装钩子,卸载钩子,钩子过程的函数

安装钩子:glhHook=SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0);

卸载钩子:UnhookWindowsHookEx(glhHook);

钩子过程:

//鼠标钩子函数的实现

LRESULT CALLBACK MouseProc(int nCode,WPARAM wparam,LPARAM lparam)

{

    LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam;

    if (nCode>=0)

    {

             //处理过程的代码…..

    }

    return CallNextHookEx(glhHook,nCode,wparam,lparam); //继续传递消息

}

2.2 主程序的调用

新建一个应用程序,将上述生成的.dll文件和.lib文件及类声明的文件.h拷贝到当前目录中,并在头文件中包含生成的类声明.h文件;静态方式加载动态链接库

#pragma comment(lib,"MousehookDll.lib")   //隐式链接DLL

然后就可以声明一个由DLL文件导出的类CMouseHook的一个变量;然后在应用程序的初始化函数中调用该变量的StartHook函数安装钩子;在需要取消钩子的地方,调用StopHook()函数;

附录:钩子过程函数参数详解

从上面的步骤中可以看到,钩子的安装和卸载是一个较为固定格式和步骤;真正关键的是:不同的钩子类型,回调函数的参数意义不同,那我们就一一介绍各个参数的意义吧!

a.       **MouseProc(int nCode,WPARAM wparam,LPARAM lparam)WH_MOUSE**

1.nCode 跟所有其他钩子处理函数一样,只要记得当 nCode小于0时:调用CallNextHookEx()就可以了。

HC_ACTION nCode等于HC_ACTION时,wParam和lParam 包含鼠标信息   HC_NOREMOVE 当nCode等于HC_NOREMOVE时,wParam和lParam 包含鼠标信息,并且鼠标消息没有从消息队列里移除

2. wParam 指定鼠标消息ID

3. lParam 一个MOUSEHOOKSTRUCT 结构的指针

  typedef struct tagMOUSEHOOKSTRUCT {

    POINT     pt; //保存鼠标在屏幕上的x,y坐标

    HWND      hwnd; //接收到鼠标消息的窗口的句柄

    UINT      wHitTestCode; //详细描述参见WM_NCHITTEST消息

    ULONG_PTR dwExtraInfo; //指定与本消息联系的额外消息

} MOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;

 

b.      **KeyboardProc(int nCode,WPARAM wparam,LPARAM lparam) WH_KEYBOARD**

2.wParam:按键的虚拟键值消息,例如:VK_F1 VK_F2 等;

3. lParam:32位内存,内容描述包括:指定扩展键值,扫描码,上下文,重复次数。

0-15位:描述:按下键盘次数。

16-23位:指定扫描码. 依赖于OEM

24位:当24位为1时候:表示按键是扩展键;当24位为0时候:表示按键是数字键盘按键

25-28位:保留位

29位:上下文键:为1时: ALT按下,其他情况为0

30位:如果是按键按下后发送的消息,30位为0,如果是按键抬起后30位为1;

31位:指定转变状态;31位为0时候,按键正在被按下,为1时候,按键正在被释放

c.       **GetMsgProc(int nCode,WPARAM wparam,LPARAM lparam) WH_GETMESSAGE**

 2.wParam:标明消息是否从消息对列中取出,它有如下两个值:

           PM_NOREMOVE:未从消息队列中取出

           PM_REMOVE:已经从消息队列中取出

3. lParam: 它是指向MSG结构体的一个指针

typedef struct tagMSG {

  HWND   hwnd; //接收消息的窗口句柄

  UINT   message; //消息的标识,如WM_CLOSE等

  WPARAM wParam;// 指定消息的附加信息

  LPARAM lParam; // 不同的消息不一样;

  DWORD  time; //消息投递到消息队列中的时间

  POINT  pt; //消息投递到消息队列中时的鼠标位置(屏幕坐标)

} MSG, *PMSG;

d.      **未完待续…**

本文由葡京网投哪个正规发布于首页,转载请注明出处:简易Windows密码查看器,MFC线程钩子和全局钩子【葡京网投哪个正规】

关键词:

上一篇:VC视频教程笔记【葡京正网网投】,为什么只有Thread1一直在执行而Thread2

下一篇:CFileDialog文件选择对话框的使用,VC的若干实用小技巧