var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-333696-1']); _gaq.push(['_trackPageview']); _gaq.push(['_trackPageLoadTime']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
  • 2009年06月03日

    EasyHook库简介

    分类:

    微软Detours库由微软的Galen Hunt Doug Brubacher开发,199971日发表在论文《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@0HookSpecific_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库也是跳转了56(JMPE9,不被64位模式所支持)个指令。

    EasyHook中的ProcessMonitorhook勾选中文件CreateFileW操作。

     

    【资源】

    x64 指令系统】 指令编码内

    Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 2B: Instruction Set Reference, N-Z --Appendix A Opcode Map

    分享到: