Гайд Работа с RakNet хуками

Receiver

🥩 Передай meat, всё в скип, я в темпе
Автор темы
Проверенный
597
818
Вечер в хату, часик в радость, чифир в сладость!
Здеся мы будем говорить от RakNek хуках. Hook в переводе с английского означает перехват.
Перехват (англ. hooking) — технология, позволяющая изменить стандартное поведение тех или иных компонентов информационной системы.
Вообщем с помощью хуком мы можем перехватить и модифицировать нужную нам информацию.
Эта информация может исходить как от игрока, так и от сервера.
Гайд рассчитан на людей имеющих хотя бы небольшой опыт работы с SF.

Приступим к регистрации нашего хука:
C++:
SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::ТИП_ХУКА, hook_function);
Данная функция регистрирует RakNet хук. Она принимает 2 аргумента: первый - тип хука, второй - функция в которой будет происходить его обработка
Вот все существующие типы RakNet хуков:
RAKHOOK_TYPE_INCOMING_PACKET – Перехватывает приходящие от сервера пакеты.
RAKHOOK_TYPE_INCOMING_RPC – Перехватывает приходящие от сервера RPC.
RAKHOOK_TYPE_OUTCOMING_PACKET – Перехватывает исходящие от игрока пакеты.
RAKHOOK_TYPE_OUTCOMING_RPC – Перехватывает исходящие от игрока RPC.
Регистрация должна происходить в mainloop после инициализации игры:
1585640829091.png


В данном случае я буду работать с приходящим от сервера RPC.
Создаём функцию обрабатывающую хук:
C++:
bool __stdcall hook_function(stRakNetHookParams * params) // Функция хука всегда принимает один параметр, это stRakNetHookParams
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage) // RPC_ScrClientMessage это ID RPC. Можно использовать ScriptRPCEnumeration либо сразу указать ID RPC.
    {
        // Каждый RPC имеет свой список параметров
        // В нашем случае RPC_ScrClientMessage имеет параметры: UINT32 dColor, UINT32 dMessageLength, char[] Message
        DWORD color; // UINT32 dColor // Цвет сообщения
        DWORD strlen; // UINT32 dMessageLength // Длина сообщения
        char string[144]; //  char[] Message // Текст сообщения

        params->bitStream->ResetReadPointer(); // Сбрасываем указатель чтения
        params->bitStream->Read(color); // Получаем цвет сообщения из битстрима
        params->bitStream->Read(strlen); // Получаем длину сообщения из битстрима
        params->bitStream->Read(string, strlen); // Получаем текст и указываем длину сообщения
        string[strlen] = '\0';

        // Ну и сверим наше сообщение с каким-нибудь текстом для примера
        if (!strcmp(string, "TestMessage_9812"))
        {
            // Если вернётся true, то отправим сообщение в чат
            SF->getSAMP()->getChat()->AddChatMessage(0xFFFFAAAA, "> Доброе утро, славяне.");
        }
    }
    return true;
}
Все RPC с их параметрами вы найдёте там: https://github.com/BrunoBM16/samp-packet-list/wiki/RPC-List
Компилируем, заходим в игру и проверяем:

1585642128848.png


Сообщение придёт быстрее, чем сам текст.
Потому что хук срабатывает до получения сообщения клиентом.

Вот полный код, который у нас получился:
1585642018786.png


Поправляйте меня в комментариях <3​
 

Вложения

  • 1585639989951.png
    1585639989951.png
    1.4 KB · Просмотры: 354
  • 1585640819578.png
    1585640819578.png
    5.4 KB · Просмотры: 362
  • 1585641758214.png
    1585641758214.png
    6.2 KB · Просмотры: 359

MISTER_GONWIK

Всефорумный гонщик
Всефорумный модератор
1,260
1,737

а это?
 
  • Нравится
Реакции: H0wDareY0u и ucciModd

Receiver

🥩 Передай meat, всё в скип, я в темпе
Автор темы
Проверенный
597
818

а это?
не приятная ситуация 😞
 

H0wDareY0u

Потрачен
6
6
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

loganhackerdff

Известный
868
517
что такое __stdcall и чем он от CALLBACK отличается?
и сделай урок, как хукать текст из 61rpc (showdialog
)
 

Dark_Knight

Me, me and me.
Друг
4,062
2,077
  • Нравится
Реакции: atizoff и loganhackerdff

loganhackerdff

Известный
868
517
Зайди в вижак, введи CALLBACK и нажми на нем F12.
i0tzpBT.png
__cdecl — после вызова функции параметры из стэка удаляет вызывающая сторона
__stdcall — после вызова функции параметры из стэка удаляет сама эта функция
__fastcall — похожа на __stdcall, но часть параметров пытается передать через регистры.
 
  • Нравится
Реакции: mzxer

Salik_Davince

Известный
37
3
Как примерно сделать такое - хукнуть RPC - RemoveObject, Создать массив с удаленными файлами, при подключении игрока проверять есть ли удаленный файл в массиве, если есть не синхронизировать RPC
 

Dark_Knight

Me, me and me.
Друг
4,062
2,077
Как примерно сделать такое - хукнуть RPC - RemoveObject, Создать массив с удаленными файлами, при подключении игрока проверять есть ли удаленный файл в массиве, если есть не синхронизировать RPC
@Salik_Davince Ну как хукнуть показано выше. Вместо массива юзай контейнер(vector, map, list, deque, что тебе угодно).
Потом после чтения делай поиски в контейнере(std::find или std::find_if). Если поиск вернул итератор на элемент следующий за последним(it == end()), то добавляй его в контейнер(методы push_back, insert, etc) и возвращай истину, а если уже вернул другое значение, то возвращай ложь.
чаво
что ты получить?
Только дурак не поймет ход его мыслей.
 

Kerlosad

Потрачен
24
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как хукнуть RPC SendChatMessage под номером 101?