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

Musaigen

ihatemyself
Автор темы
Проверенный
1,706
1,590
RTD делал tcc, но там не хватает поддержки с plugin sdk.

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

Я думаю тогда и не надо будет ломать голову с гонкой потоков на луа.
Есть вариант еще лучше, где точно не надо ломать голову — это писать на С++

Обновление больше для меня самого, чем для юзеров, V1.1.0:
1. Функции, связанные с аллокацией/выгрузкой памяти, перенесены в отдельный модуль.
2. Для будущего удобства в разработке, написан класс Codecave, потому слегка изменен код генерации трамплина.
3. Изменение названия некоторых констант.
 
Последнее редактирование:

Musaigen

ihatemyself
Автор темы
Проверенный
1,706
1,590
V1.2.0:
1. Добавил сохранение регистров. (EAX, ECX, и так далее). Можно получить значение, что хранится в регистре, получить значение из стека, преобразовать регистр в определенный тип.
Lua:
-- Получение значения, что хранится в регистре.
hook:context():value("eax")

-- Получение параметра из стека.
-- 1 -> номер параметра
-- int -> С-тип параметра
hook:context():stack(1, "int")

-- Преобразование значения, что хранится в регистре, в тип.
local ped = hook:context():as("esi", "CPed*")
2. Улучшил аннотации у каллбеков хука
1743762123681.png

3. Все аннотации внутренних классов перемещены в пространство имён Hook.
4. Для улучшения производительности перенесена библиотека memory из MoonLoader V0.27
 

Орк

Известный
433
373
В чем может быть проблема? Крашит.
Lua:
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*, char)",
        sampGetBase() + 0x6FF40,
        function(hook, this, button)
        print(this, button)

        hook:call(this, button)
      end,
        true)
  end)

  wait(-1)
end
C++:
void CDialog::Close(char nProcessButton) {
    ((void(__thiscall*)(CDialog*, char))GetAddress(0x6FF40))(this, nProcessButton);
}
R3
Код из примера у меня работает
 
Последнее редактирование:

Musaigen

ihatemyself
Автор темы
Проверенный
1,706
1,590
В чем может быть проблема? Крашит.
Lua:
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*, char)",
        sampGetBase() + 0x6FF40,
        function(hook, this, button)
        print(this, button)

        hook:call(this, button)
      end,
        true)
  end)

  wait(-1)
end
C++:
void CDialog::Close(char nProcessButton) {
    ((void(__thiscall*)(CDialog*, char))GetAddress(0x6FF40))(this, nProcessButton);
}
R3
Код из примера у меня
С кем-то конфликтуешь. На чистом сампе всё ворк.
 

constersuonsis

Известный
256
159
В чем может быть проблема? Крашит.
Lua:
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*, char)",
        sampGetBase() + 0x6FF40,
        function(hook, this, button)
        print(this, button)

        hook:call(this, button)
      end,
        true)
  end)

  wait(-1)
end
C++:
void CDialog::Close(char nProcessButton) {
    ((void(__thiscall*)(CDialog*, char))GetAddress(0x6FF40))(this, nProcessButton);
}
R3
Код из примера у меня работает
попробуй так

lua:
hooks[hook_idx] = hook.new(
    "void(__fastcall*)(void* this, int edx, char button)",
    sampGetBase() + 0x6FF40,
    function(hook, this, edx, button)
        hook:call(this, edx, button)
    end,
    true
)
 
  • Bug
Реакции: Musaigen

Musaigen

ihatemyself
Автор темы
Проверенный
1,706
1,590
видимо с лаунчером аризоны потому что нигде больше не использую этот хук, но при этом через https://www.blast.hk/threads/55743/ всё работает
можешь через дебаггер посмотреть адрес след инструкции и на нее поставить хук, но тогда хук Аризоны будет иметь приоритет над твоим
 
  • Нравится
Реакции: Орк

Орк

Известный
433
373
можешь через дебаггер посмотреть адрес след инструкции и на нее поставить хук, но тогда хук Аризоны будет иметь приоритет над твоим
Сложно я обывателя, пока побуду на hooks 😅

попробуй так

lua:
hooks[hook_idx] = hook.new(
    "void(__fastcall*)(void* this, int edx, char button)",
    sampGetBase() + 0x6FF40,
    function(hook, this, edx, button)
        hook:call(this, edx, button)
    end,
    true
)
не прокатило