2.2 DLL
2.2.1 DLL简介
DLL即动态链接库,是微软公司在微软视窗操作系统中实现贡献函数库概念的一种实作方式。使用动态链接库时,连接器仅仅在可执行文件中打上标志,说明需要使用哪些动态链接库,当运行程序时,加载器根据这些标志把所需的动态链接库加载到内存,而不会产生多份冗余拷贝。它是应用程序的一部分,其任何操作都是代表应用程序进行的。所有动态链接库在本质上与可执行文件没有区别,都是作为模块被进程加载到自己的空间地址的。动态链接库在程序编译时并不会被插入到可执行文件中,在程序运行时整个库的代码才会调入内存,这便是“动态链接”。如果有多个程序用到同一个动态链接库,Windows在物理内存中只保留一份库的代码,仅通过分页机制将这份代码映射到不同的进程中。这样,不管有多少程序同时使用一个库,库代码实际占用的物理内存只有一份。
动态链接库的主要功能是向外导出函数,供进程中的其他模块使用。
2.2.2 使用导出函数
调用DLL中的导出函数有两种办法:
(1) 装载期间动态链接。模块可以像调用本地函数一样调用从其他模块导出的函数。装载期间链接必须使用DLL的导入库(.lib文件),它为系统提供了加载这个DLL和定位DLL中的导出函数所需的信息。
(2) 运行期间动态链接类模块也可以使用LoadLibrary或者LoadLibraryEx函数在运行期间加载这个DLL。DLL被加载之后,加载模块调用GetProcAddress函数取得DLL导出函数的地址,然后通过函数地址调用DLL中的函数。
2.3 钩子
钩子(Hook),是Windows消息处理机制中的一个平台,应用程序可在这里安装一个子程序(钩子函数)以监视指定窗口某种类型的消息,所监视的窗口可以是其他进程创建的。当消息到达后,在目标窗口处理函数处理之前,钩子机制允许应用程序截获它进行处理。
钩子函数是一个处理消息的程序段,通过相关API函数,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息。即钩子函数先得到控制权。这是钩子函数既可以加工处理该消息,也可以不做处理而继续传递该消息。
每个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统文护。这个列表的指针指向指定的、应用程序定义的、被Hook子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。
2.3.1 HOOK过程
为了拦截特定的消息,可以使用SetWindowsHookEx函数在该类型的Hook链中安装自己的Hook函数,SetWindowsHookEx总是将Hook函数放在Hook链的顶端。可以使用CallNextHookEx函数将系统消息传递给Hook链中的下一个函数。
全局Hook函数可以拦截系统中所有线程的某个特定的消息,(此时该Hook函数必须放置在DLL中,也可以放置在应用程序的模块段)。
2.3.2 挂钩API技术
API Hook是指截获特定进程或系统对某个API函数的调用,使得API的执行流程转向指定的代码。例如,在挂钩了系统对User32.dll模块中 MessageBoxA 函数的调用以后,每当有应用程序调用MessageBoxA 函数,调用线程都会执行用户提供的代码,而不去执行真正的 MessageBoxA API函数。
Windows下的应用程序都简历在API函数之上,所以截获API是很有用的技术,它使得用户有机会干预其他应用程序的程序流程。 Detours私密文件访问监控程序的实现(3):http://www.751com.cn/jisuanji/lunwen_7109.html