文章导读
大家好,我是陆砚码。今天我们来聊聊如何编写传奇封外挂(反外挂)系统,特别是封加速外挂的技巧。这篇文章会带你一步步了解加速外挂的工作原理,以及如何通过服务器端的时间校验来封堵这些外挂。
正文
首先,我们要知道游戏中的动作节奏和时间是如何控制的。通常,我们会使用GetTickCount函数或者QueryPerformanceFrequency、QueryPerformanceCounter等API函数来获取时间差,从而决定是否执行下一步操作。外挂程序就是通过hook这些API函数,让时间过得更快,达到提速的目的。
外挂提速主要分为注入式提速和非注入式全局提速。注入式提速是通过hook API函数实现的,而非注入式则是通过全局改变计算机时间tick值等方式实现的。
对于注入式加速外挂,我们可以通过API监测和内存监测来检测。但对于非注入式提速,我们则需要采用不同的策略。我们可以通过每秒向服务器提交GetTickCount、QueryPerformanceFrequency、QueryPerformanceCounter和GetSystemTime获取的值,让服务器端来进行判断。
DWORD dwTicks_GetTickCount = GetTickCount();
DWORD dwTicks_Freq;
DWORD dwTicks_time;
LARGE_INTEGER Freq;
LARGE_INTEGER time = { 0 };
QueryPerformanceFrequency(&Freq);
QueryPerformanceCounter(&time);
dwTicks_Freq = (double)time.QuadPart / ((double)Freq.QuadPart / (double)1000000) / (double)1000;
SYSTEMTIME systemTimes;
GetSystemTime(&systemTimes);
dwTicks_time = systemTimes.wHour * 3600 + systemTimes.wMinute * 60 + systemTimes.wSecond;
dwTicks_time *= 1000;
dwTicks_time += systemTimes.wMilliseconds;
//在服务器端每秒计算一次时间差
DWORD dwDiff1 = dwTicks_GetTickCount2 - dwTicks_GetTickCount1;
DWORD dwDiff2 = dwTicks_Freq2 - dwTicks_Freq1;
DWORD dwDiff3 = dwTicks_time2 - dwTicks_time1;
//这里注意 GetTickCount() 有溢出情况,过了0xfffffffff 后会进入下一个周期
//dwTicks_time 也有日期交接处的周期问题,请自行处理
具体的判断规则是 dwDiff1 <= 15 && dwDiff2 <= 15 && dwDiff3 <= 15 ,这是因为普通Windows系统通过API函数获取的时间精度一般是15ms。当然,这只是一个基本的规则,我们还需要考虑网络延迟、卡顿等问题。
此外,还有一些玩家会在虚拟机中运行程序,这时我们需要按照时间段清零,比如每10分钟变量清零重新开始计时。
小结与拓展
好了,今天我们就聊到这里。封外挂是一个复杂的过程,需要考虑很多因素。如果你对这方面有兴趣,欢迎加扣扣58085250与我交流。另外,如果你想要了解更多编程知识,可以关注「思享编程网」(www.sxgpb.com),那里有更多精彩内容等着你。
