Dll与Hook

来源:互联网 发布:淘宝美工工作内容 编辑:程序博客网 时间:2024/04/29 10:25

      最近看了孙鑫的视频,学习了一下DLL和HOOK的一些知识,故此做下笔记。下面以add,sub两函数和Point类为例。

一,Dll的简单使用

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

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

 

    在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:非全局钩子

 

例子2:全局钩子

在.DEF文件中

SetHook  @2

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

SEGMENTS

MySec   READ WRITE SHARED

意思共享在.DLL中的MySec。

原创粉丝点击