2.3.3 实现原理
Windows下应用程序有自己的地址空间,它们只能调用自己地址空间中的函数,所以在挂钩API之前,必须将一个可以代替API执行代码注入到目标进程,然后再想办法将目标进程对该API的调用改为对注入到目标进程中自定义函数的调用。一般称这个自定义函数为代理函数。在代理函数中,可以去调用原来的API,也可以做其他事情。
在这个要被注入到目标进程的DLL中写一个与感兴趣的API函数的签名完全相同的函数(代理函数),当DLL执行初始化代码的时候,把目标进程对这个API的调用全部改为对代理函数的调用,即可实现拦截API函数。Hook API示意图如图2。
图2 Hook API示意图
2.4 Detours技术
2.4.1 Detours技术原理
Detours是一种基于Inline Hook技术,在x86平台上截获任意Win32函数调用的软件包。它定义了三个概念:
(1) Target函数:要拦截的函数,通常为Windows的API 。
(2) Trampoline函数:Target函数的部分复制品。因为Detours将会改写Target函数,所以先把Target函数的前5个字节复制保存好,一方面仍然保存Target函数的过程调用语义,另一方面便于以后的恢复。
(3) Detour函数:用来替代Target函数的函数。
它的中断代码在运行时动态加载。它使用了一个无条件转移指令(JMP)来替换目标函数的最初几条指令,将控制流转移到用户提供的Detour函数。 Target函数中的一些指令被保存在Trampoline函数中,这些指令包括目标函数中被替换的代码以及一个专业到目标函数的无条件分支。Trampoline函数中还可以包括作为功能扩展的代码。可以根据需要,在Detour函数中自行决定调不调用目标函数。当将Target函数作为可调用分支时,调用流程为1→2→3→4→5→6 ,当不作为可调用分支时,调用流程为1→2→6。采用Detours技术拦截函数前后,函数调用过程如图3所示 。
图3 Detours拦截后程序执行流程
Detours原理图如图4.
图4 Detours原理图
已知当前执行的代码都会被调入内存执行,运行时动态加载Detour函数,则目标函数的更改并不会影响到其他应用程序对Target函数的调用,具有很强的可执行性。
2.5 Windows消息机制
(1) 消息队列
Windows中有一个系统消息队列,对于没一个正在执行的Windows应用出曾向,系统为其建立了一个“消息队列”,即应用程序中一段称作“消息循环”的代码,用来从消息队列中检索这些消息并将它们分发到相应的窗口函数中。
(2) 消息循环
Windows为当前执行的每个Windows程序文护一个「消息队列」。在发生输入事件之后,Windows将事件转换为一个「消息」并将消息放入程序的消息队列中。程序通过执行一块称之为「消息循环」的程序代码从消息队列中取出消息。
(3) 队列化消息与非队列化消息
消息消息能够被分为「队列化的」和「非队列化的」队列化的消息是由Windows放入程序消息队列中的。在程序的消息循环中,重新传回并分配给窗口消息处理程序。非队列化在Windows呼叫窗口时直接送给窗口消息处理程序。也就是说,队列化的消息被「发送」给消息队列,而非队列化的消息则「发送」给窗口消息处理程序。任何情况下,窗口消息处理程序都将获得窗口所有的消息--包括队列化的和非队列化的。窗口消息处理程序是窗口的「消息中心」。
队列化消息基本上是使用者输入的结果,以击键(如WM_KEYDOWN和WM_KEYUP消息)、击键产生的字符(WM_CHAR)、鼠标移动(WM_MOUSEMOVE)和鼠标按钮(WM_LBUTTONDOWN)的形式给出。队列化消息还包含时钟消息(WM_TIMER)、更新消息(WM_PAINT)和退出消息(WM_QUIT)。 Detours私密文件访问监控程序的实现(4):http://www.751com.cn/jisuanji/lunwen_7109.html