Исходник Lua Debugger

Azller Lollison

я узбек
Автор темы
Друг
1,343
2,271
прив

Я заметил что развелось слишком много маминых луа крякеров, и решил переписать немного свой старенький разьебыватель протекторов, крипторов, пакеров, привязок две тысячи

Если раньше он работал так:
  • Сейвятся жизненно-важные отладчику функции в orig_funcname = funcname и потом funcname просто проксируется (_G[funcname] = function() --[[some code]] end)
  • Вырезается debug таблица для скрипта-цели путем подмены функций в регистре, сохраняется для использования отладчиком
  • Загружается скрипт-цель для отладки путем require
  • Костылями и прочим дерьмом добиваемся результата (дампим функи, достаем строки, скрипт из-под протектора и так далее)
То сейчас же я переписал алгоритм работы.
  • Имеется файл LRCFuncs который хранит в себе список функций для проксирования (на самом деле мне не нравится такое решение, его надо бы переделать) и возвращает их в таблице
  • Загружается скрипт-цель путем loadstring, проверяется успешность загрузки
  • При помощи setfenv скрипту-цели ставится таблица _G заданная отладчиком (состоит из функций LCRFuncs и замененной debug таблицы)
  • Устанавливается метатаблица скрипту-цели, где пока-что есть только обработка __call, __newindex и __index (надо доделать, я вьебал костыль в виде local thisFunc = debug.getinfo(1, "f").func)
  • Скрипт запускается и в рантайме обрабатываются ошибки типа попытки вызвать неопределенные функции
  • Для случаев объявлений новых функций в _G у отладчика есть утилита dumper которая автоматически дампит все новые функции в папочку dumps
  • После загрузки скрипта и подготовки его "внутренностей" отладчик ищет точку входа MoonLoader`а (глобальная функция main) и вызывает ее
  • Выход



Но это даже не половина от всего задуманного функционала.
Сейчас там хуево в плане кода, а именно как я сказал уже выше - надо рефакторить LRCFuncs, а так-же надо сделать обработчики на все типы метаметодов. На данный момент там стоит затычка в виде debug.getinfo(1, "f").func


Зачем я опубликовал это?

Во-первых дабы отладчик не умер как множество моих проектов. Я создал публичный репозиторий на гитхабе​
Во-вторых я заметил что на бластхаке давно не было интересных тем, пора бы уже что-то самому дропнуть сюда​
В-третьих я заметил что многих стала интересовать тематика кряков луа​

Что можно сделать в отладчике?
  • Инжект луа-кода прямо во время выполнения скрипта
  • Патчер
  • Возможность конфигурировать при запуске функции отладчика
  • Какая-нибудь хуевина которая будет автоматически взламывать очередное говно с привязкой а еще декомпилить до исходника и находить фото члена автора скрипта
  • Хз что еще можно придумать

Видео: (на нём можно заметить как отладчик обходит какой-то протектор, а так-же запечатлена работа утилиты dumper и прочих систем)


Ссылка на гитхаб: жопа (я не так давно пользуюсь гитхабом, строго не судить если чет не так)

пока
 

imring

Ride the Lightning
Всефорумный модератор
2,362
2,534
Lua:
-- fix it pls (https://github.com/Lollison/LuaDebug/blob/master/LRCFuncs.lua)
ну как-то так (не чекал)
Lua:
local l = {}

local function register_function(name, callback)
    local tab = {}
    setmetatable(tab, {
        __index = function(self, i)
            local res = rawget(self, i)
            if res == nil then
                rawset(self, i, register_function(name .. '.' .. i))
                res = rawget(self, i)
            end
            return res
        end,
        __call = function(self, ...)
            print('hooked ' .. name .. '(' .. table.concat({...}, ', ') .. ')')
            return callback(...)
        end
    })

    return tab
end

setmetatable(l, { __index = function(self, i)
    local res = rawget(self, i)
    if res == nil then
        rawset(self, i, register_function(i, function()
            return true
        end))
        res = rawget(self, i)
    end
    return res
end })

-- чтобы не обходили метаметоды через rawget
l.rawget = function(t, i)
    if t == l then return t[i] end
    return rawget(t, i) -- во избежения stack overflow в других метатаблицах
end

-- чтобы не убрал таблицу с метаметодами
l.setmetatable = function(t, mt)
    if t == l then return end
    return setmetatable(t, mt)
end

l.getmetatable = function(t, mt)
    if t == l then return end
    return getmetatable(t, mt)
end

return l
 

Azller Lollison

я узбек
Автор темы
Друг
1,343
2,271
Lua:
-- fix it pls (https://github.com/Lollison/LuaDebug/blob/master/LRCFuncs.lua)
ну как-то так (не чекал)
Lua:
local l = {}

local function register_function(name)
    local tab = {}
    setmetatable(tab, {
        __index = function(self, i)
            local res = rawget(self, i)
            if res == nil then
                rawset(self, i, register_function(name .. '.' .. i))
                res = rawget(self, i)
            end
            return res
        end,
        __call = function(self, ...)
            print('hooked ' .. name .. '(' .. table.concat({...}, ', ') .. ')')
        end
    })

    tab.getmetatable = function(t, mt)
        if t == l then return end
        return getmetatable(t, mt)
    end

    tab.setmetatable = function(t, mt)
        if t == l then return end
        return setmetatable(t, mt)
    end

    return tab
end

setmetatable(l, { __index = function(self, i)
    local res = rawget(self, i)
    if res == nil then
        rawset(self, i, register_function(i))
        res = rawget(self, i)
    end
    return res
end })

-- чтобы не обходили метаметоды через rawget
l.rawget = function(t, i)
    if t == l then return t[i] end
    return rawget(t, i) -- во избежения stack overflow в других метатаблицах
end

-- чтобы не убрал таблицу с метаметодами
l.setmetatable = function(t, mt)
    if t == l then return end
    return setmetatable(t, mt)
end

l.getmetatable = function(t, mt)
    if t == l then return end
    return getmetatable(t, mt)
end

return l
Оформи pull request на гите, добавлю твои изменения