Detours HOOK

news2024/11/24 18:49:51

参考文本

如何使用Detours库进行DLL注入,拦截API - 知乎 (zhihu.com)

解决‘nmake‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。_nmake' 不是内部或外部命令,也不是可运行的程序 或批处理文件。_AI浩的博客-CSDN博客

Detours使用方法,简单明了_再学5分钟的博客-CSDN博客

Detours注入DLL钩子入门教程detours 注入SoulRed的博客-CSDN博客

detours介绍与使用_顺其自然~的博客-CSDN博客

https://www.cnblogs.com/dayw/p/3289443.html

Detours版HOOK 未导出的API函数CreateProcessInternalW_detours hook未导出的函数_侠客软件开发的博客-CSDN博客

(205条消息) Detours框架实现原理探究_microsoft detours_Leen的博客-CSDN博客

安装Detours

首先下载detours的资源,地址:GitHub - microsoft/Detours: Detours is a software package for monitoring and instrumenting API calls on Windows. It is distributed in source code form.

  • 下载到本地后解压至任意文件夹;

  • 打开cmd终端,注该cmd需要是下载VS2022一起下载的终端,进到这个文件夹下,键入nmake;下图为正常结果

  •  

  • 否则会出现”nmake‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件“

    这里分享一个我踩到的坑,就是在nmake的时候出现了

    'sn' 不是内部或外部命令,也不是可运行的程序
    或批处理文件。

    面对上述问题,是因为.NET Framework没有安装,修改安装后即可,但似乎即便没有安装,生成的lib文件也是可用的

  • 编译完成后:

  • 新建一个工程,将include中的detours.h移动至工程文件下;

  • 将lib.X64(X86也有对应目录)下的detours.lib移动至工程文件下;

编写目标程序

示例一

创建一个目标程序,内容随意,需要能够编译成exe文件,并且调用了Messagebox,越简单越好,生成exe文件,这里要注意,32位和64位不能混用,不然会注入失败,这里选择了64位

#include<windows.h>
#include<cstdio>
int main() {
	MessageBox(GetForegroundWindow(),L"这是正常的弹窗",L"正常的",1);
}

示例二:

#include<windows.h>
#include<cstdio>

int main() {
	SYSTEMTIME time, time2;
	GetLocalTime(&time);
	printf("%d::%d", time.wHour, time.wMinute);
}

示例三

#include<windows.h>
#include<cstdio>

int main() {
	
	//MessageBox(GetForegroundWindow(),L"这是正常的弹窗",L"正常的",1);
	system("notepad");

}

动态链接库

此时新建一个项目,选择动态链接库

默认生成的项目里有两个文件

1个是dllmain.cpp(DLL入口)

1个是pch.cpp(预编译头)

我们添加一个新的myhook.cpp文件到项目,内容如下,并且通过上方的方法,配置好detours库

示例一:

#include <Windows.h>
#include "detours.h"

//真实的调用函数,函数原型必须和真实API一致。部分类型如果无法声明可以用void *替代
static int (WINAPI* REALMessageBox) (HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType) = MessageBox;
//伪造的调用函数,也就是我们的钩子,参数类型和返回值必须和真实的一样,
static int WINAPI MYMessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)
{
	//在这里可以任意发挥~~~
	//在函数末尾调用真正的API来返回
	return  REALMessageBox(NULL, L"MyHook!! MessageBoxCRACK!!", L"Please", MB_OK);
}
/*
void (WINAPI* OldGetLocalTime)(LPSYSTEMTIME) = GetLocalTime;
void NewGetLocalTime(LPSYSTEMTIME lpSystemTime) {
	OldGetLocalTime(lpSystemTime);
	lpSystemTime->wMinute = 59;
}
*/
void StartHook()
{
	long err;
	DetourRestoreAfterWith();
	//开始事务
	DetourTransactionBegin();
	//更新线程信息  
	DetourUpdateThread(GetCurrentThread());
	//将拦截的函数附加到原函数的地址上
	DetourAttach(&(PVOID&)REALMessageBox, MYMessageBox);
    //DetourAttach(&(PVOID&)OldGetLocalTime, NewGetLocalTime);
	//结束事务
	err = DetourTransactionCommit();
}

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

在dllmain.cpp里调用StartHook函数

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include "framework.h"
 
extern void StartHook();//新增
 
//新增一个导出函数,这个可以随便写,但必须至少有一个导出函数才能使用setdll远程注入
VOID __declspec(dllexport) test()
{
	OutputDebugString(L"__declspec(dllexport) test() \r\n");
}
 
BOOL APIENTRY DllMain(HMODULE hModule,
	DWORD  ul_reason_for_call,
	LPVOID lpReserved
)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	{StartHook();} //新增
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}

示例二:

#include <Windows.h>
#include "detours.h"


void (WINAPI* OldGetLocalTime)(LPSYSTEMTIME) = GetLocalTime;
void NewGetLocalTime(LPSYSTEMTIME lpSystemTime) {
	OldGetLocalTime(lpSystemTime);
	lpSystemTime->wMinute = 59;
}

void StartHook()
{
	long err;
	DetourRestoreAfterWith();
	//开始事务
	DetourTransactionBegin();
	//更新线程信息  
	DetourUpdateThread(GetCurrentThread());
	//将拦截的函数附加到原函数的地址上
	//DetourAttach(&(PVOID&)REALMessageBox, MYMessageBox);
    DetourAttach(&(PVOID&)OldGetLocalTime, NewGetLocalTime);
	//结束事务
	err = DetourTransactionCommit();
}

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

示例三

#include <Windows.h>
#include "detours.h"
#include <iostream>
#include <Windows.h>
//#include"pch.h"
using namespace std;


int (*Oldsystem)(char const*) = system;
#pragma comment(lib, "detours.lib")

void Newsystem(char const* command) {
	Oldsystem("explorer");
}

void StartHook()
{
	long err;
	DetourRestoreAfterWith();
	//开始事务
	DetourTransactionBegin();
	//更新线程信息  
	DetourUpdateThread(GetCurrentThread());
	//将拦截的函数附加到原函数的地址上
	//DetourAttach(&(PVOID&)REALMessageBox, MYMessageBox);
	//etourAttach(&(PVOID&)OldGetLocalTime, NewGetLocalTime);
	DetourAttach(&(PVOID&)Oldsystem, Newsystem);
	//结束事务
	err = DetourTransactionCommit();
}

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

右键项目--生成

如果出现 C1010 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "pch.h"”?

将这个头文件添加到相应CPP的文件头部即可

或者右键项目——属性——C/C++——预编译头——使用(/Yu)改为不使用预编译头

tip:这里还有一个坑,添加预编译头文件到项目中后,我出现了即便导入lib库,依旧无法识别外部符号的问题,不知道原理,但是建议改为不使用预编译头,而不是添加文件

如果出现无法解析的外部符号。

是因为我们没有导入我们刚才nmake生成的detours.lib

将E:\Detours-4.0.1\lib.X64\detours.lib拷贝到项目根目录

tip:这里有一个小细节,如果你将两个项目放置在同一个解决方案之下,需要注意上方的项目调试配置默认的是先创建的项目,想要配置后创建的项目,需要在解决方案窗口选中再进行调试配置

成功生成项目以后,存在于该项目的release文件中

DLL文件注入

打开cmd进入到E:\Detours-4.0.1\bin.X86目录,如果是64位的,则进入bin.X64

etdll /? 会打印出注入工具的帮助命令

开始注入:

在命令提示符里输入格式如下的命令

setdll /d:【自己的DLL】 【目标exe程序】

>setdll /d:C:\Users\27824\source\repos\Dll3\Release\Dll3.dll C:\Users\27824\source\repos\target\Release\target.exe

一般会出现以下界面,则证明注入成功了

然后重新打开exe文件 :

示例一:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/490654.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

五音不全?手把手教你用自己声音唱任何歌;最详细的Auto-GPT整理;4月AI绘画模型推荐;HayoAI平台简直太酷了 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『ChatGPT Code Interpreter Magic』魔法&#xff01;离谱&#xff01;正在怀疑人生… OpenAI 近期面向部分用户发放了 Code Interp…

一起单测引起的项目加载失败惨案 | 京东云技术团队

作者&#xff1a;京东科技 宋慧超 一、前言 最近在开发一个功能模块时&#xff0c;在功能自测阶段&#xff0c;通过使用单测测试功能的完整性&#xff0c;在测试单测联通性使用到静态方法测试时&#xff0c;发现单测报错&#xff0c;通过查阅解决方案发现需要对Javaassist包进…

vue3+webpack4 前端优化首屏时间

项目背景 中小项目&#xff0c;Vue-cli3 vue2 webpack4 目标 缩短白屏时间&#xff0c;用户能够更快的看到我的页面&#xff01; 白屏时间&#xff1a;从打开页面到看到页面&#xff0c;中间白屏停留的时间。 方向 1.减少资源体积&#xff0c;从而缩短请求时间 2.减少资…

企业数字化转型为什么难?低代码平台能为企业带来什么?

企业数字化转型困难原因是多方便的&#xff0c;比如&#xff1a; 遗留系统&#xff1a;许多企业在难以替换或与新技术集成的遗留技术系统上投入了大量资金。 变革阻力&#xff1a;企业越大&#xff0c;参与决策的人就越多&#xff0c;让每个人都接受新工作方式的难度就越大。 …

前端架构师-week4-Node多进程开发入门

目录 学习路径 官方文档 什么是进程 child_process 用法 exec & execFile 用法 spawn 用法以及与exec & execFile的区别 fork用法及父子进程通信机制讲解 child_process同步方法使用教程 学习路径 官方文档 中文版&#xff1a;http://nodejs.cn/api/child_pr…

Flutter 如何将代码显示到界面上

前言 如何优雅的将项目中的代码&#xff0c;亦或是你的demo代码展示到界面上&#xff1f;本文对使用简单、便于维护且通用的解决方案&#xff0c;进行相关的对比和探究 为了节省大家的时间&#xff0c;把最终解决方案的相关接入和用法写在前面 预览代码 快速开始 接入&…

C. Permutation Game(博弈 + 拓扑的思想)

Problem - C - Codeforces 经过漫长的一天&#xff0c; Aice和Bob决定玩一个小游戏。游戏棋盘由n个格子组成&#xff0c;在一条直线上&#xff0c;编号从1到n,每个格子包含一个数字4;,qy在1到n.之间&#xff0c;而且没有两个格子包含相同的数字。 一个棋子被放在其中一个格子里…

nestJS入门cli 创建项目以及集成swagger和mysql

nestJs 1. 简介 介绍 NestJS NestJS 是一个基于 TypeScript 的渐进式 Node.js 框架&#xff0c;它结合了 OOP、FP 和 FRP 的元素&#xff0c;以提供一种现代且可扩展的开发体验。NestJS 建立在 Express.js 之上&#xff0c;但是提供了更加抽象和模块化的方式来编写应用程序。…

蓝牙资讯|苹果与谷歌起草蓝牙定位追踪设备行业规范

苹果与谷歌于当地时间5月2日联合提交了一份行业规范草案&#xff0c;以帮助应对蓝牙定位追踪设备遭滥用的问题。目前已有包括三星在内的追踪设备制造厂商宣布支持该草案。 据了解&#xff0c;苹果与谷歌此次联合提交的行业规范草案将云熙蓝牙定位追踪设备兼容跨iOS以及Android平…

【LeetCode: 518. 零钱兑换 II | 暴力递归=>记忆化搜索=>动态规划 | 背包模型】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

十五周算法训练营——二叉搜索树(BST)

今天是十五周算法训练营的第五周&#xff0c;主要讲二叉搜索树专题&#xff0c;包含&#xff1a;验证二叉搜索树、不同的二叉搜索树、二叉树的最近公共祖先、二叉搜索树的最近公共祖先。&#xff08;欢迎加入十五周算法训练营&#xff0c;与小伙伴一起卷算法&#xff09; BST的…

在SQL中使用AI【EVA】

EVA 旨在支持使用深度学习模型对结构化数据&#xff08;表格、特征向量&#xff09;和非结构化数据&#xff08;视频、播客、PDF 等&#xff09;进行操作的数据库应用程序。 它使用一系列受久经考验的关系数据库系统启发的优化&#xff0c;包括函数缓存、采样和基于成本的谓词重…

mybatisPlus初识

文章目录 什么是mybatisplus依赖入门案例自动填充乐观锁悲观锁乐观锁 mybatisPlus实现乐观锁批量查询根据指定条件查询 什么是mybatisplus mybatisplus是mybatis的增强工具&#xff0c;支持多种类型的数据库。 依赖 <dependency><groupId>com.baomidou</group…

我的服务器被挖矿了,原因竟是。。。

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 挖矿木马应急响应 一、什么是挖矿二、被挖矿主机现象三、挖矿木马处置思路1&#xff09;隔…

Git 使用教程:最详细、最正宗手把手教学(万字长文)

目录 一&#xff1a;Git二&#xff1a;SVN与Git的的区别三、安装Git四&#xff1a;常规操作五&#xff1a;远程仓库六&#xff1a;创建与合并分支七&#xff1a;bug分支八&#xff1a;多人协作九&#xff1a;git可视化工具 Git Git 是一种分布式版本控制系统&#xff0c;用于…

搭建免费的Plex媒体服务器 - 打造超级多媒体中心【异地远程连接】

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

科普, API 是这么演变而来的

API&#xff0c;全称为 Application Programming Interface&#xff0c;中文翻译为应用程序编程接口&#xff0c;是为了方便应用程序之间的数据和功能交互而设计的一些标准方法。API 的使用让开发者能够快速、高效地构建应用程序&#xff0c;从而加速了应用程序的开发速度。在 …

第二章物理层

1.物理层的基本概念 物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流。物理层为数据链路层屏蔽了各种传输媒体的差异&#xff0c;使数据链路层只需要考虑如何完成本层的协议和服务&#xff0c;而不必考虑网络具体的传输媒体是什么。 物理层协议的主要任务 机…

21.ThreadLocal有哪些内存泄漏问题?如何避免?

ThreadLocal有以下几个内存泄漏问题&#xff1a; 长期不清理&#xff1a;如果ThreadLocal对象被长期占用&#xff0c;且不及时清理&#xff0c;会导致内存泄漏&#xff1b;使用static ThreadLocal&#xff1a;如果将ThreadLocal定义为static变量&#xff0c;就会导致它的生命周…

Java程序设计-案例:自由落体

程序模拟物体从10000米高空掉落后的反弹行为。 球体每落地一次&#xff0c;就会反弹至原高度的一半。按用户输入的弹跳次数&#xff0c;计算球体每次弹跳的高度。 实现过程&#xff1a; 1. 新建项目&#xff1b; 2. 接收 用户输入的弹跳次数&#xff1a; &#xff08;1&#…