 |
|

31.03.2020, 12:15
|
|
Постоянный
Регистрация: 26.03.2016
Сообщений: 660
С нами:
5332594
Репутация:
163
|
|
[CENTER] Вечер в хату, часик в радость, чифир в сладость!
Здеся мы будем говорить от 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 после инициализации игры:
В данном случае я буду работать с приходящим от сервера 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-pa.../wiki/RPC-List
Компилируем, заходим в игру и проверяем:
Сообщение придёт быстрее, чем сам текст.
Потому что хук срабатывает до получения сообщения клиентом.
Вот полный код, который у нас получился:
Поправляйте меня в комментариях
|
|
|

31.03.2020, 12:24
|
|
Познавший АНТИЧАТ
Регистрация: 09.03.2013
Сообщений: 1,262
С нами:
6935116
Репутация:
183
|
|
Гайд - API SF | Урок 4 - RakNet
Введение RakNet — это сетевой движок, используемый в SA:MP для обмена данными между игроками и сервером. Клиент отправляет пакет серверу, сервер его обрабатывает и рассылает другим игрокам — таким образом это работает. В этом уроке я покажу, как отправлять свои пакеты и заносить в них данные...
blast.hk
а это?
|
|
|

31.03.2020, 12:36
|
|
Постоянный
Регистрация: 26.03.2016
Сообщений: 660
С нами:
5332594
Репутация:
163
|
|
Сообщение от MISTER_GONWIK
Гайд - API SF | Урок 4 - RakNet
Введение RakNet — это сетевой движок, используемый в SA:MP для обмена данными между игроками и сервером. Клиент отправляет пакет серверу, сервер его обрабатывает и рассылает другим игрокам — таким образом это работает. В этом уроке я покажу, как отправлять свои пакеты и заносить в них данные...
blast.hk
а это?
не приятная ситуация 😞
|
|
|

31.03.2020, 13:57
|
|
Новичок
Регистрация: 11.06.2014
Сообщений: 6
С нами:
6274747
Репутация:
53
|
|
Сообщение от RECEIVER
не приятная ситуация 😞
Ситуация может стать приятной если добавишь больше примеров по работе с другими пакетами и по сложнее.
|
|
|

01.04.2020, 13:29
|
|
Постоянный
Регистрация: 24.07.2017
Сообщений: 867
С нами:
4633764
Репутация:
148
|
|
что такое __stdcall и чем он от CALLBACK отличается?
и сделай урок, как хукать текст из 61rpc (showdialog
)
|
|
|

01.04.2020, 16:15
|
|
Постоянный
Регистрация: 16.11.2017
Сообщений: 957
С нами:
4469369
Репутация:
163
|
|
Сообщение от loganhackerdff
что такое __stdcall и чем он от CALLBACK отличается?
очищает после себя стэк
|
|
|

05.04.2020, 13:10
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
Сообщение от Shamanije
очищает после себя стэк
Сообщение от loganhackerdff
что такое __stdcall и чем он от CALLBACK отличается?
и сделай урок, как хукать текст из 61rpc (showdialog
)
а это что по вашему тогда?)
C++:
Код:
#define CALLBACK __stdcall
|
|
|

05.04.2020, 13:35
|
|
Постоянный
Регистрация: 24.07.2017
Сообщений: 867
С нами:
4633764
Репутация:
148
|
|
Сообщение от Dark_Knight
а это что по вашему тогда?)
C++:
Код:
#define CALLBACK __stdcall
Это фейк 🤔
|
|
|

05.04.2020, 13:47
|
|
Постоянный
Регистрация: 24.07.2017
Сообщений: 867
С нами:
4633764
Репутация:
148
|
|
Сообщение от Mozze.cpp
Зайди в вижак, введи CALLBACK и нажми на нем F12.

__cdecl — после вызова функции параметры из стэка удаляет вызывающая сторона
__stdcall — после вызова функции параметры из стэка удаляет сама эта функция
__fastcall — похожа на __stdcall, но часть параметров пытается передать через регистры.
|
|
|

05.04.2020, 22:01
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
Спасибо за копипаст вики)
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|