微软Detours工具使用前奏

前两天何老师发来一个关于Detours工具包使用的说明,打开一看全英文,唯一认识的就是那10个阿拉伯数字微软Detours工具使用前奏 - scarin - WINKERNEL。找到中文说明之后,发现还有一个例子,关于截取一个MFC工程下的MessageBox函数的。迫不及待就开始自己学着来搞,可发现无法加载detours的头文件!不是XX不认识,就是XX未定义标识符,真是麻辣隔壁呀。辗转一天,没找到好的办法解决——愁了一天。 ?

   今天起来继续研究,曲曲折折的找到了关于使用Detours的一些前奏工作,其中有些SX建议什么自己建个工程,直接加载Detrous的源文件,这种方法我已经试了千遍都没成功,这里强烈BS这种建议。有些高手建议用nmake制作.lib文件,于是看nmake如何使用,搞了半天终于生成了detoured.lib等文件,自己建立个Dll工程测试了一下,也可以成功调用Detours工具包的API函数了微软Detours工具使用前奏 - scarin - WINKERNEL,那个叫激动。 ?

  鉴于网上许多关于使用Detours教程都说得不明不白,所以这里分享一下使用Detours工具包的前奏——也即准备工作。PS:完全傻瓜式 ?

1.首先你得到微软官网上下载Detours工具包,地址点这里,这是2.1 Express版本。?

2.下载后是一个msi安装包,执行安装。如果不会安装,你可以拿你的脑袋去挤门框。 ?

3.打开安装目录下的Detours Express 2.1\src文件夹,发现里面有一个Makefile文件,这个家伙就是跟nmake.exe配套使用的文件。 ?

4.找到你的VC目录下的nmake.exe程序,本人用的是VC2008,这个程序藏在C:\Program Files\Microsoft Visual Studio 9.0\VC\bin目录下。另外,为确保你系统的环境变量是正确的,可以先运行bin目录下的一个批处理文件vcvars32.bat,这玩意运行一下就OK了。 ?

5.将步骤3的src整个目录拷贝到步骤4的bin目录下,然后把nmake.exe拷贝到这个copy版的src目录下。 ?

6.运行VC2008的命令提示,切换到src目录下,开始执行nmake.exe ?

7.执行命令:nmake.exe /A ?

8.执行成功之后,打开bin目录,发现生成了bin、include、lib三个文件夹,这三个家伙里面包含了我们最终的目标文件Detours.dll、Detours.lib等文件 ?

9.打开步骤8的include文件夹,将detours.h拷贝到C:\Program Files\Microsoft Visual Studio 9.0\VC\include目录下 ?

10.打开步骤8的lib文件夹,将里面四个文件拷贝到C:\Program Files\Microsoft Visual Studio 9.0\VC\lib目录下 ?

   这样就完成了使用detours的准备工作。你可以建立个dll工程测试一下是否能使用detours的API函数。微软Detours工具使用前奏 - scarin - WINKERNEL?

 

12月18日补记:

  发现我自己的方法不管用了,还是下面的方法管用,分享一下吧:

具体生成库的做法是:

1.将Detours路径下的SCR文件夹拷贝到**\Microsoft Visual Studio\VC98路径下,注意是整个文件夹

2.运行**\Microsoft Visual Studio\VC98\Bin下VCVARS32.BAT文件.

在开始->运行里面输入CMD命令,在出来的命令行窗口里,将路径换至**\Microsoft Visual Studio\VC98\Bin,再将VCVARS32.BAT文件拖进命令行窗口里就行

3.运行NMAKE命令

在命令行窗口里将路径换到**\Microsoft Visual Studio\VC98\SRC,然后输入nmake指令,回车

4.待此命令运行完后,在**\Microsoft Visual Studio\VC98\Lib文件下就能找到detoured.lib与detours.lib文件.

Detours微软开发的一个函数库, 用于修改运行中的程序在内存中的影像,从而即使没有源代码也能改变程序的行为。具体用途是: 拦截WIN32 API调用,将其引导到自己的子程序,从而实现WIN32 API的定制。 为一个已在运行的进程创建一新线程,装入自己的代码并运行。 ---- 本文将简介Detours的原理,Detours库函数的用法, 并利用Detours库函数在Windows NT上编写了一个程序,该程序能使有“调试程序”的用户权限的用户成为系统管理员,附录利用Detours库函数修改该程序使普通用户即可成为系统管理员 (在NT4 SP3上)。 一. Detours的原理 ---- 1. WIN32进程的内存管理 ---- 总所周知,WINDOWS NT实现了虚拟存储器,每一WIN32进程拥有4GB的虚存空间, 关于WIN32进程的虚存结构及其操作的具体细节请参阅WIN32 API手册, 以下仅指出与Detours相关的几点: ---- (1) 进程要执行的指令也放在虚存空间中 ---- (2) 可以使用QueryProtectEx函数把存放指令的页面的权限更改为可读可写可执行,再改写其内容,从而修改正在运行的程序 ---- (3) 可以使用VirtualAllocEx从一个进程为另一正运行的进程分配虚存,再使用 QueryProtectEx函数把页面的权限更改为可读可写可执行,并把要执行的指令以二进制机器码的形式写入,从而为一个正在运行的进程注入任意的代码 ---- 2. 拦截WIN32 API的原理 ---- Detours定义了三个概念: ---- (1) Target函数:要拦截的函数,通常为Windows的API。 ---- (2) Trampoline函数:Target函数的复制品。因为Detours将会改写Target函数,所以先把Target函数复制保存好,一方面仍然保存Target函数的过程调用语义,另一方面便于以后的恢复。 ---- (3) Detour 函数:用来替代Target函数的函数。 ---- Detours在Target函数的开头加入JMP Address_of_ Detour_ Function指令(共5个字节)把对Target函数的调用引导到自己的Detour函数, 把Target函数的开头的5个字节加上JMP Address_of_ Target _ Function+5作为Trampoline函数。例子如下: 拦截前:Target _ Function: ;Target函数入口,以下为假想的常见的子程序入口代码 push ebp mov ebp, esp push eax push ebx Trampoline: ;以下是Target函数的继续部分 …… 拦截后: Target _ Function: jmp Detour_Function Trampoline: ;以下是Target函数的继续部分 …… Trampoline_Function: ; Trampoline函数入口, 开头的5个字节与Target函数相同 push ebp mov ebp, esp push eax push ebx ;跳回去继续执行Target函数 jmp Target_Function+5 ---- 3. 为一个已在运行的进程装入一个DLL ---- 以下是其步骤: ---- (1) 创建一个ThreadFuction,内容仅是调用LoadLibrary。 ---- (2) 用VirtualAllocEx为一个已在运行的进程分配一片虚存,并把权限更改为可读可写可执行。 ---- (3) 把ThreadFuction的二进制机器码写入这片虚存。 ---- (4) 用CreateRemoteThread在该进程上创建一个线程,传入前面分配的虚存的起始地址作为线程函数的地址,即可为一个已在运行的进程装入一个DLL。通过DllMain 即可在一个已在运行的进程中运行自己的代码。 二. Detours库函数的用法 ---- 因为Detours软件包并没有附带帮助文件,以下接口仅从剖析源代码得出。 ---- 1. PBYTE WINAPI DetourFindFunction(PCHAR pszModule, PCHAR pszFunction) ---- 功能:从一DLL中找出一函数的入口地址 ---- 参数:pszModule是DLL名,pszFun
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值