文档章节

Detour的简单使用

jialijun
 jialijun
发布于 09/15 11:14
字数 809
阅读 15
收藏 0

Detours的安装:
下载部分:
1.直接在百度搜"detour",进对应的网站下载。
2.或以下链接
https://www.microsoft.com/en-us/research/project/detours/?from=http%3A%2F%2Fresearch.microsoft.com%2Fsn%2Fdetours

安装部分:
1.在对应的编译器找到终端。32位找到“VS2013 x86 本机工具命令提示”(本人的是VS2013),64位找到“VS2013 x64 本机工具命令提示”(注意:32或64是
指编译的程序,而不是操作系统)。

 


2.在上面的命令工具找到对应下载文件的路径,并在终端转到"Detours"文件夹下的"src"文件。如:D:\VS2013\VC\Detours\src。再一次输入"nmake"。
3.此时,已经完成编译了。可以在“Detour”的文件夹下出现“bin.X86”“include”“lib.X86”三个心文件夹。里面包含的就是可以直接导入的头文件和库文件。


注意点:
1.导入Detour时,需要导入头文件和库文件。
#include "../Detours/include/detours.h"
#pragma comment (lib,"../Detours/lib.X86/detours.lib")
本人已将编译好的Detour文件夹放到程序根目录,否则需要给出绝对路径。(尽可能复制)

2.要对挂钩函数进行保存。先定义一个函数指针保存要挂钩的函数,目的是为了最后的还原。

3.挂钩的函数一定要与原函数的原型一模一样(除函数名外)。包含返回值、参数类型。

4.挂钩的思路:
(1)找到要挂钩函数的原型,并提取出来。
(2)定义一个与函数原型一样的新函数。
(3)进行挂钩
DetourTransactionBegin();

DetourUpdateThread(GetCurrentThread());

DetourAttach();

DetourTransactionCommit();
(4)解除钩子
DetourTransactionBegin();

DetourUpdateThread(GetCurrentThread());

DetourAttach();

DetourTransactionCommit();

 

为什么使用DLL

1.扩展了应用程序的特性
2.简化了项目管理
3.节省内存
4.促进资源共享
5.促进本地化 本地有一个DLL不需要重复下载
6.解决各版本的差异

注意:
DLL与应用程序共享一个进程空间
在DLL中分配的内存必须由DLL来进行释放
应用程序不会因为DLL的卸载而释放空间

 

DLL与EXE的不同点:
1.生成的程序属性不同。
2.入口函数不同。DLL是DllMain()

 

复制代码

源代码:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

//包含Detour的头文件和库文件
#include "../Detours/include/detours.h"
#pragma comment (lib,"../Detours/lib.X86/detours.lib")

//保存函数原型
static int (WINAPI *OldMesssageBoxW)(
_In_opt_ HWND hWnd,
_In_opt_ LPCWSTR lpText,
_In_opt_ LPCWSTR lpCaption,
_In_ UINT uType)=MessageBoxW;

//改写函数
static int WINAPI NewMessageBoxW(
    _In_opt_ HWND hWnd,
    _In_opt_ LPCWSTR lpText,
    _In_opt_ LPCWSTR lpCaption,
    _In_ UINT uType)
{
    return OldMesssageBoxW(NULL, L"new MessageBox", L"Please", MB_OK);
    
}
//开始下钩子
void StartHook()
{
    //开始事务
    DetourTransactionBegin();
    //更新线程信息  
    DetourUpdateThread(GetCurrentThread());
    //将拦截的函数附加到原函数的地址上
    DetourDatach(&(PVOID&)OldMesssageBoxW, NewMessageBoxW);
    //结束事务
    DetourTransactionCommit();
}

//解除钩子
void EndHook()
{    
    //开始事务
    DetourTransactionBegin();
    //更新线程信息 
    DetourUpdateThread(GetCurrentThread());
    //将拦截的函数从原函数的地址上解除
    DetourDetach(&(PVOID&)OldMesssageBoxW, NewMessageBoxW);
    //结束事务
    DetourTransactionCommit();
}


int _tmain(int argc, _TCHAR* argv[])
{
    //应原样输出
    MessageBoxW(NULL, L"old MessageBox", L"Please", MB_OK);
    
    //应改变输出
    StartHook();
    MessageBoxW(NULL, L"old MessageBox", L"Please", MB_OK);
    
    //应原样输出
    EndHook();
    MessageBoxW(NULL, L"old MessageBox", L"Please", MB_OK);
    
    system("pause");
    return 0;
}

本文转载自:https://www.cnblogs.com/gd-luojialin/p/7694183.html

jialijun
粉丝 1
博文 17
码字总数 3593
作品 0
私信 提问
Recast & Detour & TerrainExport Study Feeling

Recast Navigation和Terrain Export终于算是有点成果了。今天作一个简单的总结,顺便写一些话激励自己。 这个项目的成功对于我这个算法又烂,而又不懂3d图形学的人来说,感觉真是个奇迹。我说...

狂斩一条龙
2016/04/23
0
0
MinHook - 最小化的 x86/x64 API 钩子库

下载: 下载文件 - 828.88KB 下载源码 - 795.73KB (编译源码需要Boost 1.40.0) RaMMicHaeL已经为项目建立了分支并取得了很大的进展。我认为他在GitHub上的库是MinHook开发的主力。我推荐你从...

oschina
2014/04/23
10.5K
15
十个习惯改变自己

  十个习惯改变自己   [双语] 十个习惯改变自己   1. Stay positive.You can listen to the cynics and doubters and believe that success is impossible or you can know that with......

lch001
2016/11/25
9
0
从许霖案和soff案中发现的有趣问题

写本文的目的不是跟潮流或者引人眼球,而是突然发现了几个有趣的问题。 首先我们看许霖案。案情想必大家也清楚,工行的柜员机出问题了,取1000元只扣1元,于是一个叫做许霖的小伙子就取了17....

长平狐
2012/10/23
168
0
如何制作RTS游戏的寻路系统?

原文链接:https://blog.uwa4d.com/archives/TechSharing107.html 这是第107篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间15分钟,认真读完必...

uwa4d
2018/04/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Android多点触控技术,实现对图片的放大缩小平移,惯性滑动等功能

https://blog.csdn.net/nugongahou110/article/details/50668925

shzwork
23分钟前
5
0
数据仓库知识积累

1、数据仓库专题(6)-数据仓库、主题域、主题概念与定义 https://blog.csdn.net/hadoopdevelop/article/details/45296981 2、数据仓库基本知识 https://blog.csdn.net/zzq900503/article/de...

sunny小喵
42分钟前
4
0
018、Kubernetes安装前的准备

本次安装采用 Ubuntu Server X64 18.04 LTS 版本安装 kubernetes 集群环境,集群节点为 1 主 2 从模式,此次对虚拟机会有些基本要求,如下: OS:Ubuntu Server X64 18.04 LTS(16.04 版本步...

北岩
45分钟前
4
0
redis 不同数据结构的使用场景?

1. string string 类型也就是 key-value 类型 常用命令:get、set、incr 应用场景:string 是最常用的一种数据类型 2. list 常用命令:lpush,rpush,brpop,blpop 应用场景:作为消息队列,因为...

happywe
58分钟前
6
0
PG jdbc

import java.sql.DriverManager;import java.sql.Connection;import java.sql.SQLException;import java.sql.ResultSet;import java.sql.Statement; public class PG{ public stat......

MtrS
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部