MFC(HOOK和数据库访问,孙鑫C++第二十讲笔记整理)
发布日期:2021-06-29 04:15:21 浏览次数:2 分类:技术文章

本文共 8472 字,大约阅读时间需要 28 分钟。

1.Hook简介:作用是拦截某些消息,关键函数是SetWindowsHookEX()

 

2.示例程序:

  a.新建一基于对话框工程,InnerHook,此过程的钩子是只拦截本进程的。

  b.OnInitDialog()中添加代码:

   g_hWnd=m_hWnd;

 g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());设置了鼠标钩子

 g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());设置了键盘钩子

 

  c.完成钩子函数的编写:

 HHOOK g_hKeyboard=NULL;

 HHOOK g_hMouse;

 HWND g_hWnd=NULL;

 

 LRESULT CALLBACK MouseProc(

   int nCode,      // hook code

   WPARAM wParam,  // message identifier

   LPARAM lParam   // mouse coordinates

 )

 {

  return 1;

 }

 

 LRESULT CALLBACK KeyboardProc(

   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.编写一个屏屏蔽所有进程和所有线程的钩子程序。此时这个钩子必须安装在DLL中,然后被某个程序调用才行。

  a.新建一个DLL工程名为Hook

  b.增加Hook.cpp

  c.代码如下:

 #include <windows.h>包含头文件

 

 HHOOK g_hMouse=NULL;

 HHOOK g_hKeyboard=NULL;

 

 #pragma data_seg("MySec")新建了一个节,用于将下面的这个变量设为全局共享。

 HWND g_hWnd=NULL;这个变量是全局共享的。

 #pragma data_seg()

 

 //#pragma comment(linker,"/section:MySec,RWS")

 /*HINSTANCE g_hInst;

 

 BOOL WINAPI DllMain(

   HINSTANCE hinstDLL,  // handle to the DLL module

   DWORD fdwReason,     // reason for calling function

   LPVOID lpvReserved   // reserved

 )

 {

  g_hInst=hinstDLL;

 }*/

 

 LRESULT CALLBACK MouseProc(

   int nCode,      // hook code

   WPARAM wParam,  // message identifier

   LPARAM lParam   // mouse coordinates

 )

 {

  return 1;拦截了鼠标消息。

 }

 

 LRESULT CALLBACK KeyboardProc(

   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;

 }

 

 void SetHook(HWND hwnd)此函数设置了钩子。

 {

  g_hWnd=hwnd;注意这种传递调用它的进程的句柄的方法,比较巧妙!

  g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);

  g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0);

 } Hook.DEF的代码如下:

 LIBRARY Hook

 EXPORTS

 SetHook  @2

 SEGMENTS

 MySec READ WRITE SHARED 也可以设置节的属性。

    d.新建一个工程调用此钩子函数。工程名为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);

    e.DLL的调试方法,设置断点,然后运行时断点时,step into即可。

 

4.数据库编程

  a.ODBCADO简介:ADO可以认为是建立在ODBC上的。

   ADO的三个核心对象

 Connection对象

   Connection对象表示了到数据库的连接,它管理应用程序和数据库之间的通信。 RecordsetCommand对象都有一个ActiveConnection属性,该属性用来引用Connection对象。

 Command对象

   Command对象被用来处理重复执行的查询,或处理需要检查在存储过程调用中的输出或返回参数的值的查询。

 Recordset对象

   Recordset对象被用来获取数据。 Recordset对象存放查询的结果,这些结果由数据的行(称为记录)和列(称为字段)组成。每一列都存放在RecordsetFields集合中的一个Field对象中。

  b.演示在VB中使用ADO的方法,方法比较简单,使用方便。另外在VB中演示了ConnectionCommandRecordset的方法,用这三种方法都可以执行SQL语句。

  c.VC中利用ADO访问数据库。

    aa.新建一个基于对话框的工程,名为ADO

    bb.在对话框中放一ListBox和一个Button控件。

    cc.在使用时须导入MSADO15.dll,方法是在StdAfx.h#import "D:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")

    至少于将EOF改名为rsEOF,是为了避免与文件中的EOF重名。然后编译程序,将产生的debug目录下的两个文件MSADO15.tlhMSADO15.tli加到工程中,其目的只是方便我们查看而已。并不是编译需要它。

    ADO也是COM组件,须初始化COM库方法是CoInitialize(NULL);使用完后须CoUninitialize();

   代码如下:

    void CAdoDlg::OnBtnQuery()

{

 // TOD Add your control notification handler code here

 CoInitialize(NULL);初始化

 _ConnectionPtr pConn(__uuidof(Connection));产生connection智能指针

 _RecordsetPtr pRst(__uuidof(Recordset));产生recordset智能指针

 _CommandPtr pCmd(__uuidof(Command));产生command智能指针 pConn->ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=pubs";数据库信息

 pConn->Open("","","",adConnectUnspecified);打开数据库 //pRst=pConn->Execute("select * from authors",NULL,adCmdText);用记录集查询数据

 //pRst->Open("select * from authors",_variant_t((IDispatch*)pConn),

 // adOpenDynamic,adLockOptimistic,adCmdText);

 pCmd->put_ActiveConnection(_variant_t((IDispatch*)pConn));

 pCmd->CommandText="select * from authors";用这种方法也可以查询数据

 pRst=pCmd->Execute(NULL,NULL,adCmdText);

 while(!pRst->rsEOF)将查询到的数据加到列表框咯。

 {

  ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(

   (_bstr_t)pRst->GetCollect("au_lname"));

  pRst->MoveNext();

 }

 

 pRst->Close();

 pConn->Close();

 pCmd.Release();

 pRst.Release();

 pConn.Release();

 CoUninitialize();

}

 

下面是具体的步骤:

SetWindowsHookEx;

1新建一个基于对话框的MFC程序

2然后在其OnInitDialog中 添加

SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());

3在OnInitDialog前面添加MouseProc函数

LRESULT CALLBACK MouseProc(						   int nCode,      // hook code						   WPARAM wParam,  // message identifier						   LPARAM lParam   // mouse coordinates						   ){	return 1;//表示已经处理过了}

这样运行程序就不能用鼠标控制。

 

下面添加一个项目键盘的钩子:

HHOOK g_hkeyboard=NULL;//用来接收返回的HOOK句柄

OnInitDialog函数中,

g_hkeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());

 

LRESULT CALLBACK KeyboardProc(							  int code,       // hook code							  WPARAM wParam,  // virtual-key code							  LPARAM lParam   // keystroke-message information							  ){	return 1;}

这个时候,运行程序窗口,既不能使用鼠标又不能使用键盘。

LRESULT CALLBACK KeyboardProc(							  int code,       // hook code							  WPARAM wParam,  // virtual-key code							  LPARAM lParam   // keystroke-message information							  ){	if(VK_SPACE==wParam||VK_RETURN==wParam)//屏蔽了空格键和回车键		return 1;	else		return CallNextHookEx(g_hkeyboard,code,wParam,lParam);}

下面给回车留一个退路:

HWND hwnd;//用来保存对话框的句柄

OnInitDialog中接收

hwnd=m_hWnd;

 

LRESULT CALLBACK KeyboardProc(							  int code,       // hook code							  WPARAM wParam,  // virtual-key code							  LPARAM lParam   // keystroke-message information							  ){	//if(VK_SPACE==wParam||VK_RETURN==wParam)//屏蔽了空格键和回车键	if(VK_F2==wParam)		::SendMessage(hwnd,WM_CLOSE,wParam,lParam);			else		return CallNextHookEx(g_hkeyboard,code,wParam,lParam);}

这个时候按F2就能退出了。

if(VK_F4&&(lParam>>29&1))return 1;

屏蔽Alt+F4退出的按钮

可以使用

UnhookWindowsHookEx

来删除钩子

 

上面这些都是局部的钩子,下面设计一个全局的钩子,需要用到dll文件

新建一个hook.dll文件

#include
LRESULT CALLBACK MouseProc( int nCode, // hook code WPARAM wParam, // message identifier LPARAM lParam // mouse coordinates ){ return 1;}void setHook(){ SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("hook"),0);}

也可以不使用GetModulHandle来获取实例

而是

#include
HINSTANCE hInst;BOOL WINAPI DllMain( HINSTANCE hinstDLL, // handle to the DLL module DWORD fdwReason, // reason for calling function LPVOID lpvReserved // reserved){ hInst=hinstDLL;}

hook.def

LIBRARY hookEXPORTSsetHook  @10086

把这两个复制到工程目录下:

 

基于MFC的对话框中的

#pragma comment(lib,"hook.lib")

 

OnInitDialog函数前声明:(也可以使用19章的方法,动态调用)

_declspec(dllimport) void setHook();

OnInitDialog函数中,调用

setHook();

结果就是,所有的线程都不能使用鼠标。这个时候,按回车或空格退出。

下面再添加一个全局的键盘钩子

 

#include
HHOOK hmouse=NULL;HHOOK hkeyboard=NULL;HWND hwndkey;LRESULT CALLBACK MouseProc( int nCode, // hook code WPARAM wParam, // message identifier LPARAM lParam // mouse coordinates ){ return 1;}LRESULT CALLBACK KeyboardProc( int code, // hook code WPARAM wParam, // virtual-key code LPARAM lParam // keystroke-message information ){ //不能简单的返回1,这样非逼你关机不可,还是得留一个后路好 if(VK_F2==wParam) { SendMessage(hwndkey,WM_CLOSE,wParam,lParam); UnhookWindowsHookEx(hmouse); UnhookWindowsHookEx(hkeyboard); } else { return 1; }}void setHook(HWND hwnd){ hwndkey=hwnd; hmouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("hook"),0); hkeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("hook"),0);}

 

OnInitDialog函数前声明:(也可以使用19章的方法,动态调用)

_declspec(dllimport) void setHook(HWND hwnd);

OnInitDialog函数中,调用

setHook(m_hWnd);

这样,鼠标和键盘都没有反应了,只有F2是退出键,但是当用键盘的Alt+Tab组合的时候,还是有挺多软件可以使用鼠标的

可以通过SetWindowPos函数,讲对话框窗口设置成最顶层窗口和全屏,这样Alt+Tab选中其他窗口的时候,被最顶层窗口挡住了,(呵呵,恶搞程序)

在OnInitDialog添加:

int cxClient,cyClient;	cxClient=GetSystemMetrics(SM_CXSCREEN);	cyClient=GetSystemMetrics(SM_CYSCREEN);	SetWindowPos(&wndTopMost,0,0,cxClient,cyClient,SWP_SHOWWINDOW);	setHook(m_hWnd);

 

可以使得用Alt+Tab切换到其他窗口(虽然看不见),一样可以F2删除对话框

dll源文件:

#pragma data_seg("MySec")HWND hwndkey=NULL;  //添加一个结,要初始化#pragma data_seg()//#pragma comment(linker,"/setction:MySec,RWS")//设置共享节点,可读,可写,共享

或DEF文件添加一句

SEGMENTSMySec  READ  WRITE  SHARED

这样就是一个完美的恶搞程序了,贴上一张熊猫烧香的图片,并放在别的电脑开机启动文件夹里面,。。。哇卡卡卡,我不是这样的人,后果自负

 

 

转载地址:https://blog.csdn.net/zh634455283/article/details/7907593 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:TCP/IP详解(1)概述,第一章笔记整理
下一篇:MFC(动态链接库编程,孙鑫C++第十九讲笔记整理)

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月30日 18时44分31秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

2020年Security+备考经验分享(二) 2019-04-29
ITIL4,全球IT行业抢手的资格认证之一 2019-04-29
CRISC备考重点知识解读 2019-04-29
推荐信息安全书籍27本(含电子书) 2019-04-29
攻防对抗蓝队必修课——文末有文档模板分享 2019-04-29
云计算领域的安全威胁如何应对? 2019-04-29
你了解三证合一的数据保护官(DPO)吗? 2019-04-29
小白入门网络安全,需要学习哪些内容? 2019-04-29
如何找回丢失的比特币 2019-04-29
日本交易所Zaif因黑客攻击损失近6000万美元 2019-04-29
以太坊智能合约如何运作? 2019-04-29
赛迪全球公链指数第5期名单:EOS、ETH排名不变 比特股首进前3 2019-04-29
能依靠0.21个比特币生存21天吗 2019-04-29
比特币核心发现网络漏洞CVE-2018-17144 社区敦促所有节点尽快升级补丁 2019-04-29
泰达币对比特币价格的影响不具有统计意义 2019-04-29
Atitit nlp自然语言处理类库(java python nodejs c#net) 目录 1.1. Python snownlp 1 1.2. NLP.js一个nodejs/javascri 2019-04-29
Atitit nlp用到的技术与功能自然语言处理 v3 t99.docx Atitit nlp用到的技术与常见类库 目录 1. 常用的技术 1 1.1. 语言处理基础技术 分词 相似度等 1 1.2 2019-04-29
Atitit 2000drmmr v2 t05.docx Atitit 2000drmmr v1 t99 2000.1.26 hs,yweywe jla n dashw ner kl .na ni 2019-04-29
常见方案 目录 1. 发现目前 WEB 上主流的视频直播方案有 HLS 和 RTMP, 1 2. 实现直播的方法有很多,但是常用的,就这几个。 3个直播协议:rtmp、rtsp、hls。 和三个端: 2019-04-29
Atitit 直播问题总结ffmpeg 目录 1.1. 屏幕太大,可以使用-s调整分辨率 1 1.2. Full size 1 1.3. 流畅度调整 1 2. 1 2.1. 没有录音 1 2.2. 2019-04-29