detour使用教程_devour怎么使用道具

detour使用教程_devour怎么使用道具Detours的安装:下载部分:1.直接在百度搜"detour",进对应的网站下载。2.或以下链接https://www.microsoft.com/en-us/research/

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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是
指编译的程序,而不是操作系统)。

detour使用教程_devour怎么使用道具

 

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());
    //将拦截的函数附加到原函数的地址上
    DetourAttach(&(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://javaforall.net/167266.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python中jieba库_python怎么写入文件

    Python中jieba库_python怎么写入文件Pythonjieba库用法及实例解析1、jieba库基本介绍(1)、jieba库概述jieba是优秀的中文分词第三方库-中文文本需要通过分词获得单个的词语-jieba是优秀的中文分词第三方库,需要额外安装-jieba库提供三种分词模式,最简单只需掌握一个函数(2)、jieba分词的原理Jieba分词依靠中文词库-利用一个中文词库,确定汉字之间的关联概率-汉字间概率大的组成词组,形成分…

    2022年9月21日
    3
  • 织梦dedecms如何去除版权中的Power by DedeCms

    织梦dedecms如何去除版权中的Power by DedeCms

    2021年9月19日
    47
  • 激光slam_高德导航术语理解

    激光slam_高德导航术语理解ROS激光SLAM导航理解注:最近学习ROS的导航,需要理清ROS的SLAM、环境感知(costmap)、与导航算法。为防止自己忘记,将觉得有价值的内容摘抄于此。文章目录ROS激光SLAM导航理解激光SLAM基本原理基本原理1、占据栅格地图基本原理2、导航基本原理SLAM与导航系统框架:激光SLAM系统框架建图系统框架导航系统框架`move_base`中的使用运用`plugins`Cost…

    2022年8月23日
    11
  • nodejs和java多线程_nodeJS和Java哪个难?「建议收藏」

    nodejs和java多线程_nodeJS和Java哪个难?「建议收藏」刚好最近学了一点Java,来回答下这个问题。首先这个问题不好说谁难谁易(就像是问篮球足球谁难),深入学习之后会发现都很难。nodeJS底层是依赖v8跟libuv(c\c++),部分模块是用c++编写,所以深入了解之后会发现还得学c++。而Java将代码编译成字节码运行在虚拟机上,相应的Java字节码、JVM都要去了解。所以研究底层的话两者都很难,不太好区分谁更难。不过从题主的问题来看可能想问的是n…

    2022年7月7日
    30
  • Mysql慢查询_mysql并发查询慢

    Mysql慢查询_mysql并发查询慢慢查询日志概念MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10S以上的语句。默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数…

    2022年10月9日
    4
  • Linux 下搭建流媒体服务器

    Linux 下搭建流媒体服务器

    2021年9月4日
    114

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号