Неактуально Софт LuaJIT Script Injector

Статус
В этой теме нельзя размещать новые ответы.

The Spark

Известный
Автор темы
653
670

LuaJIT Script Injector

Вставка одного скомпилированного скрипта в другой. Не путать со склейкой.
Код 1 скрипта:
Lua:
function foo()
    print(1)
end

Код 2 скрипта:
Lua:
function foo2()
    print(2)
end

Выхлоп после декомпиляции: (первым был выбран 1 скрипт)
Lua:
function foo()
    print(1)
end

function foo2()
    print(2)
end

Суть:​

Мы получаем уровень доступности, будто у нас есть исходник и мы можем делать всё, что хотим в начале кода или в конце.
(Доступ к локальным/глобальным переменным, установка новых значений, обход защит на проксирование (только если скрипт не чекает себя на хекс сумму, лол))​

Использование:​

Первым (First file) выбираем скомпилированный скрипт, в который мы хотим вставить второй.
Вторым (Second file) выбираем *второй* скомпилированный скрипт.
В зависимости от порядка файлов, можно инжектить в начало и в конец.
Проект в бете, буду рад вашим краш логам с файлами сюда под хайд​

Примеры:​

Получить все локальные переменные скрипта, в глобальной области:
Second file
Lua:
local i = 1
while true do
    local name, value = debug.getlocal(1, i)
    if not name then break end
    print('stack: ' .. i, 'name: ' .. tostring(name), 'value: ' .. tostring(value))
    i = i + 1
end

Получить все глобальные переменные (хук):
First file
Lua:
setmetatable(_G, {
    __newindex = function (self, index, value)
        rawset(self, index, value)
        print('name: ' .. tostring(name), 'value: ' .. tostring(value))
    end
})

Супер простой кряк 1:
Скрипт с привязкой: First file
Lua:
function getHWD()
    return 'random hwd'
end

local access = getHWD() == 'acces hwd'

function main()
    if access then
        print('access is allowed')
    else
        print('access denied')
    end
end

Наш скрипт: Second file
Lua:
debug.setlocal(1, 1, true)
Так мы присвоем локальной переменной access значение true

Супер простой кряк 2:
Наш скрипт: First file
Lua:
setmetatable(_G, {
    __newindex = function (self, index, value)
        if index == 'getHWD' then
            value = function () return 'acces hwd' end
        end
        rawset(self, index, value)
    end
})

Скрипт с привязкой: Second file
Lua:
function getHWD()
    return 'random hwd'
end

local access = getHWD() == 'acces hwd'

function main()
    if access then
        print('access is allowed')
    else
        print('access denied')
    end
end

Пример изменения upvalue: (я не придумал демонстрацию с привязкой)
First file
Lua:
local urlOne = 'localhost:80'

function main()
    local response = sendRequest(urlOne)
    print(response) -- возвращает localhost:80
end

function sendRequest(url)
    return urlOne
end

Наш скрипт: Second file
Lua:
debug.setupvalue(sendRequest, 1, 'value')
-- теперь вернет value, а не 'localhost:80'
 

kjor32

¯\_(ツ)_/¯
Всефорумный модератор
1,683
1,386
Какой лимит по весу файла?
 

The Spark

Известный
Автор темы
653
670
Подниму, добавлю примеры с реальными примерами и сделаю мини гайд.

Пример 1:

Часто видел что arzTools (любой вариации) хотят использовать на бонусниках, но сталкиваются с проблемой проверки на сервер.
Создадим файл с таким кодом, назовем его hook.lua:
Lua:
function sampGetCurrentServerAddress()
    return '80.66.82.168', 7777
end
Cкомпилировав его через luaJIT, кинув на compile.bat файл, получим файл hook.luac.
И выбрав файлы так:
1680379840812.png

(admin.luac это сам arzTools)
Мы заставим скрипт думать что играем на сервере ARZ PAGE.

Пример 2:

Давайте запретим luac файлу доступ в интернет.
hook.lua:

Lua:
-- подменяем функции socket и lanes.
-- copas, request, всё под одну гребенку
local _require = require
require = function(lib)
    if lib == 'socket.core' then
        return {
            dns = {
                getaddrinfo = function()
                    return nil, "err"
                end
            },
            connect = function()
            end,
            tcp = function()
                return nil, "err"
            end,
            tcp6 = function()
                return nil, "err"
            end,
            newtry = function()
                return function()
                end
            end,
            protect = function()
                return function()
                    return "res", 500, "headers", "status"
                end
            end,
        }
    elseif lib == 'lanes.core' then
        return {
            configure = function()
                return {
                    with_timers = false,
                }
            end,
            lane_new = function()
                return {
                    status = 'killed'
                }
            end,
            max_prio = 1,
            version = 1,
            timer_gateway = 1,
            cancel_error = "?"
        }
    -- effil создаёт отдельный, независимый поток для скрипта
    elseif lib == 'effil' then
        return {
            thread = function()
                return function()
                    return {
                        status = function()
                            return 'canceled', 'err'
                        end
                    }
                end
            end
        }
    end
    return _require(lib)
end

-- подменяем функцию downloadUrlToFile
downloadUrlToFile = function (url, file, statusCallback)
    return 0
end

-- обычно тут стиллер
loadDynamicLibrary = function()
    return false, 0
end

-- ещё можно подменять ffi.load

Конечно, этот способ не претендует на анти-стиллер, ведь способов обойти это больше чем 100.
Это скорей просто патч для скрипта, который использует обычные запросы.

Пример 3:

Вынесен в отдельную тему
 
Последнее редактирование:
  • Нравится
Реакции: kjor32
Статус
В этой теме нельзя размещать новые ответы.