Исходник Софт [1.1.0-beta] hook / Продвинутые хуки для MoonLoader

Musaigen

shitposter
Автор темы
Проверенный
1,648
1,457
Описание: hook - библиотека для создания хуков игрового кода для игры GTA:SA (MP). На данный момент библиотека в бете, так как я не успел всё протестировать, лишь самую базу.
Преимущества:
* Авто-определение размера хука.
* Прокидывание объекта хука в параметры коллбэка (полезно для модульных проектов, либо хуков кучи адресов на один коллбек)
* Трамплин, кодкейв (хз как этот пункт назвать) (то есть для вызова оригинала хук не снимает сам себя, вызывает оригинальную функцию, а потом ставится обратно, что убивает совместимость с другими хуками)
* Поддержка хука на хук. (Можно ставить свой хук на чужие хуки)
* Выгрузка в любых условиях. (Можно снять свой хук, когда на вас стоит чужой хук, и так далее)
* Поддержка call инструкций в рантайме. (Большинство jump/трамплин (и какие у них там могут быть названия) хукеров даже на С++ не могут хукать call инструкции, либо используют для этого отдельный класс)
* Аннотации класса через Lua Language Server, потому у вас будут подсказки при использовании.
* Авто-снятие хуков (это больше как факт, что такой функционал есть)
Пример использования:
Выгрузка кода из демо файла проекта:
local hook = require("hook")

local ffi = require("ffi")

-- -------------------------------------------------------------------------- --

---@type Hook[]
local hooks = {}

-- -------------------------------------------------------------------------- --

function main()
  if not isSampLoaded() then
    return
  end
  while not isSampAvailable() do
    wait(0)
  end

  sampRegisterChatCommand("hook.new", function()
    local hook_idx = #hooks + 1

    hooks[hook_idx] = hook.new("void(__thiscall*)(void*, int, const char*, const char*, unsigned long, unsigned long)",
      sampGetBase() + 0x64010, function(hook, chat, type, text, prefix, textColor, prefixColor)
        hook:call(chat, type, ("[%d]: %s"):format(hook_idx, ffi.string(text)), prefix, textColor, prefixColor)
      end, true)
  end)

  sampRegisterChatCommand("hook.disable", function(arg)
    arg = arg and (#arg > 0 and arg)

    if arg and tonumber(arg) then
      hooks[tonumber(arg)]:remove()
    end
  end)

  sampRegisterChatCommand("hook.enable", function(arg)
    arg = arg and (#arg > 0 and arg)

    if arg and tonumber(arg) then
      hooks[tonumber(arg)]:install()
    end
  end)

  wait(-1)
end
Установка: зайти на GitHub (ставьте звезды, не жлобитесь), скачать архив, содержимое папки src извлечь в вашу папку moonloader/lib
Предостережение:
хуки на Lua языке все равно не особо стабильны.
Credits:
* MinHook: за кодогенерацию трамплина
* Вячеслав Патков: за реализацию Hacker Disassembler Engine, что используется здесь как дизассемблер в файле hde.dll
Также: hook написан через moonly (бегом качать)
Автор: @Musaigen
 
Последнее редактирование:

Musaigen

shitposter
Автор темы
Проверенный
1,648
1,457
где обнова мемвраппер😡
😡😡
8e603c38fd2b30a2eb82fc3629397bef.jpg


Если я и его сяду писать, моя спина не выдержит, эту либу я вообще 6 часов подрял писал почти без остановок)
 
  • Нравится
Реакции: VanoKLR

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,814
2,692
вопрос с многопоточностью и в целом проблема с поломкой луастека, которая была еще в библиотеке @RTD не решена?
 

AdCKuY_DpO4uLa

Адский дрочер
Друг
327
684
Нету. Вам для трилогии?
Да

Хз что там по многопотоку. Опиши кодом что за проблема, я посмотрю.
Когда два разных потока бьются в один луа стейт, происходит гонка потоков, которая ломает луа стек. Соответственно, если мы хукаем два метода, которые работают в 2-х разных потоках, у нас вероятнее всего, так же будет все ломаться луа стек. Точно такая же проблема есть в TrilogyLoader, из-за чего мы пока что не можем реализовать адекватную работу mimgui, хотя библиотека уже собрана под DirectX11 x64 и протестирована на отдельном приложении
 

Musaigen

shitposter
Автор темы
Проверенный
1,648
1,457
Когда два разных потока бьются в один луа стейт, происходит гонка потоков, которая ломает луа стек. Соответственно, если мы хукаем два метода, которые работают в 2-х разных потоках, у нас вероятнее всего, так же будет все ломаться луа стек. Точно такая же проблема есть в TrilogyLoader, из-за чего мы пока что не можем реализовать адекватную работу mimgui, хотя библиотека уже собрана под DirectX11 x64 и протестирована на отдельном приложении
На луашном уровне это либо фиксится остановкой всех потоков в момент хука, либо никак. Короче, пока котёл не варит для ваших потоков
В муне нет возможности узнать айди своего луа потока и нет возможности останавливать чужие потоки, потому нужно реверсить мунлоадер аси, и не факт что там вообще что-то найдешь. Для реализации таких фич нужно знать, через какие функции реализованы потоки в луа, возможно там обычная база через потоки винды, которые можно проитерировать и застопить, но в любом случае нужно знать айди своего потока. Не факт, что вызвав GetCurrentThreadId ты получишь именно айди потока, в котором находишься (созданного через lua_thread я имею в виду).

Короче, призываем мистера @FYP
 
Последнее редактирование:

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,814
2,692
созданного через lua_thread я имею в виду
по идее это не относится особо к проблеме напрямую, ибо lua_thread это лишь враппер над луашными корутинами, которые вызываются в каком-то из игровых потоков внутри хука мунлоадера
 

Musaigen

shitposter
Автор темы
Проверенный
1,648
1,457
по идее это не относится особо к проблеме напрямую, ибо lua_thread это лишь враппер над луашными корутинами, которые вызываются в каком-то из игровых потоков внутри хука мунлоадера
В любом случае, нужен код который я могу воспроизвести и подтвердить наличие проблемы. Я сам очень редко что-то хукал (почти никогда) на луа, но таких проблем у меня естественно не было. Какие у вас ситуации были я не в курсах, потому не знаю что нужно, чтобы эту проблему воспроизвести, и какие условия для этого нужны.
 

AdCKuY_DpO4uLa

Адский дрочер
Друг
327
684
На луашном уровне это либо фиксится остановкой всех потоков в момент хука, либо никак. Короче, пока котёл не варит для ваших потоков
В муне нет возможности узнать айди своего луа потока и нет возможности останавливать чужие потоки, потому нужно реверсить мунлоадер аси, и не факт что там вообще что-то найдешь. Для реализации таких фич нужно знать, через какие функции реализованы потоки в луа, возможно там обычная база через потоки винды, которые можно проитерировать и застопить, но в любом случае нужно знать айди своего потока. Не факт, что вызвав GetCurrentThreadId ты получишь именно айди потока, в котором находишься (созданного через lua_thread я имею в виду).

Короче, призываем мистера @FYP
lua_thread никоим образом не относится к системным потокам и выполняется это все дело в одном единственном системном потоке, соответственно, при попытке узнать текущий ид потока через WinApi, он всегда будет выдавать одинаковый ид потока, будь это луа или аси, который прохукал гейм луп
 
  • Нравится
Реакции: Musaigen

Gorskin

🖕
Проверенный
1,347
1,196
RTD делал tcc, но там не хватает поддержки с plugin sdk.

Вообще круто было бы писать код c++ в луа, затем с помощью библиотеки компилировать и запускать. Как это сделано в tcc от RTD.

Я думаю тогда и не надо будет ломать голову с гонкой потоков на луа.