内联Hook管理

该代码实现了一个InlineHook类,用于在内存中设置、删除和重新加载函数挂钩。InlineHook使用HookNode结构体存储原始和新代码,以及目标地址。通过VirtualProtect修改内存保护属性,实现代码替换。类提供了单个和全部钩子的管理功能。
摘要由CSDN通过智能技术生成

InlineHook .h

#pragma once
#include "framework.h"
struct HookNode {
	struct HookNode* next;
	char m_OldCode[5] = { 0 };
	char m_NewCode[5] = { 0 };
	PROC m_HookAddr = NULL;
	PROC m_HookTarget = NULL;
};
class InlineHook {
public:
	InlineHook();
	~InlineHook();
	void SetHook(PROC fpAddress, PROC fpTarget);
	void DeleteHook(PROC fpAddress);
	void UnLoadHook(PROC fpAddress);
	void ReLoadHook(PROC fpAddress);
	void DeleteAllHook();
	void UnLoadAllHook();
	void ReLoadAllHook();
private:
	HookNode* hooknode;
};

InlineHook.cpp

#include "pch.h"
#include "InlineHook.h"

InlineHook::InlineHook() {
	hooknode = nullptr;
}

InlineHook::~InlineHook() {
	DeleteAllHook();
}

void InlineHook::SetHook(PROC fpAddress, PROC fpTarget) {
	HookNode* curHookNode;
	if (hooknode == nullptr) {
		hooknode = new HookNode;
		hooknode->next = nullptr;
		curHookNode = hooknode;
	}
	else {
		curHookNode = hooknode;
		while (curHookNode->next) {
			curHookNode = curHookNode->next;
		}
		curHookNode->next = new struct HookNode;
		curHookNode = curHookNode->next; 
		curHookNode->next = nullptr;
	}
	curHookNode->m_HookAddr = fpAddress;
	curHookNode->m_HookTarget = fpTarget;
	curHookNode->m_NewCode[0] = 0xE9;
	*(DWORD*)((char*)curHookNode->m_NewCode + 1) = (DWORD)fpTarget - ((DWORD)fpAddress + 5);
	DWORD dwOld;
	BOOL bRet = VirtualProtect(fpAddress, 5, PAGE_EXECUTE_READWRITE, &dwOld);
	if (bRet) {
		memcpy(curHookNode->m_OldCode, fpAddress, 5);
		memcpy(fpAddress, curHookNode->m_NewCode, 5);
	}
	VirtualProtect(fpAddress, 5, dwOld, &dwOld);
}

void InlineHook::DeleteHook(PROC fpAddress) {
	HookNode* curHookNode = hooknode;
	HookNode* preHookNode = hooknode;
	while (curHookNode) {
		if (curHookNode->m_HookAddr == fpAddress)
			break;
		curHookNode = curHookNode->next;
		preHookNode = curHookNode;
	}
	if (curHookNode != nullptr) {
		DWORD dwOld;
		BOOL bRet = VirtualProtect(fpAddress, 5, PAGE_EXECUTE_READWRITE, &dwOld);
		if (bRet) {
			memcpy(fpAddress, curHookNode->m_OldCode, 5);
		}
		VirtualProtect(fpAddress, 5, dwOld, &dwOld);
		preHookNode->next = curHookNode->next;
		delete curHookNode;
	}
}

void InlineHook::UnLoadHook(PROC fpAddress) {
	HookNode* curHookNode = hooknode;
	while (curHookNode) {
		if(curHookNode->m_HookAddr == fpAddress)
			break;
		curHookNode = curHookNode->next;
	}
	if (curHookNode != nullptr) {
		DWORD dwOld;
		BOOL bRet = VirtualProtect(fpAddress, 5, PAGE_EXECUTE_READWRITE, &dwOld);
		if (bRet) {
			memcpy(fpAddress, curHookNode->m_OldCode, 5);
		}
		VirtualProtect(fpAddress, 5, dwOld, &dwOld);
	}
	
}

void InlineHook::ReLoadHook(PROC fpAddress) {
	HookNode* curHookNode = hooknode;
	while (curHookNode) {
		if (curHookNode->m_HookAddr == fpAddress)
			break;
		curHookNode = curHookNode->next;
	}
	if (curHookNode != nullptr) {
		DWORD dwOld;
		BOOL bRet = VirtualProtect(fpAddress, 5, PAGE_EXECUTE_READWRITE, &dwOld);
		if (bRet) {
			memcpy(fpAddress, curHookNode->m_NewCode, 5);
		}
		VirtualProtect(fpAddress, 5, dwOld, &dwOld);
	}
	
}

void InlineHook::DeleteAllHook() {
	HookNode* curHookNode = hooknode;
	while (curHookNode) {
		DWORD dwOld;
		BOOL bRet = VirtualProtect(curHookNode->m_HookAddr, 5, PAGE_EXECUTE_READWRITE, &dwOld);
		if (bRet) {
			memcpy(curHookNode->m_HookAddr, curHookNode->m_OldCode, 5);
		}
		VirtualProtect(curHookNode->m_HookAddr, 5, dwOld, &dwOld);
		HookNode* tempHookNode = curHookNode;
		curHookNode = curHookNode->next;
		delete tempHookNode;
	}
	hooknode = nullptr;
}

void InlineHook::UnLoadAllHook() {
	HookNode* curHookNode = hooknode;
	while (curHookNode) {
		DWORD dwOld;
		BOOL bRet = VirtualProtect(curHookNode->m_HookAddr, 5, PAGE_EXECUTE_READWRITE, &dwOld);
		if (bRet) {
			memcpy(curHookNode->m_HookAddr, curHookNode->m_OldCode, 5);
		}
		VirtualProtect(curHookNode->m_HookAddr, 5, dwOld, &dwOld);
		curHookNode = curHookNode->next;
	}
}

void InlineHook::ReLoadAllHook() {
	HookNode* curHookNode = hooknode;
	while (curHookNode) {
		DWORD dwOld;
		BOOL bRet = VirtualProtect(curHookNode->m_HookAddr, 5, PAGE_EXECUTE_READWRITE, &dwOld);
		if (bRet) {
			memcpy(curHookNode->m_HookAddr, curHookNode->m_NewCode, 5);
		}
		VirtualProtect(curHookNode->m_HookAddr, 5, dwOld, &dwOld);
		curHookNode = curHookNode->next;
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值