QQ图标网

 找回密码
 立即注册
查看: 865|回复: 0

[C++资源] 实现用户态完美进程加速(变速齿轮原理解析)

[复制链接]

该用户从未签到

发表于 2016-1-30 11:08:24 | 显示全部楼层 |阅读模式

对于变速齿轮大家可能都了解,他的原理就是对指定进程进行加速.通过Hook函数达到变速目的,这三个函数分别是Kernel32.dll的GetTickCount和QueryPerformanceCounter,Winmm.dll的timeGetTime,通过Hook拦截这三个函数的数据乘以倍数达到加减速目的.
这三个函数的定义是:
typedef DWORD(WINAPI* GetTickCount_t)(void);
typedef DWORD(WINAPI* timeGetTime_t)(void);
typedef BOOL(WINAPI* QueryPerformanceCounter_t)(LARGE_INTEGER*);
我利用的是Microsoft的Detour支持库完成Hook,如下:
pGetTickCount = (GetTickCount_t)DetourFunction((PBYTE)DetourFindFunction("kernel32.dll", "GetTickCount"), (PBYTE)MGetTickCount);
ptimeGetTime = (timeGetTime_t)DetourFunction((PBYTE)DetourFindFunction("winmm.dll", "timeGetTime"), (PBYTE)MtimeGetTime);
pQueryPerformanceCounter = (QueryPerformanceCounter_t)DetourFunction((PBYTE)DetourFindFunction("kernel32.dll", "QueryPerformanceCounter"), (PBYTE)MQueryPerformanceCounter);
Hook完函数一定要记得在自己的子程序里面回调,不然相当于拦截函数不返回数据,可能会导致变速的进程崩溃.
早在以前按键精灵作者公布过加速公式:Result= 上次返回时间 + Round((当前返回时间 - 上次正常时间) * Power(2,倍数))
在C++里面:dwRet = LONGLONG(double(originalRet - g_dwLastOfQueryPerformanceCounterRet) * pow(2, g_dMultiple) + g_dwRetLastOfQueryPerformanceCounterRet);
倍数是2的次方,范围在0-256倍.
在我研究的这段时间内我发现3D的游戏大部分都是用的精准计时器函数,也就是QueryPerformanceCounter,这个函数是这三个函数中最麻烦的函数,不过大同小异
,原理是一样的.还有的游戏可能为了避免加速,用一些不常见的函数,例如多媒体精准时钟timeSetEvent,普通时钟SetTimer,延时函数Sleep,等等,网上的资料很多.
以上就是进程加速的分析,文章纯手打--YTS.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|QQ图标网

GMT+8, 2019-1-16 10:34 , Processed in 1.185600 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表