先从原理上说明下
一类是通过HOOK计算机时间有关函数做到的...恩,我们先拿变速齿轮来说明
变速齿轮的工作原理是,拦截createprocessW/A监控指定进程创建,当创建初始就注入自己功能DLL,用来拦截settimer
getmessagetime,gettickconut,gettheadlocale
具体函数说明不写了,会的不要查,不会的说了也看不明白
就是这个gettheadlocale不明白勾他干什么.......反正不是重点,不说了
把问题就是出来了哦~~现在怎么检测呢?
这些API齿轮使用的INLINE HOOK和SEH HOOK...这2个HOOK一个要改写程序调用的系统DLL一个要改积存器...都操作了进程内的数据,尤其INLINE HOOK...特别容易被检测....所以很多游戏都可以可以反变速齿轮
当然大多数用的不是HOOK检测,应该很多正常软件也会HOOK,
还有个方法就是利用驱动程序直接进入RONG0层,调用低层计算机计时频率函数(具体函数名 -保密,不好意思),再把一定时间差结果和RING3的函数得出的差对比,检测机器速度是否正常...
那么知道了原理就很简单了...
我们可以制作一个在驱动层的HOOK程序修改如kEUSERSETTIMER函数参数,达到加速的目的,而目前却没有几个反加速程序会检测它之类的函数的HOOK,以及自身HOOK的
貌似街球加速不行啊。...不知道他怎么检测计算机正确频率的~~KeUpdateSystemTime,KEQUERYSYSTEMTIME,KESETTIMEEX.我都HOOK了啊~~~~怎么还被检测~~~~~~~~5555
就差改_KUSER_SHARED_DATA了...(直接改也改不了,时时更新的...曰)
贴一个HS我觉得是反加速的代码
TimeFields= TIME_FIELDS ptr -24h
var_14= dword ptr -14h
Time= LARGE_INTEGER ptr -10h
push ebp
mov ebp, esp
sub esp, 28h
lea eax, [ebp+Time]
push eax ; CurrentTime
call dword ptr ds:KeQuerySystemTime :---获得当前计算机时间[原点时间开始(就是几百年前的时间)]
lea ecx, [ebp+TimeFields] :---设置TimeFields
push ecx ; TimeFields
lea edx, [ebp+Time]
push edx ; Time
call ds:RtlTimeToTimeFields :---将获得的当前时间转化成分:秒形式
movsx eax, [ebp+TimeFields.Minute]
imul eax, 3Ch :---把分再算成秒
movsx ecx, [ebp+TimeFields.Second] :---把本来的秒数读到积存器
add eax, ecx :---把分变的秒和本来的秒加起来得到一个当前计算机时间(秒为单位)
mov [ebp+var_14], eax
mov eax, [ebp+var_14] :---把这个最后时间设置为返回值.
mov esp, ebp
pop ebp
retn
其返回值是秒为单位的
最后在小说下为什么我怀疑这个是反加速函数~~
因为KEQUERYSYSTEMTIME函数返回的是计算机时间,单位是纳秒.
但是如果HS是单纯的为了获得电脑时间的话,为什么没有把返回的时间先转化成本地时间(直接获得返回值不是我们用的东8的区时哦),再有为什么还要把获得的时间转化成秒为单位的整数呢?