-
2009年06月03日
EasyHook库简介
分类:微软Detours库由微软的Galen Hunt 和Doug Brubacher开发,1999年7月1日发表在论文《Detours: Binary Interception of Win32 Functions》上。其原理是改写函数头至少5个字节(因为一般函数开头都是保存栈环境的三条指令共5个字节:8b ff 55 8b ec)为一条跳转指令,直接跳转到自己的函数开头,从而实现API拦截。其实现为原生代码C++语言。由于微软Detour钩子引擎免费许可仅针对x86应用程序,所以要对x64应用程序生效得选用其它库,比如diStorm64,其原理见Powerful x86/x64 Mini Hook-Engine。
随着.NET框架的日益流行,EasyHook库提供了一种从托管环境hook非托管代码的方法,教程阐述了使用方法。
EasyHook库完整源码显示其最关键的一段代码是Trampoline_ASM_x86/x64这段代码中给定的跳转地址。作者借助IDA Pro 5.0反汇编Ildasm.exe生成目录DriverShared\ASM下主要核心汇编代码。见文件HookSpecific_x86.asm中的public Trampoline_ASM_x86@0和HookSpecific_x64.asm中的public Trampoline_ASM_x64。然后目录DriverShared\LocalHook中的install.c调用它:
UCHAR* GetTrampolinePtr()
{
// bypass possible Visual Studio debug jump table
#ifdef _M_X64
UCHAR* Ptr = (UCHAR*)Trampoline_ASM_x64;
#else
UCHAR* Ptr = (UCHAR*)Trampoline_ASM_x86;
#endif
if(*Ptr == 0xE9)
Ptr += *((int*)(Ptr + 1)) + 5;
#ifdef _M_X64
return Ptr + 5 * 8;
#else
return Ptr;
#endif
}
可见,EasyHook库也是跳转了5或6(JMP,E9,不被64位模式所支持)个指令。
EasyHook库中的示例ProcessMonitor能hook勾选中文件CreateFileW操作。
【资源】
Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 2B: Instruction Set Reference, N-Z --Appendix A Opcode Map
随机文章:
MSIE跨版本预览软件 2009年05月01日基础汇编(1) 2008年08月11日获取Windows版本信息 2007年09月27日LoadRunner运行原理浅析(3)-监听(下) 2007年06月07日本月文章收录 2007年02月28日
收藏到:Del.icio.us
