我们截获函数执行最直接的目的就是为函数增添功能,修改返回值,或者为调试以及性能测试
加入附加的代码,或者截获函数的输入输出作研究,破解使用。通过访问源代码,我们可以轻而易
举的使用重建(Rebuilding)操作系统或者应用程序的方法在它们中间插入新的功能或者做功能扩
展。然而,在今天这个商业化的开发世界里,以及在只有二进制代码发布的系统中,研究人员几乎
没有机会可以得到源代码。本文主要讨论 Detour 在 Windows
二进制 PE 文件基础上的 API 截获技
术。对于 Linux
平台,作这件事情将会非常的简单,由于最初的操作系统设计者引入了
LD_PRELOAD。如果你设置 LD_PRELOAD=mylib.so ,那么应用程序在载入 dll 时,会先查看
mylib.so 的符号表,在 relocation 的时候会优先使用 mylib.so 里的 symbol 。假如你在
mylib.so 里有个 printf() ,那么这个 printf 就会替代 libc 的 printf。 而在 mylib.so 里的这个
printf 可以直接访问 libc.so 里的 printf 函数指针来获得真正的 printf 的入口地址。 这样,所有的
dll 的 API HOOK 在 loader 加载 dll 的时候就已经完成,非常自然,和平台相关的部分全部交给
loader 去处理。
一、Detour 开发库:
l&&&&&&&& 简介
Detours 是一个在 x86 平台上截获任意 Win32 函数调用的工具库。中断代码可以在运行时动
态加载。Detours 使用一个无条件转移指令来替换目标函数的最初几条指令,将控制流转移到一个
用户提供的截获函数。而目标函数中的一些指令被保存在一个被称为“trampoline”&(译注:英文意
为蹦床,杂技)的函数中,在这里我觉得翻译成目标函数的部分克隆/拷贝比较贴切。这些指令包括
目标函数中被替换的代码以及一个重新跳转到目标函数的无条件分支。而截获函数可以替换目标函
数,或者通过执行“trampoline”函数的时候将目标函数作为子程序来调用的办法来扩展功能。
Detours 是执行时被插入的。内存中的目标函数的代码不是在硬盘上被修改的,因而可以在一
个很好的粒度上使得截获二进制函数的执行变得更容易。例如,一个应用程序执行时加载的 DLL 中
的函数过程可以被插入一段截获代码(detoured),与此同时,这个 DLL 还可以被其他应用程序
按正常情况执行(译注:也就是按照不被截获的方式执行,因为 DLL 二进制文件没有被修改,所以