Исходник Гайд Lua vmt+jmp/call hook | Библиотека hooks.lua

why ega

РП игрок
Модератор
2,536
2,215
Пишу либу для ракнет хуков, но все упирается в баг с вызовом мейна. Есть какие-нибудь способы это решить (подойдут уже даже костыли, главное, чтобы в скрипте, в который подключаешь либу ракнет хуков, которая в свою очередь юзает либу хуков, было все нормально)?
 

kin4stat

mq-team
Всефорумный модератор
2,730
4,707
Пишу либу для ракнет хуков, но все упирается в баг с вызовом мейна. Есть какие-нибудь способы это решить (подойдут уже даже костыли, главное, чтобы в скрипте, в который подключаешь либу ракнет хуков, которая в свою очередь юзает либу хуков, было все нормально)?
Бля вы тему вообще читать умеете? буквально пару постов назад писали решение блять

 
  • Нравится
Реакции: why ega

why ega

РП игрок
Модератор
2,536
2,215
Бля вы тему вообще читать умеете? буквально пару постов назад писали решение блять

Чет невнимательно прочитал ответ Фипа, почему-то подумал, что надо оффать компиляцию у каллбека, а не у хука.

Еще раз перечитав, понял, что изначально я думал судя по всемя верно и окончательно запутался. Компиляцию каллбеков надо отключать для всех видов хуков? Даже если это и так, то мейн в любом случае вызывается
Lua:
local function CTimer__Update()           
    -- ...
    if (pSAMPInfo == 0) then return originalCTimer__Update() end 
    -- ...
    rakClient = hooks.vmt.new(raknet.pRakClient[0])
    raknet.originalOutgoingPacket = rakClient.hookMethod(
        "bool(__thiscall*)(void*, uintptr_t, char, char, char)",
        handleOutgoingPacket, 6
    )     
    raknet.originalOutgoingRpc = rakClient.hookMethod(
        "bool(__thiscall*)(void*, int*, uintptr_t, char, char, char, bool)",
        handleOutgoingRpc, 25
    )                 
    raknet.originalIncomingRpc = hooks.jmp.new(       
        "void(__fastcall*)(void*, void*, unsigned char*, int, int)",       
        handleIncomingRpc, getOffsetFromBase("handleRpcPacket", samp)
    )

    jit.off(handleOutgoingPacket, true) 
    jit.off(handleOutgoingRpc, true)
    jit.off(handleIncomingRpc, true)

    originalCTimer__Update.stop()         
    return originalCTimer__Update.call()           
end


originalCTimer__Update = hooks.jmp.new(       
    "void(__cdecl*)()",       
    CTimer__Update, getOffsetFromBase("CTimerUpdate")
)

jit.off(CTimer__Update, true)


function handleOutgoingPacket(this, bitStream, priority, reliability, orderingChannel)             
    -- ...
end

function handleOutgoingRpc(this, id, bitStream, priority, reliability, orderingChannel, shiftTimestamp)
    
end

function handleIncomingRpc(this, void, data, length, playerId)
        
end
 
Последнее редактирование:

why ega

РП игрок
Модератор
2,536
2,215
Опять не по теме, но хз куда можно еще написать, помимо задравчивания всем лс.


Пытаюсь прохукать входящие пакеты, по примеру с собейта, но как итог, пакеты не приходят после работы функции-обработчика
Lua:
local function handleIncomingPacket(this, void)       
    local packet = raknet.originalIncomingPacket(this)             
    while (packet ~= nil) do       
        if (packet.data == nil) or (packet.length == 0) then break end             
        utils:callVirtualMethod(raknet.pRakClient[0], "void(__thiscall*)(void*, Packet*)", 9, this, packet) -- DeallocatePacket
        packet = raknet.originalIncomingPacket(this)       
    end         
    return packet -- судя по всему что-то опять недомудрил с ffi
end

--
raknet.originalIncomingPacket = rakClient.hookMethod(
        "Packet*(__thiscall*)(void*, void)",
        handleIncomingPacket, 8
    )
Lua:
ffi.cdef([[   
    typedef unsigned short PlayerIndex;

    typedef struct {           
        int binaryAddress;       
        unsigned short port;                   
    } PlayerID;

    typedef struct {                   
        PlayerIndex playerIndex;       
        PlayerID playerId; 

        unsigned int length;       
        unsigned int bitSize;
              
        unsigned char* data;       
        bool deleteData;             
    } Packet;   
]])
Lua:
function utils:callVirtualMethod(vt, prototype, method, ...) 
    local cast = ffi.cast                       
    local virtualTable = cast("intptr_t**", vt)[0]       
    return cast(prototype, virtualTable[method])(...)
end
 

samperkrytoi228

Новичок
19
2
братан, а если у меня первый скрипт выводит сообщение в чат "Route ended" через команду sampAddChatMessage("Route ended"). То как мне сделать код,чтобы при выводе "Route ended" в чат мой второй скрипт нажимал на пробел
 

why ega

РП игрок
Модератор
2,536
2,215
братан, а если у меня первый скрипт выводит сообщение в чат "Route ended" через команду sampAddChatMessage("Route ended"). То как мне сделать код,чтобы при выводе "Route ended" в чат мой второй скрипт нажимал на пробел
Lua:
local ffi = require("ffi")
local hooks = require("hooks")


local originalCChat_AddEntry
local samp = getModuleHandle("samp.dll")

local offsets = {
    CChat_AddEntry = {
        ["DLR1"] = 0x67650,
        ["R1"] = 0x64010,
        ["R2"] = 0x640E0,
        ["R3"] = 0x67460,
        ["R4"] = 0x67BA0,
        ["R5"] = 0x67BE0
    }
}


function CChat_AddEntry(this, nType, szText, szPrefix, textColor, prefixColor)
    if (nType == 8) then
        local text = ffi.string(szText)
        if (text == "Route ended") then
            print("ХУК СООБЩЕНИЯ, ЕЕЕЕ", text)
        end
    end   
    return originalCChat_AddEntry(this, nType, szText, szPrefix, textColor, prefixColor)
end


originalCChat_AddEntry = hooks.jmp.new(
    "unsigned int(__thiscall*)(void *this, int nType, const char *szText, const char *szPrefix, unsigned int textColor, unsigned int prefixColor)",
    CChat_AddEntry, (samp + offsets.CChat_AddEntry["R1"]) -- тут указывается версия SAMP
)
 
  • Нравится
Реакции: ARMOR и Z3roKwq