插件开发手册

插件产品介绍
Game-Plug 是一款功能强大的 Windows 逆向开发插件,兼容 VC++、Delphi、VB、按键精灵、火山 PC、等多种编程语言调用。它面向编程人员提供窗口、内存、线程、汇编、HOOK、注入、Call、按键、封包、驱动防检测等全方位操作命令,并配有对应的使用案例示范,简单易学、上手快、实用性强。
目录导航

暂停超级Hook - PauseSuperHook

接口 ID 129 | 分类:超级Hook | 定义文件:x64GamePlug.idl

作用说明

暂停超级Hook:把 hook 点临时还原成原指令(跳板和记录保留,目标正常执行),配合 继续SuperHook 恢复拦截。pid 目标进程;hookAddr 安装时用的 hook 地址(传 0 = 暂停该进程装的全部)

参数说明
参数名方向类型说明
pid[in]long目标进程 ID(十进制整数);可用 GetWindowProcessId 取窗口所属进程的 PID
hookAddr[in]__int64 (int64)hook 地址(64 位整数)。安装时填目标进程内的指令地址;卸载/暂停/继续时填安装时用的地址,传 0 = 对该进程已装的全部 hook 生效;读寄存器快照时传 0 = 取该进程最后装的那个 hook
VC++ 调用示例(x64,控制台工程)
// 说明:本示例为完整 x64 控制台工程,整段复制覆盖新建控制台工程的 main.cpp 即可编译运行。
//   1. VS2019 新建「控制台应用」,项目属性 -> 平台选 x64,才能加载 64 位 DLL。
//   2. 项目属性 -> C/C++ -> 预编译头 -> 改为「不使用预编译头」,否则默认找 pch.h 会报 C1010。
//   3. 把 x64Game-Plug.dll 放到 exe 同目录(#import 与免注册加载都需要)。
//   4. 源码保存为 UTF-8 带 BOM,避免中文乱码;全站用 regsvr32 注册也可(需管理员)。
#include <iostream>
#include <clocale>
#include <windows.h>
#include <comdef.h>

// 免注册加载:用 IGamePlug 智能指针装载
// rename 是为避开 windows.h 的 FindWindow 宏冲突,接口里的 FindWindow 在 C++ 侧改名为 FindWindowGP
#import "x64Game-Plug.dll" no_namespace rename("FindWindow", "FindWindowGP")

static HMODULE      g_hDll = NULL;
static IGamePlugPtr g_plug;

// ---------- 免注册:加载 DLL 并创建对象(发布时把 DLL 放 exe 同目录)----------
static bool LoadPlug() {
    const wchar_t* paths[] = {
        L"x64Game-Plug.dll",
        L"..\x64Game-Plug.dll"
    };
    for (int i = 0; i < (int)(sizeof(paths) / sizeof(paths[0])); ++i) {
        g_hDll = ::LoadLibraryW(paths[i]);
        if (g_hDll) break;
    }
    if (!g_hDll) {
        std::cout << "LoadLibrary failed: put x64Game-Plug.dll next to the exe" << std::endl;
        return false;
    }
    typedef HRESULT (__stdcall *GamePlugCreateFn)(IGamePlug**);
    GamePlugCreateFn fn = (GamePlugCreateFn)::GetProcAddress(g_hDll, "GamePlugCreate");
    if (!fn) { std::cout << "GetProcAddress GamePlugCreate failed" << std::endl; return false; }
    HRESULT hr = fn(&g_plug);
    if (FAILED(hr)) { std::cout << "GamePlugCreate failed: 0x" << std::hex << hr << std::endl; return false; }
    return true;
}
int main() {
    if (!LoadPlug()) { system("pause"); return 1; }
    // 授权(收费功能需先传入授权码,去 https://www.game-plug.cn/ 获取)
    g_plug->SetUsername(_bstr_t(L"U12-XXXXXXXXXXXXXXXX"));

    // ---------- 调用插件本命令方法如下 ----------
    try {
        long pid = 1234;
        __int64 hookAddr = 0x0000000140123456;  // 替换成目标进程内真实的 hook 地址
        VARIANT_BOOL v = g_plug->PauseSuperHook(pid, hookAddr);
        std::cout << "结果: " << (v ? 1 : 0) << std::endl;
    } catch (_com_error& e) {
        std::wcout << L"COM error: " << e.ErrorMessage() << std::endl;
    }

    g_plug->Release();
    system("pause");
    return 0;
}

返回值

返回 1 表示暂停成功(hook 点已临时还原成原指令),0 表示失败。

常见注意事项
  • 以上超级Hook 方法均为收费功能,使用前需先调用 SetUsername 传入有效授权码(示例开头已激活该调用,发布时请改为你自己的授权码)。
  • 按目标进程位数选接口:32 位目标用 SuperHookx86 / ReadSuperHookx86 / ReadSuperHookRegsx86,64 位目标用 SuperHookx64 / ReadSuperHookx64 / ReadSuperHookRegsx64。卸载、暂停、继续各有通用版(UninstallSuperHook / PauseSuperHook / ResumeSuperHook)与 64 位专用版(UninstallSuperHookx64 / PauseSuperHookx64 / ResumeSuperHookx64),按目标位数选用。
  • hookAddr 必须是目标进程内的有效指令地址,hookLen 至少 5 字节且必须覆盖完整指令;建议先用反汇编确认指令边界,截断指令会导致目标进程异常。
  • 安装采用消息模式:命中后插件会 SendMessage(hwnd, msgId, wParam=hook地址, lParam=命中次数) 同步通知,游戏线程会等窗口处理完才继续。请在自己的窗口过程里处理 msgId,并在其中调用 ReadSuperHookRegsx86 / ReadSuperHookRegsx64(pid, wParam) 读取本次命中的寄存器快照。
  • 读寄存器优先用 ReadSuperHookRegsx86 / ReadSuperHookRegsx64:只打开进程一次、只读一次,保证拿到的是同一次命中的值,比连续调用多次单项读取接口快且不会混值。
  • 暂停(Pause)只把 hook 点临时还原成原指令,跳板和命中记录都保留,目标正常执行;继续(Resume)重新写回跳转恢复拦截,不用重新安装。
  • 程序退出前用 Uninstall 系列卸载并恢复原指令,hookAddr 传 0 可一次卸载该进程装的全部 hook;地址与窗口句柄一律用 64 位整数,不要用 32 位 LONG,否则高位会被截断。