一次性Hook

Hook代码执行完修复并跳转回去
头文件

#pragma once

void InlineHookDevice();
void __stdcall UnHook(PROC fpWindowsApi);
void InlineHookOnceTime(LPVOID lpAddress, LPVOID lpTarget);

源文件

#include "pch.h"
#include "OneTimeHook.h"
#include "Windows.h"
char g_OldCode[5] = { 0 };
char g_NewCode[5] = { 0 };
PROC g_HookAddr = NULL;
PROC g_HookTarget = NULL;

#ifndef _WIN64


__declspec(naked) void InlineHookDevice() {
	__asm push g_HookAddr;
	__asm call UnHook
	__asm call g_HookTarget;
	__asm jmp g_HookAddr;
	/*__asm {
		push ebp
		mov ebp, esp
		sub esp, 20h
		lea eax, [ebp - 10]
		push eax
		push 40h
		push 5
		sub dword ptr[ebp + 4], 5
		mov eax, dword ptr[ebp + 4]
		push eax
		call VirtualProtect
		mov eax, dword ptr[ebp + 4]
		lea ebx, m_OldCode
		mov cl, byte ptr[ebx]
		mov byte ptr[eax], cl
		inc eax
		inc ebx
		mov cl, byte ptr[ebx]
		mov byte ptr[eax], cl
		inc eax
		inc ebx
		mov cl, byte ptr[ebx]
		mov byte ptr[eax], cl
		inc eax
		inc ebx
		mov cl, byte ptr[ebx]
		mov byte ptr[eax], cl
		inc eax
		inc ebx
		mov cl, byte ptr[ebx]
		mov byte ptr[eax], cl
		leave
		ret
	}*/
}

void __stdcall UnHook(PROC fpAddress) {
	DWORD dwOld;
	BOOL bRet = VirtualProtect(fpAddress, 5, PAGE_EXECUTE_READWRITE, &dwOld);
	if (bRet) {
		memcpy(fpAddress, g_OldCode, 5);
	}
	VirtualProtect(fpAddress, 5, dwOld, &dwOld);
}

void InlineHookOnceTime(LPVOID lpAddress, LPVOID lpTarget) {
	g_NewCode[0] = 0xE9;
	g_HookAddr = (PROC)lpAddress;
	g_HookTarget = (PROC)lpTarget;
	*(DWORD*)((char*)g_NewCode + 1) = (DWORD)(InlineHookDevice)-((DWORD)lpAddress + 5);
	DWORD dwOld;
	BOOL bRet = VirtualProtect(lpAddress, 5, PAGE_EXECUTE_READWRITE, &dwOld);
	if (bRet) {
		memcpy(g_OldCode, lpAddress, 5);
		memcpy(lpAddress, g_NewCode, 5);
	}
	VirtualProtect(lpAddress, 5, dwOld, &dwOld);
}


#endif // WIN64



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值