Как восстановить / вызвать оригинальную функцию после ее переопределения? - PullRequest
1 голос
/ 19 мая 2019

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

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

local __load = load
load = function(data, ...)
    -- some stuff, e.g. you can unpack the data var to a file
    return __load(data, ...)
end

И если кто-то присоединяет мой скрипт к своему (например, выше), он может буквально перехватить любую встроенную и глобальную функцию в моем скрипте, а также получить доступ к глобальным переменным и функциям, которые я определил сам (вот почему Я всегда определяю все функции и переменные как локальные).

Итак, вопрос в том, как я могу вызывать их исходные функции или, по крайней мере, восстанавливать их в исходные куски. Если это возможно, оф.


Возможные ответы, которые не помогут:

  • _G['function_name'] содержит адрес новой функции.
  • Проверка функций с помощью pcall(string.dump, function_name) - это хорошо, но ее также можно подключить.

Если вы не можете что-то понять, я сказал:

  • Под «соединением скриптов» я подразумеваю объединение их друг с другом с помощью load или loadstring, после чего эти скрипты имеют доступ друг к другу.

1 Ответ

1 голос
/ 19 мая 2019

Lua-песочница основана на предположении, что скомпилированный кусок - это ваш скомпилированный кусок. Если у кого-то есть возможность подключиться к процессу загрузки Lua-сценария и добавить произвольные элементы к вашим Lua-сценариям до того, как компилятор их увидит, то вы не сможете их изолировать. Это ваша точка сбоя в процессе безопасности, поэтому вы должны защищаться. Что требует инструментов далеко за пределами самого Lua.

Обратите внимание, что, если вы загружаете предварительно скомпилированный блок , пользователь (ограниченный только обычным Lua-скриптом) не может добавить материал в конец этого блока. По крайней мере, не в обычном Lua 5.1; Загрузчик LuaJIT может быть другим. Конечно, если они поменяли местами функцию load, то они также могли бы редактировать сам байт-код, поэтому, если они продвинулись так далеко, вам все равно не повезло.


Особенность песочницы Lua в том, что это невозможно сделать из скрипта. Независимо от среды, в которой представлен ваш скрипт (глобальные и т. Д.), Это среда Это управляется кодом, который загружает и выполняет ваш скрипт. Если он явно не делает ничего, чтобы изолировать глобальные изменения, сделанные одним сценарием от другого, то ваш сценарий ничего не может с этим поделать.

...