Как восстановить/вызвать исходную функцию после ее переопределения?

Я использую 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, после чего эти скрипты имеют доступ друг к другу.

person user70960    schedule 19.05.2019    source источник


Ответы (1)


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

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


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

person Nicol Bolas    schedule 19.05.2019
comment
значит, мы не можем защитить наши скрипты от внешнего вмешательства без пересборки lua51.dll? буквально любой может взломать ваши скомпилированные скрипты, потому что функция load может загрузить скомпилированный скрипт (байт-код), независимо от того, скомпилирован ли он на lua или luajit. это довольно легко на самом деле - person user70960; 20.05.2019
comment
@ user70960: Вы уверены в этом? Я написал тестовый скрипт, который пытается взять два предварительно скомпилированных фрагмента и поместить их оба в load, при этом выполняется только первый фрагмент. Я даже сшил две предварительно скомпилированные строки вместе и засунул их в loadstring, и он все равно выполнил только первую. Теперь я использую базовую версию Lua 5.1, а не LuaJIT, так что может быть разница. Но это было бы странным поведением LuaJIT. - person Nicol Bolas; 20.05.2019
comment
@user70960: Вот мой тестовый скрипт, если хотите попробовать сами. - person Nicol Bolas; 20.05.2019
comment
@ user70960: Эти сценарии не объединены и не имеют доступа друг к другу. Это просто один сценарий, выполняемый перед другим, без какой-либо попытки песочницы. Ваш вопрос предполагает, что load сама была переопределена, и поэтому вы потеряли контроль над своей песочницей. Но вы этого не сделали. Показанный вами пример даже не пытается использовать песочницу для этих сценариев. Итак, у вас есть контроль над кодом, который компилирует/выполняет эти скрипты, или нет? - person Nicol Bolas; 20.05.2019
comment
ты не правильно понял. Я сделаю видео, чтобы вы могли видеть, что я имею в виду и как это работает. - person user70960; 20.05.2019
comment
@user70960: Хорошо, прежде чем делать видео, показывающее простые вещи, помните: я знаю Lua. Я знаю, что такое глобалы и как они работают. Я знаю, что происходит, когда вы выполняете функцию, которая устанавливает глобальные переменные, а затем функцию, которая использует глобальные переменные. Поэтому, если все, что вы собираетесь показать в этом видео, это то, как выполняется этот пример кода, это пустая трата времени. Я знаю, как работает этот код, и знаю, как он показывает вашу проблему. Я говорю, что ваш вопрос указывает на совсем другую проблему, которая представляет собой нечто большее, чем просто базовая песочница. - person Nicol Bolas; 20.05.2019
comment
Я думаю, что проблема заключается в запутывании, но... Ну да, очевидно, что как только вы распространяете во враждебной среде (отсюда необходимость запутывания), вы рискуете изменить свой исходный код. Решение состоит в том, чтобы не иметь критического кода во враждебной системе. - person dualed; 20.05.2019
comment
youtu.be/h0_rnFBnev4 - возможно, вы правы в том, что я не могу изменить скомпилированный фрагмент (на самом деле я могу , но это не про Lua), но я все еще могу манипулировать встроенными и глобальными функциями. Я пытался читать о песочнице, но ничего не помогло. - person user70960; 21.05.2019
comment
@ user70960: Теперь, когда проблема локализована, вам нужно объяснить, какие инструменты у вас есть. То есть какой у вас код в этом сценарии? Является ли код, загружающий и выполняющий скрипты, вашим кодом или он принадлежит кому-то другому? Можно ли изменить этот код, чтобы обеспечить надлежащую песочницу для работы с потенциально вредоносными сценариями? - person Nicol Bolas; 21.05.2019
comment
@NicolBolas, поскольку я пытаюсь защитить свои скрипты, «мой script.luac» будет моим (но сначала его нужно запутать), а остальное будет принадлежать хакеру, пытающемуся взломать мой скрипт. О каком коде ты говоришь? Столяр мой, он просто превращает скрипт в таблицу и потом загружает. - person user70960; 21.05.2019
comment
@NicolBolas, даже если мы попытаемся защитить одни функции с помощью других, они тоже могут быть перехвачены - youtu.be/ahhZtu-4e5w я думаю, что возможность переопределить любую функцию является огромным нарушением безопасности в Lua, и мы ничего не можем сделать, по крайней мере, без пересборки lua51.dll (возможно?). - person user70960; 21.05.2019
comment
@user70960: Во-первых, перестаньте публиковать видео на Youtube; сжатие слишком велико, чтобы что-то увидеть, и даже если бы это было не так, я не могу ничего копировать/вставлять. Во-вторых, если у вас нет контроля над программой, которая фактически загружает и выполняет ваши сценарии, то у вас нет контроля ни над чем. Вы не можете использовать песочницу Lua из песочницы, которую пытаетесь построить. Ваши сценарии зависят от среды, которая их загружает и выполняет. Всегда. - person Nicol Bolas; 21.05.2019
comment
@NicolBolas хорошо, я понял, спасибо. Что касается качества видео, то оно 1080p. - person user70960; 21.05.2019