初始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 函数。例子如下:
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
2
3
4 extern "C" BOOL WINAPI TP_PathFileExists (LPCTSTR pszPath)
5 {
6 if( Detour_PathFileExists( pszPath))
7 return TRUE;
8 if(lstrlen(pszPath) <1) return 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 }
出处:http://www.cnblogs.com/weisteve/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。