通過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