- 1,648
- 1,457
Описание: hook - библиотека для создания хуков игрового кода для игры GTA:SA (MP). На данный момент библиотека в бете, так как я не успел всё протестировать, лишь самую базу.
Преимущества:
* Авто-определение размера хука.
* Прокидывание объекта хука в параметры коллбэка (полезно для модульных проектов, либо хуков кучи адресов на один коллбек)
* Трамплин, кодкейв(хз как этот пункт назвать) (то есть для вызова оригинала хук не снимает сам себя, вызывает оригинальную функцию, а потом ставится обратно, что убивает совместимость с другими хуками)
* Поддержка хука на хук. (Можно ставить свой хук на чужие хуки)
* Выгрузка в любых условиях. (Можно снять свой хук, когда на вас стоит чужой хук, и так далее)
* Поддержка call инструкций в рантайме. (Большинство jump/трамплин (и какие у них там могут быть названия) хукеров даже на С++ не могут хукать call инструкции, либо используют для этого отдельный класс)
* Аннотации класса через Lua Language Server, потому у вас будут подсказки при использовании.
* Авто-снятие хуков (это больше как факт, что такой функционал есть)
Пример использования:
Установка: зайти на GitHub (ставьте звезды, не жлобитесь), скачать архив, содержимое папки src извлечь в вашу папку moonloader/lib
Предостережение: хуки на Lua языке все равно не особо стабильны.
Credits:
* MinHook: за кодогенерацию трамплина
* Вячеслав Патков: за реализацию Hacker Disassembler Engine, что используется здесь как дизассемблер в файле hde.dll
Также: hook написан через moonly (бегом качать)
Автор: @Musaigen
Преимущества:
* Авто-определение размера хука.
* Прокидывание объекта хука в параметры коллбэка (полезно для модульных проектов, либо хуков кучи адресов на один коллбек)
* Трамплин, кодкейв
* Поддержка хука на хук. (Можно ставить свой хук на чужие хуки)
* Выгрузка в любых условиях. (Можно снять свой хук, когда на вас стоит чужой хук, и так далее)
* Поддержка 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
Предостережение: хуки на Lua языке все равно не особо стабильны.
Credits:
* MinHook: за кодогенерацию трамплина
* Вячеслав Патков: за реализацию Hacker Disassembler Engine, что используется здесь как дизассемблер в файле hde.dll
Также: hook написан через moonly (бегом качать)
Автор: @Musaigen
Последнее редактирование: