首页 > 系统相关 >C++ Windows Hook使用

C++ Windows Hook使用

时间:2024-06-19 21:00:36浏览次数:13  
标签:szLibPath Windows void C++ Hook LotTest PROCESS NULL hThread

GitHub - microsoft/Detours: Detours is a software package for monitoring and instrumenting API calls on Windows. It is distributed in source code form.

/*

挂载钩子 setdll /d:C:\Users\g\source\repos\LotTest\Release\lotDll.dll C:\Users\g\source\repos\LotTest\bin\x86\Release\net6.0-windows\LotTest.exe
卸载钩子 setdll /r C:\Users\g\source\repos\LotTest\bin\x86\Release\net6.0-windows\LotTest.exe
*/

#include <Windows.h>
#include "detours/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, "MyHook!! MessageBoxCRACK!!", "Please", MB_OK);
}

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

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


/*
// 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;
}
*/

void injectProcess() {
	HANDLE hProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ,
		FALSE, pid);

	if (hProcess != NULL)
	{
		TRACE("InjectHook \n");
		HANDLE hThread;
		char   szLibPath[_MAX_PATH];
		void* pLibRemote = 0;
		DWORD  hLibModule = 0;

		HMODULE hKernel32 = ::GetModuleHandle("Kernel32");

		if (!::GetSystemDirectory(szLibPath, _MAX_PATH))
			return;

		strcat(szLibPath, "C:\\windows\\HookDll.dll");

		pLibRemote = ::VirtualAllocEx(hProcess, NULL, sizeof(szLibPath), MEM_COMMIT, PAGE_READWRITE);

		if (pLibRemote == NULL)
			return;

		::WriteProcessMemory(hProcess, pLibRemote, (void*)szLibPath, sizeof(szLibPath), NULL);

		hThread = ::CreateRemoteThread(hProcess, NULL, 0,
			(LPTHREAD_START_ROUTINE) ::GetProcAddress(hKernel32, "LoadLibraryA"),
			pLibRemote, 0, NULL);

		if (hThread != NULL)
		{
			::WaitForSingleObject(hThread, INFINITE);
			::GetExitCodeThread(hThread, &hLibModule);
			::CloseHandle(hThread);
		}
	}
}

void test() {
	StartHook();
	PVOID g_pOldMessageBoxW = NULL;
	PVOID g_pOldMessageBoxA = NULL;
	g_pOldMessageBoxA = DetourFindFunction("User32.dll", "MessageBoxA");
	MessageBox(0, "test", "test", 0);
	EndHook();
}


创作不易,小小的支持一下吧!

标签:szLibPath,Windows,void,C++,Hook,LotTest,PROCESS,NULL,hThread
From: https://blog.csdn.net/qq_30220519/article/details/139812891

相关文章

  • Windows 10 磁盘管理使用教程 Windows 10 磁盘管理工具的基本步骤和常见操作;高级的 Wi
    Windows10磁盘管理初级使用教程大纲:1. 打开磁盘管理工具方法:右键点击“此电脑”或者“计算机”图标,选择“管理”,然后在左侧面板中找到并点击“磁盘管理”。2. 磁盘基本信息查看查看已安装的物理硬盘和分区的基本信息:硬盘列表分区列表可用空间和已用空间3. 创......
  • ensp通过云连接VMware中Windows Server 2012 中搭建的DHCP服务器实现不同VLAN自动获取
    实验描述通过在ensp中搭建拓扑图实现在VLAN10获取192.168.1.0网段地址,VLAN10获取192.168.1.0网段地址,VLAN20获取192.168.2.0网段地址,VLAN30获取192.168.1.0网段地址,VLAN40获取192.168.4.0网段地址.WindowsServer2012搭建DHCP服务器开启VMware配置网卡信息选择为自定......
  • 基于QT和C++实现的中国象棋
    一,源码board.h#ifndefBOARD_H#defineBOARD_H#include<QWidget>#include"Stone.h"classBoard:publicQWidget{Q_OBJECTpublic:explicitBoard(QWidget*parent=0);bool_bRedTurn;//红方先走int_currentPlayer;//当前玩......
  • Pgsql数据库之Linux环境备份Windows环境还原
    Pgsql数据库之Linux环境备份Windows环境还原Linux环境备份使用pg_dump备份pg_dump是一个命令行工具,用于备份单个数据库。它可以生成一个SQL脚本文件,该文件包含了重建数据库所需的所有SQL命令。pg_dump-h主机名-p端口号-U用户名-Fc-b-v-fmypg.pgdumpmypg......
  • windows本地部署dify
     Dify与之前的MaxKB不同,MaxKB可以实现基础的问答以及知识库功能,但是如果要开发一个Agent,或者工作流就还是需要额外开发,而Dify是一个开源LLM应用开发平台。其直观的界面结合了AI工作流、RAG管道、代理功能、模型管理、可观察性功能等,让您可以快速从原型开发到生产。以下......
  • C++学习(22)
    #学习自用#计时计时可以计算出执行代码时花费了多长时间,对于同样的目的,我们可以通过不同的代码实现,而执行时间长短是评价一串代码性能如何的指标。#include<iostream>#include<string>#include<chrono>#include<thread>usingnamespacestd;intmain(){ autostar......
  • C/C++ 对文件目录进行操作的常用函数
    在C语言中,对目录进行操作的常用函数主要包括但不限于以下几个:opendir(constchar*name):功能:打开指定路径的目录。返回值:成功时返回一个指向DIR结构体的指针,失败则返回NULL。头文件:<dirent.h>readdir(DIR*dirp):功能:从打开的目录中读取下一个目录条目。返回值:成......
  • centos7离线升级gcc , 报错:/lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found
     因为需要依赖gcc高版本但是目前服务器版本是4.8.5的然后服务器又是内网所以只能离线升级gcc 分别下载https://ftp.gnu.org/gnu/gcc/gcc-8.3.0/gcc-8.3.0.tar.gzhttps://ftp.gnu.org/pub/gnu/gmp/gmp-6.1.0.tar.bz2https://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gzhttp:......
  • C/C++ 操作文件常用的函数
    C语言中操作文件常用的函数包括但不限于以下几种:打开和关闭文件fopen(constchar*path,constchar*mode):用于打开一个文件,返回一个指向FILE结构体的指针,path是文件路径,mode定义了文件的打开模式(如读、写、追加等)。fclose(FILE*stream):关闭由fopen()打开的文件,并刷新缓......
  • 在 windows 上搭建一台 Linux
    前言看这篇文章之前,首先得要给大家先介绍一下什么是虚拟机。虚拟机是一种软件,它可以在一台物理服务器上,也就是我们平时所使用的电脑,虚拟出多台逻辑服务器,这个逻辑服务器怎么理解呢?逻辑服务器是指在物理服务器基础上,通过虚拟化技术或软件配置来划分和管理的虚拟服务器。它不......