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

RTD

Потужно
Автор темы
Модератор
399
470
Других примеров не нашёл, похоже это только на нажатие отправки
Хотя мне оно и нужно
размер 6 байт либо врезайся в начало а не после seh пролога
1725139099252.png
 
  • Нравится
Реакции: Орк

Орк

Известный
193
123
Последнее редактирование:
  • Грустно
Реакции: Lance_Sterling

Орк

Известный
193
123
Возможно не по теме, но как узнать указатель на педа, который воспроизвел анимацию
C++:
CTaskSimpleRunNamedAnim::CTaskSimpleRunNamedAnim(const char* pAnimName, const char* pAnimGroupName, int flags, float fBlendDelta,
    int nTime, bool bDontInterrupt, bool bRunInSequence, bool bOffsetPed, bool bHoldLastFrame) 
    : CTaskSimpleAnim(plugin::dummy) , m_timer(plugin::dummy)
{
    plugin::CallMethod<0x61A990, CTaskSimpleRunNamedAnim*, const char*, const char*, int, float, int, bool, bool, bool, bool>
        (this, pAnimName, pAnimGroupName, flags, fBlendDelta, nTime, bDontInterrupt, bRunInSequence, bOffsetPed, bHoldLastFrame);
}
Lua:
function CTaskSimpleRunNamedAnim(this, pAnimName, pAnimGroupName, flags, fBlendDelta, nTime, bDontInterrupt, bRunInSequence, bOffsetPed, bHoldLastFrame)

    return CTaskSimpleRunNamedAnim(this, pAnimName, pAnimGroupName, flags, fBlendDelta, nTime, bDontInterrupt, bRunInSequence, bOffsetPed, bHoldLastFrame)
end

CTaskSimpleRunNamedAnim = hook.jmp.new("void (__thiscall*)(uintptr_t, const char*, const char*, int, float, int, bool, bool, bool, bool)", CTaskSimpleRunNamedAnim, 0x61A990)
 

Hatiko

Известный
Проверенный
1,493
617
Доброго дня. Возникла необходимость перехватывать более первым чем клиент RakSAMP отправку RPC пакетов. По сути тоже самое взял из данного ответа из этой темы, изменив только адрес RakClient на раксамповский - 0x4F5EB4. По факту работает, ловит пакет и могу его прочесть, но после перехвата крашится клиент. Аналогичная проблема и с примером из топика - перехвата пакетов, пакет приходит, могу прочесть, но после крашит, либо намертво зависало окно. Исходя из некоторых ответов, также пробовал шаманить с jit.off, но тоже самое.
Какие могут быть здесь проблемы? (Код аналогичный из топикап, адрес RakClient = 0x4F5EB4, клиент из тг Rei, в теме старый)
 

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,776
2,595
Доброго дня. Возникла необходимость перехватывать более первым чем клиент RakSAMP отправку RPC пакетов. По сути тоже самое взял из данного ответа из этой темы, изменив только адрес RakClient на раксамповский - 0x4F5EB4. По факту работает, ловит пакет и могу его прочесть, но после перехвата крашится клиент. Аналогичная проблема и с примером из топика - перехвата пакетов, пакет приходит, могу прочесть, но после крашит, либо намертво зависало окно. Исходя из некоторых ответов, также пробовал шаманить с jit.off, но тоже самое.
Какие могут быть здесь проблемы? (Код аналогичный из топикап, адрес RakClient = 0x4F5EB4)
покажи пример хука, ты вызываешь оригинальную функцию, правильно составил прототип?
 

Hatiko

Известный
Проверенный
1,493
617
покажи пример хука
Хук пакетов
Hooks:
local ffi = require("ffi")
local bitstream = require("SFlua.bitstream")
local hook = require('hooks')

--

function onLoad()
    pRakClient = ffi.cast("intptr_t*", 0x4F5EB4)[0]
    if pRakClient == nil then
        return print("[Connect] Cannot get RakClient pointer.")
    end
    rakClient = hook.vmt.new(pRakClient)

    sendPacket = rakClient.hookMethod("bool(__thiscall*)(void* this, SFL_BitStream* bitStream, char priority, char reliability, char orderingChannel)", sendPacket, 6)
    jit.off(sendPacket, true)
end

function sendPacket(this, bitStream, priority, reliability, orderingChannel)
    print("packet id", bitStream.data[0])
    local res = sendPacket(this, bitStream, priority, reliability, orderingChannel)
    return res
end

Если что, в самой библиотеке выгрузку адаптировал, по сути заменил событие на onUnload и убрал thisScript
 
Последнее редактирование:

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,776
2,595
Хукнул метода ракпира и заработало
Lua:
local ffi = require("ffi")
local hooks = require("hooks")


ffi.cdef [[
    typedef unsigned char BYTE;
    typedef struct SBitStream SBitStream;

    #pragma pack(push, 1)
    struct SBitStream {
        int      numberOfBitsUsed;
        int      numberOfBitsAllocated;
        int      readOffset;
        BYTE *data;
        bool  copyData;
        BYTE  stackData[256];
    };
    #pragma pack(pop)
]]


local originalRakPeerSend


function onLoad()
    originalRakPeerSend= hooks.jmp.new(
        "bool(__thiscall*)(void *this, SBitStream* bitStream, int priority, int reliability, char orderingChannel, unsigned int binaryAddress, unsigned short port, bool broadcast)",
        hookedRakPeerSend, 0x406ED0)
end

function hookedRakPeerSend(rakPeer, bs, ...)
    print("packet id", bs.data[0])
    return originalRakPeerSend(rakPeer, bs, ...)
end
 

Вложения

  • hooks.lua
    6.9 KB · Просмотры: 0
  • Нравится
Реакции: Hatiko

Hatiko

Известный
Проверенный
1,493
617
Хукнул метода ракпира и заработало
Да, спасибо. этот вариант работает.
Для отправки RPC (onSendRPC) прототип такой же будет с добавлением id или другой и по другому адресу? Сейчас попробовал такой вариант, не прокатило:
bool(__thiscall*)(void *this, int*, SBitStream* bitStream, int priority, int reliability, char orderingChannel, unsigned int binaryAddress, unsigned short port, bool broadcast)

UPD: Понял, 20 пакет - RPC
 
  • Нравится
Реакции: whyega52

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,776
2,595
Для отправки RPC (onSendRPC) прототип такой же будет с добавлением id или другой и по другому адресу?
я бы тоже хукал ракпир, примеры есть в мой старой либе (хоть и костыльные). Адрес самой виртуальной таблицы ракпира на новом раксампе: 0x4BA81C
1730984244095.png
 
  • Нравится
Реакции: Hatiko