Как обеспечить замену?

#lua

#lua

Вопрос:

Итак, мне нужно защитить свой код. Мой код запутан, и я использую load(tostring(resultServerr))() , но кто-то может выполнить load = print сверху, и он напечатает все из моего кода.. Я должен защитить его, чтобы избежать замены, но я не знаю как.

Комментарии:

1. Если вы не контролируете машину, которая выполняет код, вы не можете

2. Что мешает кому-то не только выполнять load = print , но и просто открывать файл кода, удалять слово load и добавлять слово print ?

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