Step 1 / 3 · Шаг 1 / 3

Welcome / Добро пожаловать

Choose your language · Выберите язык

Step 2 / 3 · Шаг 2 / 3

Your country

Optional — helps us show relevant tips. Необязательно.

Step 3 / 3 · Шаг 3 / 3

What do you want to do?

We'll jump you straight to the right section.

GoreBox Private Server

BepInEx IL2CPP MinHook / HarmonyLib PlayFab Photon PUN2 C++ / C# .NET 4.7.2

1.
dnSpy

2.
Visual Studio 2022

3.
BepInEx IL2CPP (v6+)

1.

2.

3.

Steam Console
download_depot 2027330 2027331 3348281417896630206

1.

2.

3.


C# — Main Plugin
using BepInEx;
using BepInEx.Unity.IL2CPP;
using HarmonyLib;
using Photon.Pun;
using PlayFab;
using PlayFab.ClientModels;
using UnityEngine.Networking;

namespace GoreBoxMain
{
    [BepInPlugin("GoreBox", "GoreBoxMain", "1.0")]
    public class GoreBoxClass : BasePlugin
    {
        public override void Load()
        {
            Harmony harmony = new Harmony("Harmony");
            harmony.PatchAll();
        }

        [HarmonyPatch(typeof(VersionValidator), "YOUR_METHOD_NAME_HERE")]
        public static class VersionValPatch
        {
            private static bool Prefix(VersionValidator __instance)
            {
                // Replace Photon credentials with your own
                PhotonNetwork.PhotonServerSettings.AppSettings.AppIdRealtime = "YOUR_PHOTON_APP_ID";
                PhotonNetwork.PhotonServerSettings.AppSettings.AppIdVoice = "YOUR_PHOTON_VOICE_ID";

                // Replace PlayFab credentials with your own
                PlayFabSettings.PlayFabSharedPrivate.TitleId = "YOUR_TITLE_ID";
                PlayFabSettings.PlayFabSharedPrivate.ProductionEnvironmentUrl = "https://YOUR_TITLE_ID.playfabapi.com";

                LoginWithCustomIDRequest loginRequest = new LoginWithCustomIDRequest
                {
                    CreateAccount = new Il2CppSystem.Nullable<bool>(true),
                    CustomId = UnityEngine.SystemInfo.deviceUniqueIdentifier
                };

                System.Action<LoginResult> onSuccess = delegate (LoginResult result)
                {
                    __instance.LoginResult(result); // Find correct LoginResult in dnSpy
                };
                System.Action<PlayFabError> onError = delegate (PlayFabError err)
                {
                    __instance.PlayFabError(err); // Find correct PlayFabError in dnSpy
                };

                PlayFabClientAPI.LoginWithCustomID(loginRequest, onSuccess, onError, null, null);

                return false; // Skip the original method
            }
        }
    }
}

1.

2.

3.



1.
Visual Studio 2022

2.
IL2CPPDumper

C++ — V14 version.dll
// GoreBox V14 — Private Server Multiplayer + Steam Bypass

#include <cstdio>
#include <string>
#include <iostream>
#include <windows.h>
#include "Minhook.h"

#pragma comment(linker, "/NODEFAULTLIB:LIBCMT")

#define PROXY_OUT(func) __pragma(comment(linker, "/export:" #func "=My" #func))
PROXY_OUT(GetFileVersionInfoA) PROXY_OUT(GetFileVersionInfoByHandle) PROXY_OUT(GetFileVersionInfoExA)
PROXY_OUT(GetFileVersionInfoExW) PROXY_OUT(GetFileVersionInfoSizeA) PROXY_OUT(GetFileVersionInfoSizeExA)
PROXY_OUT(GetFileVersionInfoSizeExW) PROXY_OUT(GetFileVersionInfoSizeW) PROXY_OUT(GetFileVersionInfoW)
PROXY_OUT(VerFindFileA) PROXY_OUT(VerFindFileW) PROXY_OUT(VerInstallFileA) PROXY_OUT(VerInstallFileW)
PROXY_OUT(VerLanguageNameA) PROXY_OUT(VerLanguageNameW) PROXY_OUT(VerQueryValueA) PROXY_OUT(VerQueryValueW)

BOOL(WINAPI* o_GetFileVersionInfoA)(LPCSTR, DWORD, DWORD, LPVOID) = nullptr;
BOOL(WINAPI* o_GetFileVersionInfoByHandle)(DWORD, HANDLE, LPVOID, DWORD) = nullptr;
BOOL(WINAPI* o_GetFileVersionInfoExA)(DWORD, LPCSTR, DWORD, DWORD, LPVOID) = nullptr;
BOOL(WINAPI* o_GetFileVersionInfoExW)(DWORD, LPCWSTR, DWORD, DWORD, LPVOID) = nullptr;
DWORD(WINAPI* o_GetFileVersionInfoSizeA)(LPCSTR, LPDWORD) = nullptr;
DWORD(WINAPI* o_GetFileVersionInfoSizeExA)(DWORD, LPCSTR, LPDWORD) = nullptr;
DWORD(WINAPI* o_GetFileVersionInfoSizeExW)(DWORD, LPCWSTR, LPDWORD) = nullptr;
DWORD(WINAPI* o_GetFileVersionInfoSizeW)(LPCWSTR, LPDWORD) = nullptr;
BOOL(WINAPI* o_GetFileVersionInfoW)(LPCWSTR, DWORD, DWORD, LPVOID) = nullptr;
DWORD(WINAPI* o_VerFindFileA)(DWORD, LPCSTR, LPCSTR, LPCSTR, LPSTR, PUINT, LPSTR, PUINT) = nullptr;
DWORD(WINAPI* o_VerFindFileW)(DWORD, LPCWSTR, LPCWSTR, LPCWSTR, LPWSTR, PUINT, LPWSTR, PUINT) = nullptr;
DWORD(WINAPI* o_VerInstallFileA)(DWORD, LPCSTR, LPCSTR, LPCSTR, LPCSTR, LPCSTR, LPSTR, PUINT) = nullptr;
DWORD(WINAPI* o_VerInstallFileW)(DWORD, LPCWSTR, LPCWSTR, LPCWSTR, LPCWSTR, LPCWSTR, LPSTR, PUINT) = nullptr;
DWORD(WINAPI* o_VerLanguageNameA)(DWORD, LPSTR, DWORD) = nullptr;
DWORD(WINAPI* o_VerLanguageNameW)(DWORD, LPWSTR, DWORD) = nullptr;
BOOL(WINAPI* o_VerQueryValueA)(LPCVOID, LPCSTR, LPVOID*, PUINT) = nullptr;
BOOL(WINAPI* o_VerQueryValueW)(LPCVOID, LPCWSTR, LPVOID*, PUINT) = nullptr;

extern "C" {
    BOOL WINAPI MyGetFileVersionInfoA(LPCSTR l, DWORD d1, DWORD d2, LPVOID p) { return o_GetFileVersionInfoA ? o_GetFileVersionInfoA(l, d1, d2, p) : FALSE; }
    BOOL WINAPI MyGetFileVersionInfoByHandle(DWORD d1, HANDLE h, LPVOID p, DWORD d2) { return o_GetFileVersionInfoByHandle ? o_GetFileVersionInfoByHandle(d1, h, p, d2) : FALSE; }
    BOOL WINAPI MyGetFileVersionInfoExA(DWORD d1, LPCSTR l, DWORD d2, DWORD d3, LPVOID p) { return o_GetFileVersionInfoExA ? o_GetFileVersionInfoExA(d1, l, d2, d3, p) : FALSE; }
    BOOL WINAPI MyGetFileVersionInfoExW(DWORD d1, LPCWSTR l, DWORD d2, DWORD d3, LPVOID p) { return o_GetFileVersionInfoExW ? o_GetFileVersionInfoExW(d1, l, d2, d3, p) : FALSE; }
    DWORD WINAPI MyGetFileVersionInfoSizeA(LPCSTR l, LPDWORD p) { return o_GetFileVersionInfoSizeA ? o_GetFileVersionInfoSizeA(l, p) : 0; }
    DWORD WINAPI MyGetFileVersionInfoSizeExA(DWORD d, LPCSTR l, LPDWORD p) { return o_GetFileVersionInfoSizeExA ? o_GetFileVersionInfoSizeExA(d, l, p) : 0; }
    DWORD WINAPI MyGetFileVersionInfoSizeExW(DWORD d, LPCWSTR l, LPDWORD p) { return o_GetFileVersionInfoSizeExW ? o_GetFileVersionInfoSizeExW(d, l, p) : 0; }
    DWORD WINAPI MyGetFileVersionInfoSizeW(LPCWSTR l, LPDWORD p) { return o_GetFileVersionInfoSizeW ? o_GetFileVersionInfoSizeW(l, p) : 0; }
    BOOL WINAPI MyGetFileVersionInfoW(LPCWSTR l, DWORD d1, DWORD d2, LPVOID p) { return o_GetFileVersionInfoW ? o_GetFileVersionInfoW(l, d1, d2, p) : FALSE; }
    DWORD WINAPI MyVerFindFileA(DWORD d, LPCSTR l1, LPCSTR l2, LPCSTR l3, LPSTR l4, PUINT p1, LPSTR l5, PUINT p2) { return o_VerFindFileA ? o_VerFindFileA(d, l1, l2, l3, l4, p1, l5, p2) : 0; }
    DWORD WINAPI MyVerFindFileW(DWORD d, LPCWSTR l1, LPCWSTR l2, LPCWSTR l3, LPWSTR l4, PUINT p1, LPWSTR l5, PUINT p2) { return o_VerFindFileW ? o_VerFindFileW(d, l1, l2, l3, l4, p1, l5, p2) : 0; }
    DWORD WINAPI MyVerInstallFileA(DWORD d, LPCSTR l1, LPCSTR l2, LPCSTR l3, LPCSTR l4, LPCSTR l5, LPSTR l6, PUINT p) { return o_VerInstallFileA ? o_VerInstallFileA(d, l1, l2, l3, l4, l5, l6, p) : 0; }
    DWORD WINAPI MyVerInstallFileW(DWORD d, LPCWSTR l1, LPCWSTR l2, LPCWSTR l3, LPCWSTR l4, LPCWSTR l5, LPSTR l6, PUINT p) { return o_VerInstallFileW ? o_VerInstallFileW(d, l1, l2, l3, l4, l5, l6, p) : 0; }
    DWORD WINAPI MyVerLanguageNameA(DWORD d, LPSTR l, DWORD d2) { return o_VerLanguageNameA ? o_VerLanguageNameA(d, l, d2) : 0; }
    DWORD WINAPI MyVerLanguageNameW(DWORD d, LPWSTR l, DWORD d2) { return o_VerLanguageNameW ? o_VerLanguageNameW(d, l, d2) : 0; }
    BOOL WINAPI MyVerQueryValueA(LPCVOID p, LPCSTR l, LPVOID* lp, PUINT pu) { return o_VerQueryValueA ? o_VerQueryValueA(p, l, lp, pu) : FALSE; }
    BOOL WINAPI MyVerQueryValueW(LPCVOID p, LPCWSTR l, LPVOID* lp, PUINT pu) { return o_VerQueryValueW ? o_VerQueryValueW(p, l, lp, pu) : FALSE; }
}

void SetupProxy() {
    char sysPath[MAX_PATH];
    GetSystemDirectoryA(sysPath, MAX_PATH);
    HMODULE hReal = LoadLibraryA((std::string(sysPath) + "\version.dll").c_str());
    if (!hReal) return;
    o_GetFileVersionInfoA       = (decltype(o_GetFileVersionInfoA))      GetProcAddress(hReal, "GetFileVersionInfoA");
    o_GetFileVersionInfoByHandle= (decltype(o_GetFileVersionInfoByHandle))GetProcAddress(hReal, "GetFileVersionInfoByHandle");
    o_GetFileVersionInfoExA     = (decltype(o_GetFileVersionInfoExA))     GetProcAddress(hReal, "GetFileVersionInfoExA");
    o_GetFileVersionInfoExW     = (decltype(o_GetFileVersionInfoExW))     GetProcAddress(hReal, "GetFileVersionInfoExW");
    o_GetFileVersionInfoSizeA   = (decltype(o_GetFileVersionInfoSizeA))  GetProcAddress(hReal, "GetFileVersionInfoSizeA");
    o_GetFileVersionInfoSizeExA = (decltype(o_GetFileVersionInfoSizeExA))GetProcAddress(hReal, "GetFileVersionInfoSizeExA");
    o_GetFileVersionInfoSizeExW = (decltype(o_GetFileVersionInfoSizeExW))GetProcAddress(hReal, "GetFileVersionInfoSizeExW");
    o_GetFileVersionInfoSizeW   = (decltype(o_GetFileVersionInfoSizeW))  GetProcAddress(hReal, "GetFileVersionInfoSizeW");
    o_GetFileVersionInfoW       = (decltype(o_GetFileVersionInfoW))      GetProcAddress(hReal, "GetFileVersionInfoW");
    o_VerFindFileA    = (decltype(o_VerFindFileA))   GetProcAddress(hReal, "VerFindFileA");
    o_VerFindFileW    = (decltype(o_VerFindFileW))   GetProcAddress(hReal, "VerFindFileW");
    o_VerInstallFileA = (decltype(o_VerInstallFileA))GetProcAddress(hReal, "VerInstallFileA");
    o_VerInstallFileW = (decltype(o_VerInstallFileW))GetProcAddress(hReal, "VerInstallFileW");
    o_VerLanguageNameA= (decltype(o_VerLanguageNameA))GetProcAddress(hReal,"VerLanguageNameA");
    o_VerLanguageNameW= (decltype(o_VerLanguageNameW))GetProcAddress(hReal,"VerLanguageNameW");
    o_VerQueryValueA  = (decltype(o_VerQueryValueA)) GetProcAddress(hReal, "VerQueryValueA");
    o_VerQueryValueW  = (decltype(o_VerQueryValueW)) GetProcAddress(hReal, "VerQueryValueW");
}

uintptr_t GameAssembly = 0;
uintptr_t offset_ConnectUsingSettings = 0x0; // PhotonNetwork$$ConnectUsingSettings — from IL2CPPDumper
uintptr_t offset_SteamDetect_Awake   = 0x0; // SteamDetection$$Awake — from IL2CPPDumper

struct Il2CppString { void* k; void* m; int32_t len; wchar_t chars[1]; };
using il2cpp_string_new_t = Il2CppString* (*)(const char*);
il2cpp_string_new_t il2cpp_string_new = nullptr;

template <typename T>
void WriteMem(uintptr_t addr, T val) {
    DWORD old;
    VirtualProtect((LPVOID)addr, sizeof(T), PAGE_EXECUTE_READWRITE, &old);
    *(T*)addr = val;
    VirtualProtect((LPVOID)addr, sizeof(T), old, &old);
}

using o_photon_hook_t = void(*)(void*, bool, void*);
o_photon_hook_t o_photon_hook = nullptr;

void photon_hook(void* _appSettings, bool startInOfflineMode, void* mi) {
    if (_appSettings && il2cpp_string_new != nullptr) {
        WriteMem<uintptr_t>((uintptr_t)_appSettings + 0x10, (uintptr_t)il2cpp_string_new("")); // PUN2 App ID
        WriteMem<uintptr_t>((uintptr_t)_appSettings + 0x28, (uintptr_t)il2cpp_string_new("")); // Voice App ID
    }
    return o_photon_hook(_appSettings, startInOfflineMode, mi);
}

// V14 extra: bypass the Steam ownership check
using o_steam_hook_t = void(*)(void*, void*);
o_steam_hook_t o_steam_hook = nullptr;

void* steam_hook(void* __this, void* mi) {
    return nullptr; // Nulls out Awake — skips Steam check entirely
}

void Main() {
    while (!(GameAssembly = (uintptr_t)GetModuleHandleA("GameAssembly.dll"))) { Sleep(200); }
    HMODULE hGA = (HMODULE)GameAssembly;
    il2cpp_string_new = (il2cpp_string_new_t)GetProcAddress(hGA, "il2cpp_string_new");
    MH_Initialize();

    uintptr_t targetAddr  = GameAssembly + offset_ConnectUsingSettings;
    uintptr_t targetAddr2 = GameAssembly + offset_SteamDetect_Awake;

    if (MH_CreateHook((LPVOID)targetAddr,  (LPVOID)&photon_hook, (LPVOID*)&o_photon_hook) == MH_OK)
        MH_EnableHook((LPVOID)targetAddr);
    if (MH_CreateHook((LPVOID)targetAddr2, (LPVOID)&steam_hook,  (LPVOID*)&o_steam_hook)  == MH_OK)
        MH_EnableHook((LPVOID)targetAddr2);
}

BOOL APIENTRY DllMain(HMODULE hMod, DWORD reason, LPVOID lpRes) {
    if (reason == DLL_PROCESS_ATTACH) {
        DisableThreadLibraryCalls(hMod);
        SetupProxy();
        CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Main, 0, 0, 0);
    }
    return TRUE;
}

1.

2.

3.

1.
Visual Studio 2022

2.
IL2CPPDumper

C++ — V13 version.dll
// GoreBox V13 — Private Server Multiplayer Hook

#include <cstdio>
#include <string>
#include <iostream>
#include <windows.h>
#include "Minhook.h"

#pragma comment(linker, "/NODEFAULTLIB:LIBCMT")

#define PROXY_OUT(func) __pragma(comment(linker, "/export:" #func "=My" #func))
PROXY_OUT(GetFileVersionInfoA) PROXY_OUT(GetFileVersionInfoByHandle) PROXY_OUT(GetFileVersionInfoExA)
PROXY_OUT(GetFileVersionInfoExW) PROXY_OUT(GetFileVersionInfoSizeA) PROXY_OUT(GetFileVersionInfoSizeExA)
PROXY_OUT(GetFileVersionInfoSizeExW) PROXY_OUT(GetFileVersionInfoSizeW) PROXY_OUT(GetFileVersionInfoW)
PROXY_OUT(VerFindFileA) PROXY_OUT(VerFindFileW) PROXY_OUT(VerInstallFileA) PROXY_OUT(VerInstallFileW)
PROXY_OUT(VerLanguageNameA) PROXY_OUT(VerLanguageNameW) PROXY_OUT(VerQueryValueA) PROXY_OUT(VerQueryValueW)

BOOL(WINAPI* o_GetFileVersionInfoA)(LPCSTR, DWORD, DWORD, LPVOID) = nullptr;
BOOL(WINAPI* o_GetFileVersionInfoByHandle)(DWORD, HANDLE, LPVOID, DWORD) = nullptr;
BOOL(WINAPI* o_GetFileVersionInfoExA)(DWORD, LPCSTR, DWORD, DWORD, LPVOID) = nullptr;
BOOL(WINAPI* o_GetFileVersionInfoExW)(DWORD, LPCWSTR, DWORD, DWORD, LPVOID) = nullptr;
DWORD(WINAPI* o_GetFileVersionInfoSizeA)(LPCSTR, LPDWORD) = nullptr;
DWORD(WINAPI* o_GetFileVersionInfoSizeExA)(DWORD, LPCSTR, LPDWORD) = nullptr;
DWORD(WINAPI* o_GetFileVersionInfoSizeExW)(DWORD, LPCWSTR, LPDWORD) = nullptr;
DWORD(WINAPI* o_GetFileVersionInfoSizeW)(LPCWSTR, LPDWORD) = nullptr;
BOOL(WINAPI* o_GetFileVersionInfoW)(LPCWSTR, DWORD, DWORD, LPVOID) = nullptr;
DWORD(WINAPI* o_VerFindFileA)(DWORD, LPCSTR, LPCSTR, LPCSTR, LPSTR, PUINT, LPSTR, PUINT) = nullptr;
DWORD(WINAPI* o_VerFindFileW)(DWORD, LPCWSTR, LPCWSTR, LPCWSTR, LPWSTR, PUINT, LPWSTR, PUINT) = nullptr;
DWORD(WINAPI* o_VerInstallFileA)(DWORD, LPCSTR, LPCSTR, LPCSTR, LPCSTR, LPCSTR, LPSTR, PUINT) = nullptr;
DWORD(WINAPI* o_VerInstallFileW)(DWORD, LPCWSTR, LPCWSTR, LPCWSTR, LPCWSTR, LPCWSTR, LPSTR, PUINT) = nullptr;
DWORD(WINAPI* o_VerLanguageNameA)(DWORD, LPSTR, DWORD) = nullptr;
DWORD(WINAPI* o_VerLanguageNameW)(DWORD, LPWSTR, DWORD) = nullptr;
BOOL(WINAPI* o_VerQueryValueA)(LPCVOID, LPCSTR, LPVOID*, PUINT) = nullptr;
BOOL(WINAPI* o_VerQueryValueW)(LPCVOID, LPCWSTR, LPVOID*, PUINT) = nullptr;

extern "C" {
    BOOL WINAPI MyGetFileVersionInfoA(LPCSTR l, DWORD d1, DWORD d2, LPVOID p) { return o_GetFileVersionInfoA ? o_GetFileVersionInfoA(l, d1, d2, p) : FALSE; }
    BOOL WINAPI MyGetFileVersionInfoByHandle(DWORD d1, HANDLE h, LPVOID p, DWORD d2) { return o_GetFileVersionInfoByHandle ? o_GetFileVersionInfoByHandle(d1, h, p, d2) : FALSE; }
    BOOL WINAPI MyGetFileVersionInfoExA(DWORD d1, LPCSTR l, DWORD d2, DWORD d3, LPVOID p) { return o_GetFileVersionInfoExA ? o_GetFileVersionInfoExA(d1, l, d2, d3, p) : FALSE; }
    BOOL WINAPI MyGetFileVersionInfoExW(DWORD d1, LPCWSTR l, DWORD d2, DWORD d3, LPVOID p) { return o_GetFileVersionInfoExW ? o_GetFileVersionInfoExW(d1, l, d2, d3, p) : FALSE; }
    DWORD WINAPI MyGetFileVersionInfoSizeA(LPCSTR l, LPDWORD p) { return o_GetFileVersionInfoSizeA ? o_GetFileVersionInfoSizeA(l, p) : 0; }
    DWORD WINAPI MyGetFileVersionInfoSizeExA(DWORD d, LPCSTR l, LPDWORD p) { return o_GetFileVersionInfoSizeExA ? o_GetFileVersionInfoSizeExA(d, l, p) : 0; }
    DWORD WINAPI MyGetFileVersionInfoSizeExW(DWORD d, LPCWSTR l, LPDWORD p) { return o_GetFileVersionInfoSizeExW ? o_GetFileVersionInfoSizeExW(d, l, p) : 0; }
    DWORD WINAPI MyGetFileVersionInfoSizeW(LPCWSTR l, LPDWORD p) { return o_GetFileVersionInfoSizeW ? o_GetFileVersionInfoSizeW(l, p) : 0; }
    BOOL WINAPI MyGetFileVersionInfoW(LPCWSTR l, DWORD d1, DWORD d2, LPVOID p) { return o_GetFileVersionInfoW ? o_GetFileVersionInfoW(l, d1, d2, p) : FALSE; }
    DWORD WINAPI MyVerFindFileA(DWORD d, LPCSTR l1, LPCSTR l2, LPCSTR l3, LPSTR l4, PUINT p1, LPSTR l5, PUINT p2) { return o_VerFindFileA ? o_VerFindFileA(d, l1, l2, l3, l4, p1, l5, p2) : 0; }
    DWORD WINAPI MyVerFindFileW(DWORD d, LPCWSTR l1, LPCWSTR l2, LPCWSTR l3, LPWSTR l4, PUINT p1, LPWSTR l5, PUINT p2) { return o_VerFindFileW ? o_VerFindFileW(d, l1, l2, l3, l4, p1, l5, p2) : 0; }
    DWORD WINAPI MyVerInstallFileA(DWORD d, LPCSTR l1, LPCSTR l2, LPCSTR l3, LPCSTR l4, LPCSTR l5, LPSTR l6, PUINT p) { return o_VerInstallFileA ? o_VerInstallFileA(d, l1, l2, l3, l4, l5, l6, p) : 0; }
    DWORD WINAPI MyVerInstallFileW(DWORD d, LPCWSTR l1, LPCWSTR l2, LPCWSTR l3, LPCWSTR l4, LPCWSTR l5, LPSTR l6, PUINT p) { return o_VerInstallFileW ? o_VerInstallFileW(d, l1, l2, l3, l4, l5, l6, p) : 0; }
    DWORD WINAPI MyVerLanguageNameA(DWORD d, LPSTR l, DWORD d2) { return o_VerLanguageNameA ? o_VerLanguageNameA(d, l, d2) : 0; }
    DWORD WINAPI MyVerLanguageNameW(DWORD d, LPWSTR l, DWORD d2) { return o_VerLanguageNameW ? o_VerLanguageNameW(d, l, d2) : 0; }
    BOOL WINAPI MyVerQueryValueA(LPCVOID p, LPCSTR l, LPVOID* lp, PUINT pu) { return o_VerQueryValueA ? o_VerQueryValueA(p, l, lp, pu) : FALSE; }
    BOOL WINAPI MyVerQueryValueW(LPCVOID p, LPCWSTR l, LPVOID* lp, PUINT pu) { return o_VerQueryValueW ? o_VerQueryValueW(p, l, lp, pu) : FALSE; }
}

void SetupProxy() {
    char sysPath[MAX_PATH];
    GetSystemDirectoryA(sysPath, MAX_PATH);
    HMODULE hReal = LoadLibraryA((std::string(sysPath) + "\\version.dll").c_str());
    if (!hReal) return;
    o_GetFileVersionInfoA       = (decltype(o_GetFileVersionInfoA))      GetProcAddress(hReal, "GetFileVersionInfoA");
    o_GetFileVersionInfoByHandle= (decltype(o_GetFileVersionInfoByHandle))GetProcAddress(hReal, "GetFileVersionInfoByHandle");
    o_GetFileVersionInfoExA     = (decltype(o_GetFileVersionInfoExA))     GetProcAddress(hReal, "GetFileVersionInfoExA");
    o_GetFileVersionInfoExW     = (decltype(o_GetFileVersionInfoExW))     GetProcAddress(hReal, "GetFileVersionInfoExW");
    o_GetFileVersionInfoSizeA   = (decltype(o_GetFileVersionInfoSizeA))  GetProcAddress(hReal, "GetFileVersionInfoSizeA");
    o_GetFileVersionInfoSizeExA = (decltype(o_GetFileVersionInfoSizeExA))GetProcAddress(hReal, "GetFileVersionInfoSizeExA");
    o_GetFileVersionInfoSizeExW = (decltype(o_GetFileVersionInfoSizeExW))GetProcAddress(hReal, "GetFileVersionInfoSizeExW");
    o_GetFileVersionInfoSizeW   = (decltype(o_GetFileVersionInfoSizeW))  GetProcAddress(hReal, "GetFileVersionInfoSizeW");
    o_GetFileVersionInfoW       = (decltype(o_GetFileVersionInfoW))      GetProcAddress(hReal, "GetFileVersionInfoW");
    o_VerFindFileA    = (decltype(o_VerFindFileA))   GetProcAddress(hReal, "VerFindFileA");
    o_VerFindFileW    = (decltype(o_VerFindFileW))   GetProcAddress(hReal, "VerFindFileW");
    o_VerInstallFileA = (decltype(o_VerInstallFileA))GetProcAddress(hReal, "VerInstallFileA");
    o_VerInstallFileW = (decltype(o_VerInstallFileW))GetProcAddress(hReal, "VerInstallFileW");
    o_VerLanguageNameA= (decltype(o_VerLanguageNameA))GetProcAddress(hReal,"VerLanguageNameA");
    o_VerLanguageNameW= (decltype(o_VerLanguageNameW))GetProcAddress(hReal,"VerLanguageNameW");
    o_VerQueryValueA  = (decltype(o_VerQueryValueA)) GetProcAddress(hReal, "VerQueryValueA");
    o_VerQueryValueW  = (decltype(o_VerQueryValueW)) GetProcAddress(hReal, "VerQueryValueW");
}

uintptr_t GameAssembly = 0;
uintptr_t offset_ConnectUsingSettings = 0x0; // Photon.Pun.PhotonNetwork$$ConnectUsingSettings — get from IL2CPPDumper

struct Il2CppString { void* k; void* m; int32_t len; wchar_t chars[1]; };
using il2cpp_string_new_t = Il2CppString* (*)(const char*);
il2cpp_string_new_t il2cpp_string_new = nullptr;

template <typename T>
void WriteMem(uintptr_t addr, T val) {
    DWORD old;
    VirtualProtect((LPVOID)addr, sizeof(T), PAGE_EXECUTE_READWRITE, &old);
    *(T*)addr = val;
    VirtualProtect((LPVOID)addr, sizeof(T), old, &old);
}

using o_photon_hook_t = void(*)(void*, bool, void*);
o_photon_hook_t o_photon_hook = nullptr;

void photon_hook(void* _appSettings, bool startInOfflineMode, void* mi) {
    if (_appSettings && il2cpp_string_new != nullptr) {
        WriteMem((uintptr_t)_appSettings + 0x10, il2cpp_string_new("")); // PUN2 App ID — put yours here
        WriteMem((uintptr_t)_appSettings + 0x28, il2cpp_string_new("")); // Voice App ID — put yours here
    }
    return o_photon_hook(_appSettings, startInOfflineMode, mi);
}

void Main() {
    while (!(GameAssembly = (uintptr_t)GetModuleHandleA("GameAssembly.dll"))) { Sleep(200); }
    HMODULE hGA = (HMODULE)GameAssembly;
    il2cpp_string_new = (il2cpp_string_new_t)GetProcAddress(hGA, "il2cpp_string_new");
    MH_Initialize();
    uintptr_t targetAddr = GameAssembly + offset_ConnectUsingSettings;
    if (MH_CreateHook((LPVOID)targetAddr, (LPVOID)&photon_hook, (LPVOID*)&o_photon_hook) == MH_OK)
        MH_EnableHook((LPVOID)targetAddr);
}

BOOL APIENTRY DllMain(HMODULE hMod, DWORD reason, LPVOID lpRes) {
    if (reason == DLL_PROCESS_ATTACH) {
        DisableThreadLibraryCalls(hMod);
        SetupProxy();
        CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Main, 0, 0, 0);
    }
    return TRUE;
}

1.

2.

3.

1.

2.

3.

V15.15 3348281417896630206
V15.14 870527552046858271
V15.13 7476118174894341199
V14 278411263891078692
V13 4048480789313255345

C# — Imports.cs
using System;
using System.Runtime.InteropServices;
using System.Text;

public static class Imports
{
    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool CheckRemoteDebuggerPresent(
        IntPtr hProcess,
        ref bool isDebuggerPresent);

    [DllImport("user32.dll", SetLastError = true)]
    public static extern int GetWindowText(
        IntPtr hWnd,
        StringBuilder lpString,
        int nMaxCount);

    [DllImport("user32.dll", SetLastError = true)]
    public static extern int GetWindowTextLength(IntPtr hWnd);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool IsWindowVisible(IntPtr hWnd);
}
C# — Program.cs
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;

static class Detections
{
    public const string GameProcessName = "GoreBox";

    private static readonly HashSet<string> SuspiciousWindowTitles = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
    {
        "Cheat Engine", "Process Hacker", "System Informer", "x64dbg", "x32dbg", "IDA Pro", "OllyDbg",
        "BepInEx", "MelonLoader"
    };

    private static readonly HashSet<string> ModFolderNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
    {
        "BepInEx", "MelonLoader", "Mods", "UserMods", "UserLibs", "dotnet", "Plugins"
    };

    private static readonly HashSet<string> ForbiddenFiles = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
    {
        "winhttp.dll", "winmm.dll", "dinput8.dll", "dxgi.dll", "d3d9.dll", "d3d11.dll", "d3d12.dll",
        "opengl32.dll", "xinput1_3.dll", "xinput1_4.dll", "xinput9_1_0.dll", "dsound.dll", "ddraw.dll",
        "msacm32.dll", "cryptsp.dll", "doorstop_config.ini", "doorstop_config.xml", "doorstop_config",
        "doorstop.dll", "BepInEx.cfg", "MelonLoader.dll", "bootstrap.dll", "IPA.Injector.exe",
        "IPA.Loader.dll", "BSIPA.dll", "UnityModManager.dll", "UnityModManagerConfig.xml", "injector.dll",
        "loader.dll", "proxy.dll", "hack.dll", "modloader.dll", "mod_loader.dll", "imgui.ini",
        "imgui.dll", "cimgui.dll", "REFramework.dll", "0Harmony.dll", "HarmonyX.dll", "MonoMod.RuntimeDetour.dll",
        "Mono.Cecil.dll", "GameAssembly.dll.bak", "global-metadata.dat.bak", "Il2CppInterop.Runtime.dll",
        "UnhollowerBaseLib.dll", "speedhack.dll"
    };

    private static bool CheckDirectoryForMods(string path)
    {
        if (string.IsNullOrEmpty(path) || !Directory.Exists(path)) return false;

        try
        {
            foreach (var dir in Directory.GetDirectories(path))
            {
                if (ModFolderNames.Contains(Path.GetFileName(dir)))
                    return true;
            }

            foreach (var file in Directory.GetFiles(path))
            {
                if (ForbiddenFiles.Contains(Path.GetFileName(file)))
                    return true;
            }
        }
        catch { }
        return false;
    }

    public static bool IntegrityCheckFailed()
    {
        string localDir = AppContext.BaseDirectory;
        if (CheckDirectoryForMods(localDir)) return true;

        try
        {
            DirectoryInfo parent = Directory.GetParent(localDir);
            if (parent != null) parent = Directory.GetParent(parent.FullName);
            if (parent != null) parent = Directory.GetParent(parent.FullName);

            if (parent != null && CheckDirectoryForMods(parent.FullName))
            {
                return true;
            }
        }
        catch { }

        return false;
    }

    public static bool IsGameBeingDebugged()
    {
        var targets = Process.GetProcessesByName(GameProcessName);
        if (targets.Length == 0) return false;

        foreach (var proc in targets)
        {
            try
            {
                bool isTargetDebugged = false;
                if (Imports.CheckRemoteDebuggerPresent(proc.Handle, ref isTargetDebugged) && isTargetDebugged)
                {
                    return true;
                }
            }
            catch { return true; }
        }
        return false;
    }

    public static bool ScanBadWindows()
    {
        foreach (var proc in Process.GetProcesses())
        {
            try
            {
                IntPtr hWnd = proc.MainWindowHandle;
                if (hWnd == IntPtr.Zero || !Imports.IsWindowVisible(hWnd))
                    continue;

                int length = Imports.GetWindowTextLength(hWnd);
                if (length == 0) continue;

                StringBuilder builder = new StringBuilder(length + 1);
                Imports.GetWindowText(hWnd, builder, builder.Capacity);
                string title = builder.ToString();

                if (SuspiciousWindowTitles.Any(badTitle => title.IndexOf(badTitle, StringComparison.OrdinalIgnoreCase) >= 0))
                {
                    return true;
                }
            }
            catch { }
        }
        return false;
    }

    public static void KillGame()
    {
        foreach (var proc in Process.GetProcessesByName(GameProcessName))
        {
            try { proc.Kill(); } catch { }
        }
    }
}

public static class Entry
{
    public static void Main()
    {
        Thread.Sleep(2000);

        while (true)
        {
            var games = Process.GetProcessesByName(Detections.GameProcessName);

            if (games.Length == 0)
            {
                Thread.Sleep(3000);
                if (Process.GetProcessesByName(Detections.GameProcessName).Length == 0)
                    break;
            }
            if (Detections.IntegrityCheckFailed() || Detections.IsGameBeingDebugged() || Detections.ScanBadWindows())
            {
                Detections.KillGame();
                Thread.Sleep(1000);
                Environment.Exit(0);
            }

            Thread.Sleep(1000);
        }
    }
}


1.

2.

3.

4.

5.