#lua
#lua
Вопрос:
Итак, мне нужно защитить свой код. Мой код запутан, и я использую load(tostring(resultServerr))()
, но кто-то может выполнить load = print сверху, и он напечатает все из моего кода.. Я должен защитить его, чтобы избежать замены, но я не знаю как.
Комментарии:
1. Если вы не контролируете машину, которая выполняет код, вы не можете
2. Что мешает кому-то не только выполнять
load = print
, но и просто открывать файл кода, удалять словоload
и добавлять слово3. Они не могут открыть его и отредактировать, потому что он запутан, поэтому единственный способ — добавить load = print в верхний код.
Ответ №1:
Если вы используете Lua 5.2 или выше, вы можете предоставить свою собственную изолированную таблицу _ENV в 4-м аргументе load
. Если вы используете Lua 5.1 или 5.0, вы можете использовать setfenv
, который работает почти так же, как new _ENV .
local func, err = load(unsafecode, nil, nil, {})
if not func then print(err) return end
func()
или
local func, err = load(unsafecode)
if not func then print(err) return end
setfenv(func, {})
func()
Здесь я использую пустую таблицу {}
для защиты от использования всех глобальных переменных, добавления новых и перезаписи существующих. Если вы хотите предоставить некоторые функции, просто добавьте их в эту таблицу, они не будут удалены из _G, если они изменят его внутри изолированного кода.
Ответ №2:
Это зависит от того, как и где вы используете среду lua и что обычному пользователю разрешено делать с lua?
Если только вы управляете процессом запуска сервера или программы, а пользователь не имеет доступа к процессу запуска, можно выполнить песочницу в состоянии инициализации, как предложено Spar, или что-то вроде:
init.lua:
function prepare()
local load = _G.load
_G.load_extension = function()
local obfuscated = get_extension()
load(obfuscated)
end
end
Оригинал load
хранится как локальная переменная и не может быть перезаписан load_extension
в следующих сценариях / функциях lua.
Если обычный пользователь может изменять сценарии инициализации или загружать внешние библиотеки (.dll / .so), вам не повезло должным образом защитить свой код.
Если у пользователя есть доступ к resultServerr
содержимому, вам не повезло скрыть его, поскольку эта переменная может быть передана любому другому процессу / функции, а не только print
or load
.
Ответ №3:
Перезаписать print = nil
, тогда он не сможет печатать.
Вы можете создать свою собственную скрытую функцию печати, если вам все еще нужна эта возможность; просто запомните, как вы ее назвали, чтобы получить к ней доступ позже.
hidden_print = print
print = nil
print('this')
stdin: 1: попытка вызвать нулевое значение (глобальная ‘печать’)
трассировка стека:
stdin:1: в основном блоке
[C]: в?
hidden_print('that')
это
Комментарии:
1. Спасибо, но все же, если кто-то сделает сверху code load = print, он все равно получит код. Это работает, только если кто-то печатает ниже
print = nil