Как запутать код lua?

Я не могу найти в Google ничего для какого-то инструмента, который шифрует / запутывает мои файлы lua, поэтому я решил спросить здесь. Может, какой-нибудь профессионал умеет это делать? (Бесплатно).

Я сделал простую игру на lua, и я не хочу, чтобы люди видели код, иначе они могут легко обмануть. Как я могу сделать весь текст внутри файла .lua просто случайными буквами и прочим?

Раньше я программировал на C #, и у меня был обфускатор .NET под названием SmartAssembly, который работает довольно хорошо. Когда кто-то пытался проверить код моих приложений, это была просто связка букв и цифр, китайских иероглифов и прочего.

Кто-нибудь знает любую программу, которая может сделать это и для lua? Просто загрузите файл, который нужно зашифровать, нажмите «Зашифровать» или что-нибудь еще, и бац! Оно работает!?

Например это:

print('Hello world!')

превратится во что-то вроде

sdf9sd@@@&/sdfsdd9fd0f0fsf/&

person Community    schedule 29.03.2014    source источник


Ответы (4)


Просто предварительно скомпилируйте свои файлы (фрагменты) и загрузите двоичные фрагменты. luacпозволяет удалять отладочную информацию. Если этого недостаточно, определите свои собственные преобразования в скомпилированном lua, по возможности удаляя имена. Хотя на обфускаторы lua не так много спроса ...

Кроме того, вы теряете одно из основных преимуществ использования встроенного языка сценариев: расширяемость.

person Deduplicator    schedule 29.03.2014

Самый простой вариант обфускации - скомпилировать ваш Lua-код, как предлагали другие, однако у него есть две основные проблемы: (1) строки все еще, вероятно, будут легко видны в вашем скомпилированном коде, и (2) скомпилированный код для интерпретатора Lua не переносимый, поэтому, если вы нацелены на разные архитектуры, вам нужно иметь для них разные скомпилированные фрагменты.

Первую проблему можно решить с помощью препроцессора, который (например) преобразует ваши строки в последовательность чисел, а затем объединяет их обратно во время выполнения.

Вторую проблему нелегко решить без изменения интерпретатора, но если у вас есть выбор интерпретаторов, то LuaJIT генерирует переносимый байт-код, который будет работать на всех его платформах (с одной и той же версией LuaJIT); обратите внимание, что байт-код LuaJIT отличается от байт-кода Lua, поэтому он не может быть запущен интерпретатором Lua.

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

person Paul Kulchenko    schedule 29.03.2014

Вы можете использовать loadstring для получения фрагмента, затем string.dump, а затем применить некоторые преобразования, такие как циклическое переключение байтов, замена сегментов и т. Д. Преобразования должны быть обратимыми. Затем сохраните в файл.

Обратите внимание, что любой, кто имеет доступ к вашему Lua-модулю "encryptor", знает, как расшифровать ваш файл. Если вы сделаете свой зашифрованный модуль на C / C ++, любой, у кого есть доступ к исходному тексту, тоже сделает это, или к двоичному файлу модуля шифрования Lua они также могут require модуль и отключить код. С интерпретируемым языком это сделать довольно сложно: вы можете немного поднять планку с помощью вышеупомянутых методов, но поднять ее, требуя значительного объема работы (единственное нарушение правил), очень сложно, AFAIK.

Если вы встраиваете интерпретатор Lua, чем вы можете сделать это из C, это значительно усложняет задачу (при условии, что сборка Release со всеми удаленными символами), человеку должно быть комфортно выполнять пошаговую сборку, но требуется только один способный человек, чтобы взломать алгоритм, то они могут сделать код доступным для других.

Йо все еще заинтересован в этом? :)

person Oliver    schedule 29.03.2014

Я подумал, что добавлю пример кода, поскольку ответы здесь были полезны, но не до конца. Мы хотели сохранить некоторую информацию из таблиц lua и просто не упростить кому-то внедрение собственного кода. сериализуйте вашу таблицу, а затем используйте load (str), чтобы превратить ее в загружаемый фрагмент lua, и сохраните с помощью string.dump. С параметром true отладочная информация удаляется, и ее действительно немного. Да, вы можете видеть строковые ключи, но это намного лучше, чем просто сохранять голую сериализованную таблицу lua.

function tftp.SaveToMSI( tbl, msiPath )
    assert(type(tbl) == "table")
    assert(type(msiPath) == "string")

    local localName = _GetFileNameFromPath( msiPath )
    local file,err = io.open(localName, "wb")
    assert(file, err)
    -- convert the table into a string
    local str = serializer.Serialize( tbl )

    -- create a lua chunk from the string.  this allows some amount of 
    -- obfuscation, because it looks like gobblygook in a text editor
    local chunk = string.dump(load(str), true)

    file:write(chunk)
    file:close()

    -- send from /usr to the MSI folder
    local sendResult = tftp.SendFile( localName, msiPath )
    -- remove from the /usr folder
    os.remove(localName)

    return sendResult
end

Вывод одной маленькой таблицы в Notepad ++ выглядит так:

LuaS У

Vx @ w (@ АKА└АJБ┴ JА @ & А & name Coulombmetervalue? С╘ ажў

person premes    schedule 20.01.2018