黑客小知识之为什么dt和不抬头不能一起开
我敢保证你的黑客软件不会让你这么干的,因为无论是Philip、polak还是sharklaser大家都这样写 if (config->tickbase.doubletap.isActive()) targetTickShift = 13; else if (config->tickbase.hideshots.isActive()) targetTickShift = 9; 那么,同时开=只开dt或反过来只开不抬头 现在是欣赏高雅言论时间




看到这里相信大多数有点知识储备的黑客都笑出来了 如果你不知道为什么,接下来我们进入正题,它是如何实现的 一切的一切要追溯回2017年的一次游戏更新,使得tickbase漏洞利用成为可能

因为每个客户端都有一个本地的独立tick计数器(m_nTickBase),它在客户端和服务器之间保持同步。服务器会让它尽量与服务器当前tick同步(执行同步的阈值由 sv_clockcorrection_msecs 控制,默认值为 30)。在服务器处理上传到的usercmd时,会将 tickbase 设置为全局变量中的当前 tickcount(以及tick对应的实际时间) 而下一次的开火时间也是基于tickbase计算的,因此我们可以利用这个漏洞取消两次开火间的间隔,这就是dt 为了做到本地tick与服务器tick的尽量同步,服务器会有一个叫做模拟tick的东西,每个模拟tick,服务器都会将传入的usercmd累加并检查它来确定是否应该调整 tickbase来将它们的差异控制在sv_clockcorrection_msecs定义的阈值范围内。详见起源引擎sdk中的代码 https://github.com/ValveSoftware/source-sdk-2013/blob/master/sp/src/game/server/player.cpp#L3208 https://github.com/ValveSoftware/source-sdk-2013/blob/master/sp/src/game/server/player.cpp#L3107 如果我们向服务器传递的数据包多于我们在特定tick中应该发送的数据包,服务器会在处理之前把tickbase给“shift”回原来的位置,因为这样能尽量让服务器在处理完这个tick之后本地tick与服务器tick就能够保持同步。即使服务器有时会忽略一些用户命令(用来防止加速挂等恶意漏洞),但无论如何这样都会让tickbase被更改。 https://github.com/ValveSoftware/source-sdk-2013/blob/master/mp/src/game/server/player_command.cpp#L334 所以为了实现tickbase漏洞利用,我们需要一种方法在一个tick中使更多的usercmd“有效”。在2017年的那一次更新之后,当服务器发现存在数据包丢失(“loss”)时,服务器会引入额外的“假”usercmd来处理(或引入客户端发送的额外的数据包)。正常情况下每个数据包限制为10 。此外,每个 CLC_Move 消息限制为 62 个usercmd,每个数据包限制为 1 个 CLC_Move 消息(起源引擎公开sdk里面是找不到的,但是我们通过转储然后逆向server.dll可以知道) 所以我们最多可以得到:62 个真实的 usercmd+ 10 个由服务器从假数据包生成的 = 每个数据包 72 个tick。如何绕过这个限制?只需要快速发送一大堆数据包让务器在同一个模拟tick中去处理这些数据包中的usercmd。 服务器将接受这些 usercmd 并将tickbase shift到正确位置,但它只会运行第一个命令,这会使得tickbase 远远落后实际tick。于是我们就实现了这个漏洞利用😋 我们先前说过,利用这个漏洞可以取消开火间隔,而我们只需要改变shift的tick数量,就可以通过让抬头的tick超前于tickbase实现不抬头了。 因此我们得知了,tickbase只能shift到一个位置,不能分身😅所以dt和不抬头只有一个能起作用 至于我们的老版fa玩家是哪里来的底气,我暂且蒙在鼓里


