热补丁Hook链表管理

头文件

#pragma once
struct hotfixHookNode {
	struct hotfixHookNode* next;
	PROC m_HookAddr = NULL;
	PROC m_HookTarget = NULL;
};
class HotFixHook {
public:
	HotFixHook();
	~HotFixHook();
	void SetHook(PROC fpWin32Api, PROC fpTarget);

	void InsertHookNode(PROC fpWin32Api, PROC fpTarget);

	void UnLoadHook(PROC fpWin32Api);

	void ReLoadAllHook();
private:
	hotfixHookNode* hooknode;
};


源文件

#include "pch.h"
#include "HotFixHook.h"

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

HotFixHook::~HotFixHook() {
	hotfixHookNode* curHookNode = hooknode;
	while (curHookNode) {
		UnLoadHook(curHookNode->m_HookAddr);
		hotfixHookNode* tempHookNode = curHookNode;
		curHookNode = curHookNode->next;
		delete tempHookNode;
	}
	hooknode = nullptr;
}

void HotFixHook::SetHook(PROC fpWin32Api, PROC fpTarget) {

	unsigned char ucShortJmp[2] = { 0xEB,0xF9 };
	unsigned char ucNewCode[5] = { 0xE9 };
	*(DWORD*)(ucNewCode + 1) = (DWORD)fpTarget - (DWORD)fpWin32Api;
	DWORD dwOld;
	BOOL bRet = VirtualProtect((LPVOID)((DWORD)fpWin32Api - 5), 7, PAGE_EXECUTE_READWRITE, &dwOld);
	if (bRet) {
		memcpy((LPVOID)((DWORD)fpWin32Api - 5), ucNewCode, 5);
		memcpy(fpWin32Api, ucShortJmp, 2);
		InsertHookNode(fpWin32Api, fpTarget);
	}
	VirtualProtect((LPVOID)((DWORD)fpWin32Api - 5), 7, dwOld, &dwOld);
}

void HotFixHook::InsertHookNode(PROC fpWin32Api, PROC fpTarget) {
	hotfixHookNode* curHookNode;
	if (hooknode == nullptr) {
		hooknode = new hotfixHookNode;
		hooknode->next = nullptr;
		curHookNode = hooknode;
	}
	else {
		curHookNode = hooknode;
		while (curHookNode->next) {
			curHookNode = curHookNode->next;
		}
		curHookNode->next = new struct hotfixHookNode;
		curHookNode = curHookNode->next;
		curHookNode->next = nullptr;
	}
	curHookNode->m_HookAddr = fpWin32Api;
	curHookNode->m_HookTarget = fpTarget;
}

void HotFixHook::UnLoadHook(PROC fpWin32Api) {
	unsigned char ucCodes[7] = { 0x90,0x90, 0x90, 0x90, 0x90, 0x8B, 0xFF };
	DWORD dwOld;
	BOOL bRet = VirtualProtect((LPVOID)((DWORD)fpWin32Api - 5), 7, PAGE_EXECUTE_READWRITE, &dwOld);
	if (bRet) {
		memcpy((LPVOID)((DWORD)fpWin32Api - 5), ucCodes, 7);
	}
	VirtualProtect((LPVOID)((DWORD)fpWin32Api - 5), 7, dwOld, &dwOld);
}

void HotFixHook::ReLoadAllHook() {
	hotfixHookNode* curHookNode = hooknode;
	unsigned char ucShortJmp[2] = { 0xEB,0xF9 };
	unsigned char ucNewCode[5] = { 0xE9 };
	while (curHookNode) {
		*(DWORD*)(ucNewCode + 1) = (DWORD)curHookNode->m_HookTarget - (DWORD)curHookNode->m_HookAddr;
		DWORD dwOld;
		BOOL bRet = VirtualProtect((LPVOID)((DWORD)curHookNode->m_HookAddr - 5), 7, PAGE_EXECUTE_READWRITE, &dwOld);
		if (bRet) {
			memcpy((LPVOID)((DWORD)curHookNode->m_HookAddr - 5), ucNewCode, 5);
			memcpy(curHookNode->m_HookAddr, ucShortJmp, 2);
		}
		VirtualProtect((LPVOID)((DWORD)curHookNode->m_HookAddr - 5), 7, dwOld, &dwOld);
		curHookNode = curHookNode->next;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值