zoukankan      html  css  js  c++  java
  • 初始Microsoft Detours【收集】

      Detours是微软开发的一个函数库(源代码可在http://research.microsoft.com/sn/detours 免费获得), 用于修改运行中的程序在内存中的影像。具体用途是: 拦截Win32 API调用,将其引导到自己的子程序,从而实现Win32 API的定制。


    Detours的原理
    ----1. Win32进程的内存管理
    ----众所周知,Windows NT实现了虚拟存储器,每一个Win32 进程拥有4GB的虚存空间, 关于Win32进程的虚存结构及其操作的具体细节请参阅 Win32 API手册, 以下仅指出与Detours相关的几点:


    进程要执行的指令也放在虚存空间中。
    可以使用QueryProtectEx函数把存放指令的页面的权限更改为可读可写可执行,再改写其内容,从而修改正在运行的程序。
    可以使用VirtualAllocEx从一个进程为另一正运行的进程分配虚存,再使用 QueryProtectEx函数把页面的权限更改为可读可写可执行,并把要执行的指令以二进制机器码的形式写入,从而为一个正在运行的进程注入任意的代码。
    ----2. 拦截Win32 API的原理


    ----Detours定义了三个概念:


    Target函数:要拦截的函数,通常为Windows的API。
    Trampoline函数:Target函数的复制品。因为Detours将会改写Target函数,所以先把 Target函数复制保存好,一方面仍然保存Target函数的过程调用语义,另一方面便于以后的恢复。
    Detours 函数:用来替代Target函数的函数。
    ---- Detours在Target函数的开头加入JMP Address_of_ Detour_ Function指令(共5个字节)把对Target函数的调用引导到自己的Detours函数, 把 Target函数的开头的5个字节加上JMP Address_of_ Target _ Function+5作为Trampoline 函数。例子如下:

     1 拦截前:Target _ Function:
     2         ;Target函数入口,
     3       以下为假想的常见的子程序入口代码
     4         push        ebp
     5         mov        ebp,    esp
     6         push        eax
     7         push        ebx
     8     Trampoline:
     9         ;以下是Target函数的继续部分
    10         ......
    11 
    12 
    13     拦截后:Target _ Function:
    14         jmp        Detour_Function
    15      Trampoline:
    16         ;以下是Target函数的继续部分
    17         ......
    18 
    19 
    20      Trampoline_Function:
    21         ; Trampoline函数入口, 开头的5个字节与
    22           Target函数相同
    23         push        ebp
    24         mov        ebp,    esp
    25         push        eax
    26         push        ebx
    27         ;跳回去继续执行Target函数
    28         jmp     Target_Function+5







    使用Detours需要有detours.lib和detours.h,这个可以从网上下载


    具体使用例子:用TP_PathFileExists来拦截系统消息PathFileExists

     1 DETOUR_TRAMPOLINE(BOOL  WINAPI Detour_PathFileExists  (LPCTSTR pszPath), PathFileExists);
     2 
     3 
     4 extern "C" BOOL  WINAPI TP_PathFileExists  (LPCTSTR pszPath)
     5     {
     6         if( Detour_PathFileExists( pszPath))
     7             return TRUE;
     8         if(lstrlen(pszPath) <1return FALSE;
     9         if(pszPath[0== '\\')
    10         {
    11             HANDLE  hFile;  
    12             hFile = CreateFile(pszPath
    13                 ,GENERIC_READ
    14                 ,FILE_SHARE_READ|FILE_SHARE_WRITE
    15                 ,NULL
    16                 ,OPEN_EXISTING
    17                 ,FILE_ATTRIBUTE_NORMAL
    18                 ,NULL);
    19 
    20 
    21             if(INVALID_HANDLE_VALUE == hFile)
    22                 return FALSE;
    23             else
    24             {
    25                 CloseHandle(hFile);
    26                 return TRUE;
    27             }
    28         }
    29         else
    30         {
    31             WIN32_FIND_DATA lpFindFileData;
    32             HANDLE hFind = FindFirstFile( pszPath,&lpFindFileData);
    33             if( INVALID_HANDLE_VALUE == hFind) return FALSE;
    34             else {FindClose(hFind);return TRUE;}
    35         }
    36     }
    37 
    38 
    39 
    40 
    41 BOOL TP_InitSysHook()
    42 {
    43     DWORD dwVersion = GetVersion();
    44     if(dwVersion < 0x80000000)
    45     {        
    46         DetourFunctionWithTrampoline((PBYTE)Detour_PathFileExists,    (PBYTE)TP_PathFileExists);    
    47         return TRUE;
    48     }
    49     return TRUE;
    50 }
    51 
    52 
    53 BOOL TP_ReleaseSysHook()
    54 {
    55     DWORD dwVersion = GetVersion();
    56     if(dwVersion < 0x80000000)
    57     {        
    58         DetourRemove((PBYTE)Detour_PathFileExists,     (PBYTE)TP_PathFileExists);        
    59         return TRUE;
    60     }
    61     return TRUE;
    62 }




     

  • 相关阅读:
    程序员如何在百忙中更有效地利用时间,如何不走岔路,不白忙(忙得要有效率,要有收获)
    最坏的不是面试被拒,而是没面试机会,以面试官视角分析哪些简历至少能有面试机会
    最近面了不少java开发,据此来说下我的感受:哪怕事先只准备1小时,成功概率也能大大提升
    Ribbon整合Eureka组件,以实现负载均衡
    时间对于程序员的价值,以及如何高效地利用时间,同时划分下勤奋度的等级
    面试过程中,可以通过提问环节的发挥,提升面试的成功率
    以技术面试官的经验分享毕业生和初级程序员通过面试的技巧(Java后端方向)
    和小鲜肉相比,老程序员该由哪些优势?同时说下我看到的老程序员的三窟
    通过软引用和弱引用提升JVM内存使用性能的方法(面试时找机会说出,一定能提升成功率)
    Spring Clould负载均衡重要组件:Ribbon中重要类的用法
  • 原文地址:https://www.cnblogs.com/weisteve/p/1972058.html
Copyright © 2011-2022 走看看