我有以下代码: 在其中,我正在尝试挂钩我需要的游戏功能。
#include "pch.h"
#include <Windows.h>
#include <cstdio>
#include <MinHook.h>
uintptr_t base = (uintptr_t)GetModuleHandle(NULL);
uintptr_t GameAssembly = (uintptr_t)GetModuleHandle(L"GameAssembly.dll");
uintptr_t SetOffset = 0x341C20;
void CreateConsole()
{
AllocConsole();
FILE* f;
freopen_s(&f, "CONOUT$", "w", stdout);
}
void init()
{
MH_Initialize();
CreateConsole();
printf("started");
}
bool(__fastcall* build)(DWORD*, DWORD*, DWORD*);
bool __stdcall build_hook(DWORD* __this, DWORD* buildingDef, DWORD* methodinfo)
{
printf("buildingDef is called!!!");
return true;
}
void main()
{
init();
MH_CreateHook(reinterpret_cast<LPVOID*>(GameAssembly + SetOffset), &build_hook, (LPVOID*)&build);
MH_EnableHook(reinterpret_cast<LPVOID*>(GameAssembly + SetOffset));
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)main, 0, 0, 0);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
这就是该函数在 dumper 中的样子:
{
"Address": 3415072,
"Name": "Game.Managers.BuildingManager.BuildingManager$$RequestStartBuilding",
"Signature": "bool Game_Managers_BuildingManager_BuildingManager__RequestStartBuilding (Game_Managers_BuildingManager_BuildingManager_o* __this, Game_Managers_BuildingManager_BuildingConfiguration_BuildingDef_o* buildingDef, const MethodInfo* method);",
"TypeSignature": "iiii"
}
我的代码成功到达“printf(“buildingDef is called!!!”);”,之后游戏崩溃了(参见屏幕截图)。 我在使用minhook时做错了什么?
我尝试将 true 函数的返回值改为 false,但游戏还是崩溃了
我是菜鸟,我只能说你不
return true
你返回完整的方法。
以你的例子,你应该返回:
bool(__fastcall* build)(DWORD*, DWORD*, DWORD*);
bool __stdcall build_hook(DWORD* __this, DWORD* buildingDef, DWORD*method) {
printf("buildingDef is called!!!");
return build(__this, buildingDef,method);
}
及其
DWORD*method
不是 DWORD*methodinfo
。