Исходник Гайд Lua jmp hook

Kolbasa241

Известный
213
57
MoonLoader не зависит от наличия установленного CLEO, не зависит от мультиплеерной модификации SA:MP и плагина SAMPFUNCS (зависят только скрипты, использующие те или иные возможности), а также он совместим с любой версией CLEO, SA:MP и SAMPFUNCS.

На R3 никакие библиотеки, зависимые от SF не работают, samp.lua является такой. Так что у тебя не R3, если у тебя работают другие хуки.

Код хотя бы прикрепил бы...
Прикреплю завтра, если дело в моей криворукости, буду очень рад, а то безнадёжность будет худший вариант
 

Double Tap Inside

Известный
Проверенный
1,898
1,252
Короче, этот способ как-то крашит гта.

Я юзал его в скрипте для реконекта Sweet Connect. Потом ботом ARZ Mr.Robot редактировал объявления в СМИ, тось появлялись диалоги, юзался sampShowDialog() и так далее. А через минут десять Sweet Connect перезагружался, хотя нет там такой функции, и через 10 секунд вылет гта. В консоль сампфункса успевало только написать, что команды уже заняты, которые юзал Sweet Connect, в логе муна ничего. Пришлось вернуться на SAMP.LUA для перехвата диалогов =(
( проверял 4 раза, и кто то давно мне тоже говорил об этом баге )
 

Вложения

  • 1.0.9 Sweet Connect.zip
    2 MB · Просмотры: 15
Последнее редактирование:

RTD

Нестандартное звание
Автор темы
Модератор
391
414
А через минут десять Sweet Connect перезагружался, хотя нет там такой функции, и через 10 секунд вылет гта. В консоль сампфункса успевало только написать, что команды уже заняты, которые юзал Sweet Connect
Это говорит о том, что у тебя вызвался еще раз main(). Выше писал тебе же, и о костыльных исправлениях. Фип к сожалению не ответил, а я так и не понял почему и как, и зачем вызывается main()
Пришлось вернуться на SAMP.LUA для перехвата диалогов =(
Ну в скрипте ты и так его используешь, в принципе не велика потеря
 
  • Ха-ха
Реакции: Double Tap Inside

FYP

Известный
Администратор
1,758
5,722
@FYP main() может вызваться рандомно и потом флудить вызовами? Я сомневаюсь что хук сдвигается и с вероятностью 100% попадает на main(), хотя в то же время без хука этой проблемы нет, странно
ни в коем случае.
неопределённое поведение, вызванное хуком, может приводить к любого вида последствиям, в том числе и таким. если это поведение наблюдается без использования таких хуков, значит есть баг.
 

_raz0r

t.me/sssecretway | ТГК: t.me/razor_code
Модератор
1,889
3,050
Хукает диалоги в SA:MP 0.3.7 R3
Lua:
local ffi = require "ffi"

-- by RTD
local hook = {hooks = {}}
addEventHandler('onScriptTerminate', function(scr)
    if scr == script.this then
        for i, hook in ipairs(hook.hooks) do
            if hook.status then
                hook.stop()
            end
        end
    end
end)
ffi.cdef [[
    int VirtualProtect(void* lpAddress, unsigned long dwSize, unsigned long flNewProtect, unsigned long* lpflOldProtect);
]]
function hook.new(cast, callback, hook_addr, size)
    local size = size or 5
    local new_hook = {}
    local detour_addr = tonumber(ffi.cast('intptr_t', ffi.cast('void*', ffi.cast(cast, callback))))
    local void_addr = ffi.cast('void*', hook_addr)
    local old_prot = ffi.new('unsigned long[1]')
    local org_bytes = ffi.new('uint8_t[?]', size)
    ffi.copy(org_bytes, void_addr, size)
    local hook_bytes = ffi.new('uint8_t[?]', size, 0x90)
    hook_bytes[0] = 0xE9
    ffi.cast('uint32_t*', hook_bytes + 1)[0] = detour_addr - hook_addr - 5
    new_hook.call = ffi.cast(cast, hook_addr)
    new_hook.status = false
    local function set_status(bool)
        new_hook.status = bool
        ffi.C.VirtualProtect(void_addr, size, 0x40, old_prot)
        ffi.copy(void_addr, bool and hook_bytes or org_bytes, size)
        ffi.C.VirtualProtect(void_addr, size, old_prot[0], old_prot)
    end
    new_hook.stop = function() set_status(false) end
    new_hook.start = function() set_status(true) end
    new_hook.start()
    table.insert(hook.hooks, new_hook)
    return setmetatable(new_hook, {
        __call = function(self, ...)
            self.stop()
            local res = self.call(...)
            self.start()
            return res
        end
    })
end

function main()
  hookDialogR3 = hook.new('void(__thiscall *)(void *this, int, int, const char *, const char *, const char *, const char *, bool)', hookDialogR3, getModuleHandle('samp.dll') + 0x6F8C0)
end

function hookDialogR3(this, id, style, caption, text, b1, b2, serverSide)
  hookDialogR3(this, id, style, ffi.cast("char*", "samp r3 hooked"), text, b1, b2, serverSide)
end
 
Последнее редактирование:
  • Нравится
Реакции: RTD

RTD

Нестандартное звание
Автор темы
Модератор
391
414
ffi.string("SA:MP R3 HOOKED"), ffi.string(text), ffi.string(b1), ffi.string(b2),
Это работает? Рили? Если да, то чудеса, но лучше так
Код:
ffi.cast("char*", "samp r3 hooked"), text, b1, b2
ffi.string используй уже для своих фунок, char* нужен сампу
 
  • Нравится
Реакции: _raz0r

_raz0r

t.me/sssecretway | ТГК: t.me/razor_code
Модератор
1,889
3,050
Еще немного хуков для SA:MP 0.3.7 R3 (все проверял, все они работают)
Lua:
     -- Params: this, id, style, caption, text, button1, button2, serverSide
    --hookDialogR3 = hook.new('void(__thiscall *)(void *this, int, int, const char *, const char *, const char *, const char *, bool)', hookDialogR3, getModuleHandle('samp.dll') + 0x6F8C0)
    -- Params: this, int vehicleId, bool passenger
    --hookEnterVehicleR3 = hook.new('void(__thiscall *)(void *this, int, bool)', hookEnterVehicleR3, getModuleHandle('samp.dll') + 0x58E0)
    -- Params: this
    --hookSpawnR3 = hook.new('void(__thiscall *)(void *this)', hookSpawnR3, getModuleHandle('samp.dll') + 0x3ED0)
    -- Params: this, const char *message
    --hookSendChatR3 = hook.new('void(__thiscall *)(void *this, const char *)', hookSendChatR3, getModuleHandle('samp.dll') + 0x5820)
     -- Params: this, int intId
    --hookInteriorChangeR3 = hook.new('void(__thiscall *)(void *this, int)', hookInteriorChangeR3, getModuleHandle('samp.dll') + 0x5780)
 
  • Нравится
Реакции: gedwadion

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
Еще немного хуков для SA:MP 0.3.7 R3 (все проверял, все они работают)
Lua:
     -- Params: this, id, style, caption, text, button1, button2, serverSide
    --hookDialogR3 = hook.new('void(__thiscall *)(void *this, int, int, const char *, const char *, const char *, const char *, bool)', hookDialogR3, getModuleHandle('samp.dll') + 0x6F8C0)
    -- Params: this, int vehicleId, bool passenger
    --hookEnterVehicleR3 = hook.new('void(__thiscall *)(void *this, int, bool)', hookEnterVehicleR3, getModuleHandle('samp.dll') + 0x58E0)
    -- Params: this
    --hookSpawnR3 = hook.new('void(__thiscall *)(void *this)', hookSpawnR3, getModuleHandle('samp.dll') + 0x3ED0)
    -- Params: this, const char *message
    --hookSendChatR3 = hook.new('void(__thiscall *)(void *this, const char *)', hookSendChatR3, getModuleHandle('samp.dll') + 0x5820)
     -- Params: this, int intId
    --hookInteriorChangeR3 = hook.new('void(__thiscall *)(void *this, int)', hookInteriorChangeR3, getModuleHandle('samp.dll') + 0x5780)
и вот тебе все функи с кастами

и да, давать одно название для функи/таблицы - плохая идея
 

RTD

Нестандартное звание
Автор темы
Модератор
391
414
Еще немного хуков для SA:MP 0.3.7 R3 (все проверял, все они работают)
Lua:
     -- Params: this, id, style, caption, text, button1, button2, serverSide
    --hookDialogR3 = hook.new('void(__thiscall *)(void *this, int, int, const char *, const char *, const char *, const char *, bool)', hookDialogR3, getModuleHandle('samp.dll') + 0x6F8C0)
    -- Params: this, int vehicleId, bool passenger
    --hookEnterVehicleR3 = hook.new('void(__thiscall *)(void *this, int, bool)', hookEnterVehicleR3, getModuleHandle('samp.dll') + 0x58E0)
    -- Params: this
    --hookSpawnR3 = hook.new('void(__thiscall *)(void *this)', hookSpawnR3, getModuleHandle('samp.dll') + 0x3ED0)
    -- Params: this, const char *message
    --hookSendChatR3 = hook.new('void(__thiscall *)(void *this, const char *)', hookSendChatR3, getModuleHandle('samp.dll') + 0x5820)
     -- Params: this, int intId
    --hookInteriorChangeR3 = hook.new('void(__thiscall *)(void *this, int)', hookInteriorChangeR3, getModuleHandle('samp.dll') + 0x5780)
Продолжай в том же духе, может дойдешь до хуков ракнета с битримом и адаптируешь samp.lua под r3
 

AnWu

Guardian of Order
Всефорумный модератор
4,687
5,167
смотрел сурсы хуков, заметил что хук ставят на 6 байт, последним идет 0xC3 -> return. Почему у тебя нет? Чисто спортивный интерес
 

RTD

Нестандартное звание
Автор темы
Модератор
391
414
смотрел сурсы хуков, заметил что хук ставят на 6 байт, последним идет 0xC3 -> return. Почему у тебя нет? Чисто спортивный интерес
А какой смысл, если до этой инструкции не доходит, после jmp никакой код не исполняется
Это как я понял делается для удобства, когда листают асемблер в чит энжин или дебагере каком-то, как писал SR_Team
чтобы в CE при отладке листинг asm не херился из-за не верных опкодов, которые никогда не вызываются
Возможно я не прав и тут есть какой-то тайный замысел
В принципе ты можешь добавить, но ничего не изменится, ниже строчка где нужно заменить 0x90(nop) на 0xC3(ret) и размер хука указывать 6 байт
Lua:
local hook_bytes = ffi.new('uint8_t[?]', size, 0x90)
 

AnWu

Guardian of Order
Всефорумный модератор
4,687
5,167
А какой смысл, если до этой инструкции не доходит, после jmp никакой код не исполняется
Это как я понял делается для удобства, когда листают асемблер в чит энжин или дебагере каком-то, как писал SR_Team

Возможно я не прав и тут есть какой-то тайный замысел
В принципе ты можешь добавить, но ничего не изменится, ниже строчка где нужно заменить 0x90(nop) на 0xC3(ret) и размер хука указывать 6 байт
Lua:
local hook_bytes = ffi.new('uint8_t[?]', size, 0x90)
я разобрался полностью с работой хука. Интерисовал ток этот вопрос. Чо и куда добавить шарю
 
  • Нравится
Реакции: RTD

RTD

Нестандартное звание
Автор темы
Модератор
391
414
Если интересует, то теперь в либе, вместе с хуком виртуальных таблиц... А еще там метод ракнета хукнут...
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,768
11,210
Возможно ли прочитать CVector?
0x99120
C++:
void CCamera::Set(CVector position, CVector rotation) {
    ((void(__thiscall*)(CCamera*, CVector, CVector))GetAddress(0x99120))(this, position, rotation);
}
 

RTD

Нестандартное звание
Автор темы
Модератор
391
414
Это структура, насколько я помню такой вид имеет
Lua:
ffi.cdef([[
typedef struct { float x, y, z; } CVector;
]])
Можешь ее даже не дефайнить, сделав прототип
Lua:
void(__thiscall*)(uintptr_t this, float x, float y, float z, float rx, float ry, float rz)
 
  • Нравится
Реакции: chapo