我的学习笔记_Windows_HOOK计划 2009-12-03 11:19
进程内钩子用于监视指定线程的事件消息。它的钩子过程一般位于当前线程或当前线程创建的线程中。
全局钩子监视系统中全部线程的消息。由于全局钩子会影响系统中全部的应用程序,所以钩子过程必须放在独立的动态链接库(DLL) 中。系统会自己主动将这个含有钩子过程(实质上是回调函数)的DLL映射到受钩子过程影响的全部进程的地址空间中,也就是将这个DLL注入全部进程。
几点说明:
1. 假设对于同一消息(如鼠标消息)既安装了进程内钩子又安装了全局钩子,那么系统会优先调用进程内钩子,然后调用全局钩子。
2. 对于同一消息而言,能够安装多个钩子,消息被当前钩子的钩子过程处理完成后应该把这个消息继续传递给下一个钩子。
3. 钩子特别是全局钩子会减少消息处理效率,影响系统性能,因此仅仅有在必要的时候才安装钩子,在使用完成后应及时卸载。
int idHook, // type of hook to install
HOOKPROC lpfn, // address of hook procedure
HINSTANCE hMod, // handle to application instance
DWORD dwThreadId // identity of thread to install hook for
);
int idHook, // type of hook to install
HOOKPROC lpfn, // address of hook procedure
HINSTANCE hMod, // handle to application instance
DWORD dwThreadId // identity of thread to install hook for
);
BOOL UnhookWindowsHookEx(
HHOOK hhk // handle to hook procedure to remove
);
简单说明:
UnhookWindowsHookEx()函数用于从系统中卸载钩子;
hhk參数是要被卸载的钩子的句柄,也就是SetWindowsHookEx()的返回值;
最后,假设这个函数运行成功会返回非零值,假设运行失败会返回零值,用户能够通过调用GetLastError()函数获知详情。
<未完待续>
2.在OnInitDialog()中加入代码:
g_hMouse = SetWindowsHookEx(WH_MOUSE, MouseProc, NULL, GetCurrentThreadId()); //设置了鼠标钩子
g_hKeyboard = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, GetCurrentThreadId()); //设置了键盘钩子
HHOOK g_hKeyboard=NULL;
HHOOK g_hMouse;
HWND g_hWnd=NULL;
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{
return 1;
}
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.编写一个屏屏蔽全部进程和全部线程的钩子程序。耸闭飧龉匙颖匦氚沧霸贒LL中,然后被某个程序调用才行。
1.新建一个DLLproject名为Hook
2.添加Hook.cpp
3.代码例如以下:
#include <windows.h>包括头文件
HHOOK g_hKeyboard=NULL;
HWND g_hWnd=NULL;这个变量是全局共享的。
#pragma data_seg()
/*HINSTANCE g_hInst;
HINSTANCE hinstDLL, // handle to the DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved // reserved
)
{
g_hInst=hinstDLL;
}*/
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{
return 1;拦截了鼠标消息。
}
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;
}
{
g_hWnd=hwnd;注意这样的传递调用它的进程的句柄的方法,比較巧妙!
g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);
g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0);
}
LIBRARY Hook
EXPORTS
SetHook @2
SEGMENTS
MySec READ WRITE SHARED 也能够设置节的属性。
4.新建一个project调用此钩子函数。project名为HookTest,基于对话框的。在OnInitDialog()中调用SetHook(),要事先声明_declspec(dllimport) void SetHook(HWND hwnd);
然后在Project->Setting->Link->增加../Hook/Debug/Hook.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就可以。
我的学习笔记_Windows_HOOK计划 2009-12-03 11:19的更多相关文章
- 《python基础教程(第二版)》学习笔记 文件和素材(第11章)
<python基础教程(第二版)>学习笔记 文件和素材(第11章) 打开文件:open(filename[,mode[,buffering]]) mode是读写文件的模式f=open(r' ...
- [原创]java WEB学习笔记38:EL 中的 11个 隐含对象 详解
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- 我的学习笔记_Windows_HOOK编程 2009-12-03 11:19
一.什么是HOOK? "hook"这个单词的意思是"钩子","Windows Hook"是Windows消息处理机制的一个重要扩展,程序猿能 ...
- 前端学习笔记系列一:12 js中获取时间new date()的用法
获取时间: 1 var myDate = new Date();//获取系统当前时间 获取特定格式的时间: 1 myDate.getYear(); //获取当前年份(2位) 2 myDate.get ...
- shell脚本调试 分类: 学习笔记 linux ubuntu 2015-07-14 12:49 53人阅读 评论(0) 收藏
1.sh -x script 这将执行脚本并显示所有变量的值 如,脚本: #!/bin/bash #a test about shift if [ $# -le 0 ] then echo " ...
- 再起航,我的学习笔记之JavaScript设计模式12(适配器模式)
适配器模式 适配器模式(Adapter): 将一个类(对象)的接口(方法或属性)转化成为另外一个接口,使类(对象)之间接口的不兼容问题通过适配器得以解决. 适配相似的框架 不知道大家有没有遇到过这种场 ...
- ThinkPHP - 4 - 学习笔记(2015.4.12)
ThinkPHP D方法 D方法用于实例化自定义模型类,是ThinkPHP框架对Model类实例化的一种封装,并实现了单例模式,支持跨项目和分组调用,调用格式如下:D('[项目://][分组/]模型' ...
- MALL的学习笔记启动计划
基本网络文档:http://www.macrozheng.com/#/ 电子书: Spring: <Spring实战(第4版)> Springboot: <Spring Boot实战 ...
- iOS 学习笔记 十 (2015.04.03)xcode第三方插件
1.xcode第三方插件,存放路径:~/Library/Application Support/Developer/Shared/Xcode/Plug-ins
随机推荐
- 做web项目时对代码改动后浏览器端不生效的应对方法(持续更新)
做web项目时,常常会遇到改动了代码,但浏览器端没有生效,原因是多种多样的,我会依据我遇到的情况逐步更新解决的方法 1.执行的时候採用debug模式,普通情况下使用项目部署button右边那个butt ...
- 带有机器人框架的.NET自己主动化測试
Clayton Neal在软件測试和质量保证方面有超过13年的经验,当中有八年的Windows, web,和移动应用程序的測试自己主动化经验.他在測试领域的全部等级都工作过.近期他在Bloomberg ...
- js获取并设置<p></p>的显示的值。
原文链接:http://www.nowamagic.net/librarys/posts/jquery/23 html()方法 此方法类似于JavaScript中的innerHTML属性,能够用来读取 ...
- android json 解析 简单示例
1 下面是一个简单的json 解析的demo,废话不多说,直接上代码 package com.sky.gallery; import java.io.ByteArrayOutputStream; im ...
- Ajax 下拉列表联动显示
一般处理程序文件 代码 using System;using System.Web;using System.Linq;using System.Data.Linq;using System.Text ...
- 程序启动读取和关闭时保存应用程序设置(QSettings)
保存应用程序设置(QSettings)1. QSettings 类 QSettings 提供保存应用程序当前设置的接口,可以方便地保存程序的状态,例如窗口大小和位置,选项的选中状态等等.在 Windo ...
- python爬虫抓站的一些技巧总结
使用python爬虫抓站的一些技巧总结:进阶篇 一.gzip/deflate支持现在的网页普遍支持gzip压缩,这往往可以解决大量传输时间,以VeryCD的主页为例,未压缩版本247K,压缩了以后45 ...
- [Cocos2d-x]博客推荐
推荐一下大神们的博客: JackyStudio: http://blog.csdn.net/jackyvincefu/article/category/1591201/3 老G的小屋: http:// ...
- oschina图形和图像工具开源软件
图形和图像工具开源软件 http://www.oschina.net/project/tag/181/imagetools?sort=view&lang=21&os=0
- JavaScript 中的事件类型5(读书笔记思维导图)
Web 浏览器中可能发生的事件有很多类型.如前所述,不同的事件类型具有不同的信息,而“ DOM3级事件”规定了以下几类事件. UI(User Interface,用户界面)事件:当用户与页面上的元素交 ...