Lua - Как бы я подделал функцию GetFenv, не меняя ее? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть код, в котором я хотел бы найти уязвимость, я его кодировал, и я был бы признателен, если бы вы помогли мне найти в нем что-либо.

Моя единственная проблема в том, чтоgetfenv может быть каким-то образом подделан.

coroutine.wrap(function()
    while wait() do
        for i, v in func_table.pairs(func_table) do
            if func_table.getfenv()[i] ~= v then
                return ban_func(10, 23)
            end
        end
    end
end)()    

Для ясности, ban_func находится внутри func_table, это автоматически обнаружит изменение данных и соответственно заблокирует.Единственный способ, которым я думаю, что они, будучи эксплуататором / мошенником, смогут что-либо изменить, это подделать getfenv.

Если бы вы могли объяснить мне, как можно подделать такую ​​функцию и / или какя буду очень рад!

, чтобы исправить ложную информацию о функции, не изменяя своих данных.

1 Ответ

0 голосов
/ 24 января 2019

Я предполагаю, что этот код работает на компьютере эксплуататора / мошенников.По сути, нет способа гарантировать безопасность клиентского кода.Ваши чеки могут быть удалены, а ваши чеки могут быть удалены.Даже сам бинарный файл Lua можно изменить внутри, а getfenv можно изменить, чтобы он делал что-либо в дополнение к тому, что он делает.Реализация строгой границы между логикой сервера и клиента является единственным верным способом защиты приложений.

В этом случае возможна одна атака, если клиент запускает Lua-код в том же lua_State до установки func_table.В этом случае они могут оказаться в изолированной программной среде, как вам показала моя реализация в изолированной программной среде lua здесь .

Еще одна атака - использование метаметодов, чтобы func_table.getfenv()[i] ~= v вернул true.Это можно обнаружить с помощью rawequal, проверки типа func_table.getfenv()[i] или использования исходных функций в качестве ключей в таблице истинных значений и проверки, является ли таблица с ключом func_table.getfenv()[i] истинной.

Еще однаАтака будет редактировать как глобальное состояние, так и вашу таблицу.При изменении адреса функции обычно изменяют ВСЕ ссылки на этот адрес в ОЗУ, что включает внутреннюю ссылку в вашей таблице.

Поскольку вы используете wait() Я предполагаю, что вы работаетеэтот код в Roblox.В этом случае, как я подчеркивал на их форумах разработчиков, параметр experimental mode (ранее filtering enabled) - это единственный способ защитить вашу игру от эксплуататоров.Это мешает клиентам редактировать игру большую часть времени.Они по-прежнему имеют полный контроль над положением своего персонажа, пара других типов экземпляров (как, я полагаю, шляпы), могут попросить сервер внести изменения через экземпляры RemoteEvent и RemoteFunction и взломать стену (установить прозрачность стены) (чтобы противостоять этому, отправлять толькоклиентские части, которые он может видеть).

...