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

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


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)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • SpringBootTest 和PowerMocker

    SpringBootTest 和PowerMockerimportstaticorg.junit.Assert.assertNotEquals;importstaticorg.junit.Assert.assertNotNull;importstaticorg.junit.Assert.assertTrue;importjava.util.HashMap;importjava.util.Map;importorg…

    2022年6月5日
  • HDU 1002 A + B Problem II(大整数相加)[通俗易懂]

    HDU 1002 A + B Problem II(大整数相加)

    2022年1月28日
  • (others)ICMP报文详解系列「建议收藏」

    (others)ICMP报文详解系列「建议收藏」Linuxicmp学习笔记之一icmp协议相关的格式分类: linux网络2014-04-1723:45 487人阅读 评论(0) 收藏 举报Linuxicmp功能分析之一 icmp协议相关的格式 ICMP协议是网络层中一个非常重要的协议,其全称为Internet Control Message Protocol(因特网控制报文协议

    2022年5月24日
  • linux启动sh文件命令,Linux 运行 .sh 文件的两种方法「建议收藏」

    linux启动sh文件命令,Linux 运行 .sh 文件的两种方法「建议收藏」Linux运行.sh文件的两种方法文章作者:网友投稿 发布时间:2010-06-1513:31:16 来源:网络一个中等水平的Linux用户一定少不了经常执行.sh文件,当然了,你可以在图形界面下面直接双击该文件,但无疑比较浪费时间。现在介绍第一种方法:(在ubuntu下的)首先你要打开一个终端。然后输入sudosu随后输入密码。这样就取得了root用户权限。然后找到那个文件(…

    2022年10月28日
  • 非递归方式实现二叉树后序遍历_二叉树递归遍历

    非递归方式实现二叉树后序遍历_二叉树递归遍历二叉树前序遍历对于一种数据结构而言,我们最常见的就是遍历,那么关于二叉树我们该如何去遍历呢?请看大屏幕。。。。上图是一棵二叉树,前序遍历结果:124536咦,我想你可能会异或什么叫做前序遍历,其实很简单,就是按照根-》左-》右的方式去遍历二叉树。首先让我们来看看如何递归的去前序遍历二叉树注:在这里我特别强调一点,在我们二…

    2022年9月10日
  • celery启动命令_不root卸载系统软件

    celery启动命令_不root卸载系统软件这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入欢迎使用Ma…

    2022年8月10日

发表回复

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

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