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.ODBC,ADO简介:ADO可以认为是建立在ODBC上的。
ADO的三个核心对象
Connection对象
Connection对象表示了到数据库的连接,它管理应用程序和数据库之间的通信。 Recordset和Command对象都有一个ActiveConnection属性,该属性用来引用Connection对象。
Command对象
Command对象被用来处理重复执行的查询,或处理需要检查在存储过程调用中的输出或返回参数的值的查询。
Recordset对象
Recordset对象被用来获取数据。 Recordset对象存放查询的结果,这些结果由数据的行(称为记录)和列(称为字段)组成。每一列都存放在Recordset的Fields集合中的一个Field对象中。
b.演示在VB中使用ADO的方法,方法比较简单,使用方便。另外在VB中演示了Connection和Command和Recordset的方法,用这三种方法都可以执行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.tlh和MSADO15.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<windows.h> 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<windows.h> 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 hook EXPORTS setHook @10086
把这两个复制到工程目录下:
基于MFC的对话框中的
#pragma comment(lib,"hook.lib")
OnInitDialog函数前声明:(也可以使用19章的方法,动态调用)
_declspec(dllimport) void setHook();
OnInitDialog函数中,调用
setHook();
结果就是,所有的线程都不能使用鼠标。这个时候,按回车或空格退出。
下面再添加一个全局的键盘钩子
#include<windows.h> 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文件添加一句
SEGMENTS MySec READ WRITE SHARED
这样就是一个完美的恶搞程序了,贴上一张熊猫烧香的图片,并放在别的电脑开机启动文件夹里面,。。。哇卡卡卡,我不是这样的人,后果自负