【发布时间】:2019-10-07 23:17:11
【问题描述】:
在问我的问题之前,我必须向您解释我的项目以及我的工作方式。我为游戏制作服务器。这个服务器需要大量的开发,80万行代码。
一个多月后。似乎有些玩家正在使用作弊来破坏玩家的乐趣。
我不得不承认,我很难弄清楚如何为自己辩护。服务器所有者社区受到太多攻击,每个人都在尽力保护自己。
我正在为这个项目使用 Lua、JSON、HTML 和 CSS,99% Lua。
游戏客户端可以控制什么:
客户端可以执行命令,但命令只允许管理员。除非注入他自己的文件做一个新的命令。并且可以在客户端游戏中注入代码(后面解释)。
服务器的作用:
我想,这是我们可以做点什么的地方。所有服务器都安装了大量的模组,所以所有客户端都在下载我所有的模组/客户端脚本来触发我的服务器事件。
发送命令的过程是什么:
- 客户端可以使用聊天/command [attribut][attribut2]
- 客户端可以运行客户端的控制台和:命令[attribut][attribut2]
作弊者是如何做到的?
- 1) 注入器隐藏在内存中,Windows 可执行文件。
- 2) 他们正在加载客户端文件以使客户端命令调用服务器触发器*。 (因为,是的,不幸的是每个人都使用相同的脚本,所以它是已知的触发器名称)
- *) 为此,他们打开客户端控制台并在其中写入:“exec c:/filename.lua”)
50% 的作弊脚本被 AHCI 和变量替换混淆,如下所示。
作弊是什么样子的? 我无法在此处发布完整代码>正文限制为 30000 个字符;你输入了 208906。混淆了没有缩进(1 法分)
-一个全局函数:
function IllIlllIllIlllIlllIlllIll(IllIlllIllIllIll) if (IllIlllIllIllIll==(((((919 + 636)-636)*3147)/3147)+919))end end)
-一个全局变量:
IllIIllIIllIII(IllIIIllIIIIllI(IlIlIlIlIlIlIlIlII,IIIIIIIIllllllllIIIIIIII))()
-一个全局变量:
Xxxxx5 = {}
-一个全局变量:
Xxxxx5.debug = true
-一个局部变量:
local logged = true
哪里需要你的帮助
我想检测不是注射。但是,我完全无法控制这一点。我想检测其中之一:(记住我可以注入我的客户端 lua / Json 脚本来做事)
- 当有人键入时:控制台中的 exec ?
- 当有人使用全局变量/函数时? (因为我得到了它们“Xxxxx5.debug = true”)
- 当有人试图检测或扫描我的触发器时?
- 我还没有想到?
- 检测函数是否存在?
我在客户端脚本中有全局和局部函数:
local function d(e) local f = {} local h = GetGameTimer() / 200 f.r = math.floor(math.sin(h * e + 0) * 127 + 128) f.g = math.floor(math.sin(h * e + 2) * 127 + 128) f.b = math.floor(math.sin(h * e + 4) * 127 + 128) return f end function Dt(text, x, y) ..stuff end
一个很好的信息是: 我成功地做好了保护,但这是非常基本的...... 大多数作弊都是使用相同的命令来打开的。我只是修补了快捷方式以访问它们。如果他们使用它们,客户会得到踢。 如果编码更好,也许这是一个解决方案?但是,如果玩家在聊天或控制台中,它就不再工作了,所以我不知道当玩家处于这种状态时它是如何工作的。 (键禁用)
我为什么要寻求帮助?
我可以保证我开发了所有脚本,重新编写了所有下载的脚本,找到了所有其他解决方案,无需任何帮助。我更喜欢学钓鱼而不是要鱼。但这一次尝试了很多不起作用的东西。
我尝试过的:这些条件中没有一个有效:
-- if (_G["Xxxxx.IsMenuOpened"] ~= nil) then
-- while true do
-- print = 'Xxxxx'
-- end
-- end
-- if Xxxxx ~= nil then
-- setfenv(Xxxxx , nil )
-- end
-- if rawget( _G, Xxxxx) ~= nil then -- "var" n'est pas déclaré
-- print 'Xxxxx DETECTER !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
-- end
-- if rawget( _G, Xxxx) ~= nil then -- "var" n'est pas déclaré
-- print 'Xxxxx DETECTER !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
-- end
-- if (_G["Xxxx.IsAnyMenuOpened"] ~= nil) then
-- while true do
-- print = 'Xxxxx'
-- end
-- print = 'xxxxx'
-- end
-- if source == '[Xxxx]' or source == 'Xxxxx' then
-- while true do
-- print = 'Xxxxx'
-- end
-- print = 'xxxxx'
-- end
-- if (_G["Xxxxx"] ~= nil) then
-- while true do
-- print = 'Xxxxx'
-- end
-- print = 'xxxxx'
-- end
-- if Xxxxx ~= nil or Lynx8.debug = true or Lynx8.debug = false then
-- reason2 = 'Xxxxx DETECTE'
-- TriggerServerEvent("Drop_player" , reason2 )
-- end
-- if Xxxxx.Display() ~= nil then
-- reason2 = 'Xxxxx DETECTE'
-- TriggerServerEvent("Drop_player" , reason2 )
-- end
【问题讨论】: