免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
上一个内容:47.HOOK引擎优化支持CALL与JMP位置做HOOK
以 47.HOOK引擎优化支持CALL与JMP位置做HOOK 它的代码为基础进行修改
效果图:游戏会崩溃这里没有处理所以会崩溃,处理后面写
实现方式是通过int3指令,只要处理器执行了int3指令就会触发异常,断点就是使用int3实现的,下图在Ollydbg中对代码打断点之后从Cheat Engine中可以看到内存的值是CC,CC就是int3的硬编码,
Ollydbg中的断点删掉然后从Cheat Engine中可以看到内存的值就恢复了,代码实现也是把要HOOK的地址写成int3然后再给VEH添加一个我们的处理进行拦截
代码:
新加类htdHook2
CWndMain.cpp文件里的修改:
hook.SetHook((LPVOID)0x41FDB2, 6, (LPVOID)0);
CWndMain.h文件里修改:
#include "htdHook2.h"
htdHook2 hook;
htdHook2.h文件里的代码:
#pragma once
#include "HOOKPOINT.h"
class htdHook2
{
public:
htdHook2();
void SetHook(LPVOID Address, uchar len, LPVOID AddressRet);
};
htdHook2.cpp文件里的代码
#include "pch.h"
#include "htdHook2.h"
LONG _stdcall PvectoredExceptionHandler(PEXCEPTION_POINTERS val) {
CString wTxt;
wTxt.Format(L"111----%X", val->ContextRecord->Eip);
AfxMessageBox(wTxt);
return EXCEPTION_CONTINUE_SEARCH;
}
htdHook2::htdHook2()
{
AddVectoredExceptionHandler(1, PvectoredExceptionHandler);
}
void htdHook2::SetHook(LPVOID Address, uchar len, LPVOID AddressRet)
{
DWORD dOld;
DWORD dNew;
// 更改内存权限让它可读可写
VirtualProtect(Address, 0x1, PAGE_EXECUTE_READWRITE, &dOld);
char* code = (char*)Address;
code[0] = 0xCC;
VirtualProtect(Address, 0x1, dOld, &dNew);
}