使用minhook的钩子函数。 C++

问题描述 投票:0回答:1

我有以下代码: 在其中,我正在尝试挂钩我需要的游戏功能。

#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,但游戏还是崩溃了

c++ hook reverse-engineering
1个回答
0
投票

我是菜鸟,我只能说你不

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

© www.soinside.com 2019 - 2024. All rights reserved.