#pragma once
using HookTargetProc = LONG(NTAPI*)(struct _EXCEPTION_POINTERS* ExceptionInfo);
struct VEH_HOOK {
LPVOID HookAddress;
HookTargetProc TargetAddress;
UCHAR OldCode;
struct VEH_HOOK* next;
};
struct VEHCPUHOOK {
LPVOID lpHookAddress;
HookTargetProc TargetAddress;
};
using HOOKNODE = struct VEH_HOOK;
using CPUHOOKINFO = struct VEHCPUHOOK;
void InitVehHook();
void SetVehHook(LPVOID lpHookAddress, HookTargetProc lpTarget);
void SetVehCpuHook(LPVOID lpHookAddress, HookTargetProc lpTarget);
void SetThreadHook(HANDLE hThread);
void DeleteAllHook();
#include "pch.h"
#include "VehHook.h"
#include <TlHelp32.h>
#include <iostream>
HOOKNODE* nodeExceptionHook;
CPUHOOKINFO cpuHookInfo[4] = {
0 };
LONG NTAPI VehHookHandle(struct _EXCEPTION_POINTERS* ExceptionInfo) {
if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT) {
HOOKNODE* tempHookNode = nodeExceptionHook;
while (tempHookNode != nullptr) {
if (tempHookNode->HookAddress == ExceptionInfo->ExceptionRecord->ExceptionAddress) {
DWORD dwOld;
VirtualProtect(tempHookNode->HookAddress, 1, PAGE_EXECUTE_READWRITE, &dwOld);
*(UCHAR*)(tempHookNode->HookAddress) = tempHookNode->OldCode;
tempHookNode->TargetAddress(ExceptionInfo);
ExceptionInfo->ContextRecord->EFlags |= 0x100;
VirtualProtect(tempHookNode->HookAddress, 1, dwOld, &dwOld);
return EXCEPTION_CONTINUE_EXECUTION;
}
tempHookNode = tempHookNode->next;
}
return EXCEPTION_CONTINUE_SEARCH;
}
else if (ExceptionInfo