通过Hook进行游戏的全局加速


 游戏在运行中为了隔离硬件差异而导致不同电脑中游戏内物体移动速度不同,一般都还采用通过时间变量来计算每一帧移动的距离。全局加速的关键就在于增加每一帧之间的DeltaTime,从而实现移动速度加快。(本实例用到了MinHook。。。)

  我只Hook了GetTickCount, GetTickCount64和TimeGetTime这三个系统函数,下面为GetTickCount hook函数原型

#include "MiniHook/MinHook.h"
#define openlog
#include "Log/Log.h"
#include <windows.h>
#pragma comment(lib, "winmm.lib")
typedef DWORD(WINAPI *pfnHookGetTickCount)();
typedef ULONGLONG(WINAPI *pfnHookGetTickCount64)();
typedef DWORD(WINAPI *pfnHookTimeGetTime)();
pfnHookGetTickCount pfnOldTickCount = nullptr;
pfnHookGetTickCount64 pfnOldTickCount64 = nullptr;
pfnHookTimeGetTime pfnOldTimeGetTime = nullptr;

int dwSpeedTimes = 10;
DWORD newGetTickCount()
{
if (!pfnOldTickCount)
{
return 0;
}
static DWORD g_dwRealTick = pfnOldTickCount();
static DWORD g_dwHookTick = pfnOldTickCount();
DWORD tmpTick = pfnOldTickCount();
g_dwHookTick = g_dwHookTick + dwSpeedTimes * (tmpTick - g_dwRealTick);
g_dwRealTick = tmpTick;
return g_dwHookTick;
}

GetTickCount64和TimeGetTime的实现跟GetTickCount类似就不贴了 在Windows平台上还有一个QueryPerformanceCounter函数没有考虑

  防全局加速在32位系统上最简单的方式就是直接重载一份kernel32.dll计算重载之后获取的DeltaTime和在游戏中获取的DeltaTime,判断是否加速。

  

  

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM