Dll与Hook

一,Dll的简单使用

      使用 一个DLL,一般需要另外两个文件.H和.LIB。.H文件或.LIB文件。.H文件可用于使用.DLL的客户或是.DLL文件本身,其作用编译时期。.LIB文件是一个引入苦,用于客户程序,作用在链接时期。.DLL文件当然作用于运行时期了。

    打开VS2008,选择Win32,DLL空项目。新建一个DLL.CPP和DLL.H文件。

[c-sharp]  view plain copy
  1. //DLL.H  
  2. #ifdef DLL_API  
  3. #else  
  4. #define DLL_API  _declspec(dllimport)  
  5. #endif  
  6.   
  7. DLL1_API int add(int a,int b);  
  8. DLL1_API int subtract(int a,int b);  
  9.   
  10. class DLL1_API Point  
  11. {  
  12. public:  
  13.     void output(int x,int y);  
  14. };  
  15.   
  16. //DLL.CPP  
  17. #define DLL_API  _declspec(dllexport)  
  18. #include "Dll.h"  
  19. #include <stdio.h>  
  20.   
  21. int  add(int a,int b)  
  22. {  
  23.     return a+b;  
  24. }  
  25.   
  26. int  subtract(int a,int b)  
  27. {  
  28.     return a-b;  
  29. }  
  30.   
  31. void Point::output(int x,int y)  
  32. {  
  33.     printf("x = %d,y = %d",x,y);  
  34. }  
  35.   
  36. //Dll应用端  
  37. #include <iostream>  
  38. #include "Dll.h"  
  39. using namespace std;  
  40. //加载动态链接库  
  41. #pragma comment(lib,"Dll.lib")  
  42.   
  43. int main()  
  44. {  
  45.     cout<<add(2,3);  
  46.     Point p;  
  47.     p.output(2,3);  
  48. }  

 

    在C++中对函数名字的解析和C语言中方式不一样,因为C++支持重载的缘故,为了不同的语言都可以使用同一个DLL,我可以这样:

在.H文件里更改为:#define DLL_API extern "C" _declspec(dllimport)

在.CPP文件里更正为:#define DLL_API extern "C" _declspec(dllexport)

注意:C一定要大写,这样导出函数名是以C命名的方式。


    在不同的不同的语言中,函数的调用规则是不一样的,在C语言中式C调用规则,在Dephi中是PASCAL(标准调用)调用规则中,为了不同的语言可以使用同一个DLL,我们需要更改函数的调用规则,例如:

.H文件中:DLL1_API int _stdcall add(int a,int b);

.CPP文件中实现add实现时也应加入_stdcall。

但这样会更改导出的函数名,这又与extern "C"向冲突。

 

解决上述文件的方式是是用.DEF文件,在vs2008中,可以新建一个,格式如下:

LIBRARY “Dll”

EXPORTS
add
subtract

 

使用动态DLL,有两种方式,隐式调用和显示调用。

#pragma comment(lib,"Dll.lib")
这是隐式的,程序启动时,把所有的函数都映射进去,但有时我们只需要一个,不必要这么多,这是使用显示调用。

使用显示调用,要使用以下两个函数:

1.HMODULE WINAPI LoadLibrary(LPCTSTR lpFileName);

2.FARPROC WINAPI GetProcAddress(HMODULE hModule, LPCSTR lpProcName);

 

 

二,Hook的简单使用

先看一个函数:

HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod, DWORD dwThreadId);

参数意义:

idHook参数可以取如下常量:
WH_CALLWNDPROC     //窗口钩子,当系统向目标窗口发送消息时将触发此钩子
WH_CALLWNDPROCRET     //窗口钩子,当窗口处理完消息后将触发此钩子
WH_CBT   //当Windows激活、产生、释放(关闭)、最小化、最大化或改变窗口时都将触发此事件
WH_DEBUG    //调试钩子
WH_GETMESSAGE    //当往消息队列中增加一个消息时将触发此钩子
WH_JOURNALPLAYBACK     //回放钩子,可以用于播放已记录的鼠标和键盘的操作
WH_JOURNALRECORD     //记录钩子,可以用于记录鼠标和键盘的操作,木马程序可以使用此钩子窃取受控方在屏幕中敲入的密码
WH_KEYBOARD     //当敲击键盘时将触发此钩子
WH_MOUSE    //当有鼠标操作时将触发此钩子
WH_MSGFILTER   //消息过滤钩子
WH_SHELL   //Shell钩子
WH_SYSMSGFILTER    //系统消息过滤钩子

lpfn参数

是一钩子过程,不同的钩子有不同的钩子过程。如果是全局钩子,该函数在DLL中,如果不是在当前进程中。

hMod参数:

指向DLL的句柄,如果dwThreadId是当前进程的一个线程ID并且钩子处理函数在当前进程中,hMod一定要为NULL。

dwThreadId参数:

如果是全局钩子该参数就为0,如果不是就是当前进程的一个线程ID

 

2.卸载一个HOOL

BOOL UnhookWindowsHookEx(HHOOK hhk);

 

例子1:非全局钩子

[cpp]  view plain copy
  1. // InnerHookDlg.cpp  
  2. HHOOK g_hMouse;  
  3. HWND g_hWnd=NULL;  
  4.   
  5. LRESULT CALLBACK MouseProc(  
  6.   int nCode,      // hook code  
  7.   WPARAM wParam,  // message identifier  
  8.   LPARAM lParam   // mouse coordinates  
  9. )  
  10. {  
  11.     return 1;  
  12. }  
  13.   
  14. LRESULT CALLBACK KeyboardProc(  
  15.   int code,       // hook code  
  16.   WPARAM wParam,  // virtual-key code  
  17.   LPARAM lParam   // keystroke-message information  
  18. )  
  19. {  
  20.     //if(VK_SPACE==wParam || VK_RETURN==wParam)  
  21.          //Alt+F4  
  22.     /*if(VK_F4==wParam && (1==(lParam>>29 & 1))) 
  23.         return 1; 
  24.     else 
  25.         return CallNextHookEx(g_hKeyboard,code,wParam,lParam);*/  
  26.           
  27.         //按F2退出程序  
  28.     if(VK_F2==wParam)  
  29.     {  
  30.         ::SendMessage(g_hWnd,WM_CLOSE,0,0);  
  31.         UnhookWindowsHookEx(g_hKeyboard);  
  32.         UnhookWindowsHookEx(g_hMouse);  
  33.     }  
  34.     return 1;  
  35. }  
  36.   
  37.   
  38. BOOL CInnerHookDlg::OnInitDialog()  
  39. {  
  40.     //...............  
  41.     g_hWnd=m_hWnd;  
  42.     g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());  
  43.     g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());  
  44.     return TRUE;  
  45. }  

 

例子2:全局钩子

[cpp]  view plain copy
  1. //Hook.CPP  
  2.   
  3. #include <windows.h>  
  4.   
  5. HHOOK g_hMouse=NULL;  
  6. HHOOK g_hKeyboard=NULL;  
  7.   
  8. //共享g_hWnd  
  9. #pragma data_seg("MySec")  
  10. HWND g_hWnd=NULL;  
  11. #pragma data_seg()  
  12.   
  13.   
  14. LRESULT CALLBACK MouseProc(  
  15.   int nCode,      // hook code  
  16.   WPARAM wParam,  // message identifier  
  17.   LPARAM lParam   // mouse coordinates  
  18. )  
  19. {  
  20.     return 1;  
  21. }  
  22.   
  23. LRESULT CALLBACK KeyboardProc(  
  24.   int code,       // hook code  
  25.   WPARAM wParam,  // virtual-key code  
  26.   LPARAM lParam   // keystroke-message information  
  27. )  
  28. {  
  29.     if(VK_F2==wParam)  
  30.     {  
  31.         SendMessage(g_hWnd,WM_CLOSE,0,0);  
  32.         UnhookWindowsHookEx(g_hMouse);  
  33.         UnhookWindowsHookEx(g_hKeyboard);  
  34.     }  
  35.     return 1;  
  36. }  
  37.   
  38. void SetHook(HWND hwnd)  
  39. {  
  40.     g_hWnd=hwnd;  
  41.     g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);  
  42.     g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0);  
  43. }  
  44.   
  45. //.DEF  
  46. LIBRARY Hook  
  47. EXPORTS  
  48. SetHook     @2  
  49. SEGMENTS  
  50. MySec   READ WRITE SHARED  

在.DEF文件中

SetHook  @2

意思是制定SetHook在DLL中的位置

SEGMENTS

MySec   READ WRITE SHARED

意思共享在.DLL中的MySec。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值