В этой статье я попытаюсь объяснить, как работают энк тулы, а также напишем собственный
Табуляция
Прежде чем писать код, советую вам соблюдать табуляцию, чтобы код выглядел красиво(как минимум). Табуляция — способ структуризации кода, где отдельные блоки кода выделяются отступами. Пример ниже
Неправильно:
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() -- закрываем
Готово. Полный код тут
Пишите, лайкайте, буду рад