Как стать автором
Обновить

Простой энкрипт тул для скриптов Game Guardian

Уровень сложностиСредний

В этой статье я попытаюсь объяснить, как работают энк тулы, а также напишем собственный

Табуляция

Прежде чем писать код, советую вам соблюдать табуляцию, чтобы код выглядел красиво(как минимум). Табуляция — способ структуризации кода, где отдельные блоки кода выделяются отступами. Пример ниже

Неправильно:

if (condition) then
print("True")
MyFunc()
else
print("False")
end

Правильно:

if (condition) then
    print("True")
    MyFunc()
else
    print("False")
end

Что такое энк тул?

Энк тул(encryption tool, инструмент шифрования) - инструмент, который шифрует скрипты, блокируя доступ к исходному коду, защищая его от шкиЛЬников. Для простоты будем называть его просто «энк»

Как работают энк тулы?

Берется исходный код скрипта, шифруются все стринги(не трусы, а строки(strings)), название функций, ставятся блокеры, весь новый код конвертируется в бинарный код и записывается в файл

Для чего нужны блокеры?

Блокеры пригодятся в будущем от дэка(decryption, расшифровка). Если блокеров не будет, то наш скрипт расшифруют и получат доступ к исходному коду

Что такое энкодер и дэкодер?

Энкодер - то, как мы будем называть нашу функцию, которая шифрует стринги

Дэкодер - то, как мы будем называть нашу функцию, которая расшифровывает зашифрованные стринги(для чего это нужно будет написано ниже)

Писать, писать, писать

Давайте начнем писать код

Выбор файла для шифровки:

local enter = gg.prompt({"Select file:"}, {"/sdcard/"}, {"file"})
if enter ~= nil then
    path = enter[1] -- путь к файлу, который выбрал юзер
    file = io.open(path, "r") -- открываем файл
    data = file:read("*all") -- читаем содержимое в data
    file:close() -- закрываем файл
end

Блокеры:

Мне немного лень искать блокеры, поэтому напишем самый простой спам блоками для SSTool. Для этого достаночно просто спамить этим кодом:

while (nil) do end

Сам код спамера:

block = ""
for i = 0, 100 do
    block = block .. "while(nil)do end;while(nil)do end;while(nil)do end;"
end -- 100 раз спамим этим блокером

Напишем самый простой энкодер(XOR):

function encodeXOR(str)
    result = {}
    key = math.random(100, 999) -- рандомный ключ для дэкрипта этого стринга
    str:gsub(".", function(x) table.insert(result, x:byte() ~ key) end) -- тут не особо важно, сам процесс
    return "Decode(" .. key .. ", {" .. table.concat(result, ", ") .. "})" -- ниже объяснение
end

Зачем мы возвращаем какой-то Decode? В общем, это для того, чтобы строку нельзя было прочитать глазами, но чтобы скрипт мог понять что там написано, давайте проверим:

print(encodeXOR("Мир"))

Вывело нам Decode(395, {347, 279, 347, 307, 346, 267}), где 395 - ключ, а второе массив

Теперь нам нужна функция Decode, для того, чтобы скрипт понимал, что там зашифровано

function Decode(key, str)
    result  = ""
    for i =  1, #str do
        result  =  result .. string.char(str[i] ~ key) -- тут тоже не особо важно, это сам процесс
    end
    return  result
end

Проверим дэкодер:

print(Decode(395, {347, 279, 347, 307, 346, 267}))

Возвращает нам Мир. Работает

Теперь нам нужно сделать замену всех стрингов на зашифрованную их версию:

data = data:gsub([["(.-)"]], encodeXOR)
data = data:gsub([['(.-)']], encodeXOR)

Готово. Вот доказательство:

Добавляем дэкодер и блокеры в скрипт:

data = [[
(function()

]] .. block .. [[

function Decode(key, str)
    result  = ""
    for i =  1, #str do
        result  =  result .. string.char(str[i] ~ key) -- тут тоже не особо важно, это сам процесс
    end
    return  result
end

]] .. data .. [[

end)()
]]

Запись зашифрованного скрипта в файл

file = io.open(path .. "enc.lua", "w") -- открываем файл
data = string.dump(load(data), true, false) -- функцию в бинарную вариацию
file:write(data) -- записывем
file:close() -- закрываем

Готово. Полный код тут

Пишите, лайкайте, буду рад

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.