win7生成生成Detours

上传人:博****1 文档编号:488557151 上传时间:2022-12-02 格式:DOC 页数:9 大小:151.50KB
返回 下载 相关 举报
win7生成生成Detours_第1页
第1页 / 共9页
win7生成生成Detours_第2页
第2页 / 共9页
win7生成生成Detours_第3页
第3页 / 共9页
win7生成生成Detours_第4页
第4页 / 共9页
win7生成生成Detours_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《win7生成生成Detours》由会员分享,可在线阅读,更多相关《win7生成生成Detours(9页珍藏版)》请在金锄头文库上搜索。

1、win7生成生成Detours.lib以及简单使用实例 microsoftdllapihookwindowsfunctionDetours是微软开发的一个函数库,可用于捕获系统API。在用其进行程序开发之前,得做一些准备工作:一.下载Detours 在http:/ 一路NEXT三.生成Detours库 在安装后的文件夹下找不到直接可以拿来用的LIB文件,但是却有SRC文件(在*Microsoft ResearchDetours Express 2.1src下)。该文件夹下还有Makefile,可以直接用来生成库。 将Detours路径下的SCR文件夹拷贝到*Microsoft Visual S

2、tudio 9.0VC路径下,注意是整个文件夹(其它版本VC自己照着复制) 在system32目录找到cmd右键以管理员身份运行,切换至 c:Program FilesMicrosoft Visual Studio 9.0VCbin目录运行vcvars32.bat 切换到Microsoft Visual Studio9.0VCSRC,然后输入.binnmake指令,编译成功后在Microsoft Visual Studio9.0VCLib文件下就能找到detoured.lib与detours.lib文件了。附使用简单例子:HOOK MessageBoxW函数#includestdafx.h#i

3、ncludeDetourHook.h#include#pragmacomment(lib,detours.lib)#pragmacomment(lib,detoured.lib)staticint(WINAPI*OLD_MessageBoxW)(HWNDhWnd,LPCWSTRlpText,LPCWSTRlpCaption,UINTuType)=MessageBoxW;intWINAPINEW_MessageBoxW(HWNDhWnd,LPCWSTRlpText,LPCWSTRlpCaption,UINTuType)/修改输入参数,调用原函数intret=OLD_MessageBoxW(hWn

4、d,L输入参数已修改,L测试,uType);returnret;VOIDHook()DetourRestoreAfterWith();DetourTransactionBegin();DetourUpdateThread(GetCurrentThread();/这里可以连续多次调用DetourAttach,表明HOOK多个函数DetourAttach(&(PVOID&)OLD_MessageBoxW,NEW_MessageBoxW);DetourTransactionCommit();VOIDUnHook()DetourTransactionBegin();DetourUpdateThread

5、(GetCurrentThread();/这里可以连续多次调用DetourDetach,表明撤销多个函数HOOKDetourDetach(&(PVOID&)OLD_MessageBoxW,NEW_MessageBoxW);DetourTransactionCommit();intAPIENTRY_tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow)MessageBoxW(0,L正常消息框,L测试,0);Hook();MessageBoxW(0,L正常消息框,L测试,0);UnHook();

6、return0;附:我们截获函数执行最直接的目的就是为函数增添功能,修改返回值,或者为调试以及性能测试加入附加的代码,或者截获函数的输入输出作研究,破解使用。通过访问源代码,我们可以轻而易举的使用重建(Rebuilding)操作系统或者应用程序的方法在它们中间插入新的功能或者做功能扩展。然而,在今天这个商业化的开发世界里,以及在只有二进制代码发布的系统中,研究人员几乎没有机会可以得到源代码。本文主要讨论Detour在Windows二进制PE文件基础上的API截获技术。对于Linux平 台,作这件事情将会非常的简单,由于最初的操作系统设计者引入了LD_PRELOAD。如果你设置 LD_PRELO

7、AD=mylib.so ,那么应用程序在载入 dll时,会先查看mylib.so的符号表,在relocation 的时候会优先使用mylib.so 里的 symbol 。假如你在mylib.so里有个printf() ,那么这个printf就会替代libc的printf。 而在mylib.so里的这个printf可以直接访问 libc.so里的printf函数指针来获得真正的 printf的入口地址。 这样,所有的dll的API HOOK在loader加载dll的时候就已经完成,非常自然,和平台相关的部分全部交给loader去处理。 一、Detour开发库:l简介Detours是一个在x86平

8、台上截获任意Win32函数调用的工具库。中断代码可以在运行时动态加载。Detours使用一个无条件转移指令来替换目 标函数的最初几条指令,将控制流转移到一个用户提供的截获函数。而目标函数中的一些指令被保存在一个被称为“trampoline”(译注:英文意为蹦 床,杂技)的函数中,在这里我觉得翻译成目标函数的部分克隆/拷贝比较贴切。这些指令包括目标函数中被替换的代码以及一个重新跳转到目标函数的无条件分 支。而截获函数可以替换目标函数,或者通过执行“trampoline”函数的时候将目标函数作为子程序来调用的办法来扩展功能。Detours是执行时被插入的。内存中的目标函数的代码不是在硬盘上被修改的

9、,因而可以在一个很好的粒度上使得截获二进制函数的执行变得更容易。例如, 一个应用程序执行时加载的DLL中的函数过程可以被插入一段截获代码(detoured),与此同时,这个DLL还可以被其他应用程序按正常情况执行(译 注:也就是按照不被截获的方式执行,因为DLL二进制文件没有被修改,所以发生截获时不会影响其他进程空间加载这个DLL)。不同于DLL的重新链接或者静态重定向,Detours库中使用的这种中断技术确保不会影响到应用程序中的方法或者系统代码对目标函数的定位。如果其他人为了调试或者在内部使用其他系统检测手段而试图修改二进制代码,Detours将是一个可以普遍使用的开发包。据我所知,Det

10、ours是第一 个可以在任意平台上将未修改的目标代码作为一个可以通过“trampoline”调用的子程序来保留的开发包。而以前的系统在逻辑上预先将截获代码放到目 标代码中,而不是将原始的目标代码作为一个普通的子程序来调用。我们独特的“trampoline”设计对于扩展现有的软件的二进制代码是至关重要的。出于使用基本的函数截获功能的目的,Detours同样提供了编辑任何DLL导入表的功能,达到向存在的二进制代码中添加任意数据节表的目的,向一个新进 程或者一个已经运行着的进程中注入一个DLL。一旦向一个进程注入了DLL,这个动态库就可以截获任何Win32函数,不论它是在应用程序中或者在系统库 中。

11、l基本原理1 WIN32进程的内存管理众所周知,WINDOWSNT实现了虚拟存储器,每一WIN32进程拥有4GB的虚存空间,关于WIN32进程的虚存结构及其操作的具体细节请参阅WIN32API手册,以下仅指出与Detours相关的几点:(1)进程要执行的指令也放在虚存空间中(2)可以使用QueryProtectEx函数把存放指令的页面的权限更改为可读可写可执行,再改写其内容,从而修改正在运行的程序(3)可以使用VirtualAllocEx从一个进程为另一正运行的进程分配虚存,再使用QueryProtectEx函数把页面的权限更改为可读可写可执行,并把要执行的指令以二进制机器码的形式写入,从而为

12、一个正在运行的进程注入任意的代码。2拦截WIN32API的原理Detours定义了三个概念: (1)Target函数:要拦截的函数,通常为Windows的API。(2)Trampoline函数:Target函数的部分复制品。因为Detours将会改写Target函数,所以先把Target函数的前5个字节复制保存好,一方面仍然保存Target函数的过程调用语义,另一方面便于以后的恢复。(3)Detour函数:用来替代Target函数的函数。Detours在Target函数的开头加入JMPAddress_of_Detour_Function指令(共5个字节)把对Target函数 的调用引导到自己的

13、Detour函数,把Target函数的开头的5个字节加上 JMPAddress_of_Target_Function+5共10个字节作为Trampoline函数。请参考下面的图1和图2。(图1:Detour函数的过程)点击查看大图(图2: Detour函数的调用过程) 说明:u目标函数:目标函数的函数体(二进制)至少有5个字节以上。按照微软的说明文档Trampoline函数的函数体是拷贝前5个字节加一个无条件跳转指令的话(如果没 有特殊处理不可分割指令的话),那么前5个字节必须是完整指令,也就是不能第5个字节和第6个字节是一条不可分割的指令,否则会造成Trampoline 函数执行错误,一条完

14、整的指令被硬性分割开来,造成程序崩溃。对于第5字节和第6个字节是不可分割指令需要调整拷贝到杂技函数(Trampoline)的 字节个数,这个值可以查看目标函数的汇编代码得到。此函数是目标函数的修改版本,不能在Detour函数中直接调用,需要通过对Trampoline函数 的调用来达到间接调用。uTrampoline函数:此函数默认分配了32个字节,函数的内容就是拷贝的目标函数的前5个字节,加上一个JMPAddress_of_Target_Function+5指令,共10个字节。此函数仅供您的Detour函数调用,执行完前5个字节的指令后再绝对跳转到目标函数的第6个字节继续执行原功能函数。uDetour函数:此函数是用户需要的截获API的一个模拟版本,调用方式,参数个数必须和目标函数相一致。如目标函数是_stdcall,则Detour函数声明

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号