PDA

Просмотр полной версии : RakHook 1.0-beta


imring
14.11.2020, 13:50
RakHook - библиотека, которая добавляет события RakNet'a (входящие/исходящие пакеты и RPC), эмуляцию и отправку пакетов и RPC.

Есть одновременная поддержка версий 0.3.7-R1, 0.3.7-R3-1, 0.3.7-R4 и 0.3DL-R1.

Функции​

C++:






std
::
uintptr_t rakhook
::
samp_addr
(
std
::
uintptr_t offset
=
0
)
;
// получить адрес samp.dll со смещением
samp_ver rakhook
::
samp_version
(
)
;
// получить версию SA:MP, поддерживаемую RakHook.
bool
rakhook
::
initialize
(
)
;
// инициализировать RakHook.
void
rakhook
::
destroy
(
)
;
// завершение работы библиотеки.
bool
rakhook
::
send
(
RakNet
::
BitStream
*
bs
,
PacketPriority priority
,
PacketReliability reliability
,
char
ord_channel
)
;
// отправка пакета.
bool
rakhook
::
send_rpc
(
int
id
,
RakNet
::
BitStream
*
bs
,
PacketPriority priority
,
PacketReliability reliability
,
char
ord_channel
,
bool
sh_timestamp
)
;
// отправка RPC.
bool
rakhook
::
emul_rpc
(
unsigned
char
id
,
RakNet
::
BitStream
&
rpc_bs
)
;
// эмуляция RPC.
bool
rakhook
::
emul_packet
(
RakNet
::
BitStream
&
pbs
)
;
// эмуляция пакета.




События​

C++:






// исходящий RPC.
rakhook
::
on_send_rpc
+=
[
]
(
int
&
id
,
RakNet
::
BitStream
*
&
bs
,
PacketPriority
&
priority
,
PacketReliability
&
reliability
,
char
&
ord_channel
,
bool
&
sh_timestamp
)
->
bool
{
return
true
;
}
;
// исходящий пакет.
rakhook
::
on_send_packet
+=
[
]
(
RakNet
::
BitStream
*
&
bs
,
PacketPriority
&
priority
,
PacketReliability
&
reliability
,
char
&
ord_channel
)
->
bool
{
return
true
;
}
;
// входящий RPC.
rakhook
::
on_receive_rpc
+=
[
]
(
unsigned
char
&
id
,
RakNet
::
BitStream
*
&&
bs
)
->
bool
{
return
true
;
}
;
// входящий пакет.
rakhook
::
on_receive_packet
+=
[
]
(
Packet
*
&
p
)
->
bool
{
return
true
;
}
;




Пример: https://github.com/imring/RakHook/tree/master/example

Ссылка на библиотеку: https://github.com/imring/RakHook

taichi
14.11.2020, 14:37
А будет когда-то поддержка 03DL?

kin4stat
14.11.2020, 14:39
А будет когда-то поддержка 03DL?


Версия официально похоронена калкором

imring
14.11.2020, 14:39
А будет когда-то поддержка 03DL?


если дашь .dll - то мб добавлю

taichi
14.11.2020, 14:40
Версия официально похоронена калкором



И что? На ней есть сервера ведь.



если дашь .dll - то мб добавлю



Спасибо, мне очень нужно отловить входящие RPC с сервера именно на 03DL.

imring
14.11.2020, 14:45
Спасибо, мне очень нужно отловить входящие RPC с сервера именно на 03DL.


и еще скинь какой-то сервер, чтобы протетил

taichi
14.11.2020, 14:51
и еще скинь какой-то сервер, чтобы протетил



46.174.49.47:7856

nick: imring

pass: 123456

Только так могу, так как серверов на ДЛ довольно мало и найти открытый не представляется возможным.

kin4stat
14.11.2020, 15:14
найти открытый не представляется возможным.



MovieServer Reloaded (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cucmVsb2FkZWRzZXJ2ZXIuY29tLw)

SA-MP's #1 MovieServer experience! We aim to provide you with the freedom and tools for any of your movie-making needs!

www.reloadedserver.com

imring
14.11.2020, 15:34
46.174.49.47:7856
nick: imring
pass: 123456

Только так могу, так как серверов на ДЛ довольно мало и найти открытый не представляется возможным.


запустил локал сервер

https://forum.antichat.xyz/attachments/27605068/

imring
14.11.2020, 16:24
мини обнова:

- добавлена поддержка версии 0.3dl-r1




https://forum.antichat.xyz/attachments/27605118/

SR_team
14.11.2020, 23:29
Поменять версию можно в rakhook.cpp:31.


А в чем проблема детектить версию сампа в рантайме?

imring
14.11.2020, 23:40
А в чем проблема детектить версию сампа в рантайме?


надо сделать, но это позже

kin4stat
15.11.2020, 03:21
За хуки ракпира лайк однозначно.

Кстати я по исходнику так и не понял. В хандлере рпц получается идет перебор хуков, если он есть, то return false?

imring
15.11.2020, 11:04
если он есть, то return false?



RakHook/rakhook.cpp at master · imring/RakHook (https://github.com/imring/RakHook/blob/master/RakHook/rakhook.cpp#L98)

Contribute to imring/RakHook development by creating an account on GitHub.

github.com


если хоть одно событие вернёт false, то пропускается вызов оригинальной RakPeer::HandleRPCPacket

imring
15.11.2020, 17:17
0.2-beta:

- исправлена проблема с утечкой памяти в RakClientInterface::Receive (сообщил @#Northn (https://www.blast.hk/members/146943/));

- добавлена одновременная поддержка доступных версий SA-MP (предложили @#Northn (https://www.blast.hk/members/146943/) и @SR_team (https://www.blast.hk/members/11231/)).

Angr
15.11.2020, 20:46
Возможен пример в проект? а то скок пытался - ругается пкд

imring
15.11.2020, 21:14
Возможен пример в проект? а то скок пытался - ругается пкд

imring
02.09.2022, 14:41
Обновил RakHook: https://github.com/imring/RakHook/releases/tag/1.0

Сделал свой код немного читабельней (для себя), добавил поддержку CMake и теперь используются хуки от @r4nx (https://www.blast.hk/members/54454/) (cyanide (https://github.com/r4nx/cyanide))

SR_team
02.09.2022, 14:52
Обновил RakHook: https://github.com/imring/RakHook/releases/tag/1.0
Сделал свой код немного читабельней (для себя), добавил поддержку CMake и теперь используются хуки от @r4nx (https://www.blast.hk/members/54454/) (cyanide (https://github.com/r4nx/cyanide))


тебе не нужны хуки - глянь как плагины на сервер делают. Клиент тоже такое поддерживает

imring
02.09.2022, 14:56
тебе не нужны хуки - глянь как плагины на сервер делают. Клиент тоже такое поддерживает


ты про

RakClientInterface::RegisterAsRemoteProcedureCall

? в принципе можно, но я не помню, почему их не хотел использовать

Dark_Knight
02.09.2022, 17:37
ты про

RakClientInterface::RegisterAsRemoteProcedureCall

? в принципе можно, но я не помню, почему их не хотел использовать


Скорее из-за того, что на каждый РПЦ пришлось регать свой коллбек, но скорее всего я ошибаюсь

SR_team
02.09.2022, 22:43
ты про

RakClientInterface::RegisterAsRemoteProcedureCall

? в принципе можно, но я не помню, почему их не хотел использовать


про PluginAttach

r4nx
03.09.2022, 18:10
про PluginAttach


а как ты будешь через него исходящие пакеты ловить?

вайега52
11.12.2022, 23:20
Дайте по бошке не шарющему дебилу, из-за чего ошибка? я так пониаю я неправильно загрузил либу в проект (добавил в дерикторию и подключил include в свойствах проекта).

main.hpp:






#include
#include
#include "RakHook/rakhook.hpp"
using
namespace
std
;
LONG wHandle
;
char
buffer
[
64
]
=
{
0
}
;
// function
inline
void
set_pos
(
)
{
RakNet
::
BitStream rpc
;
rpc
.
Write

(
0
)
;
rpc
.
Write

(
0
)
;
rpc
.
Write

(
0
)
;
rakhook
::
emul_rpc
(
12
,
rpc
)
;
}
void
printStringNow
(
const
char
*
text
,
unsigned
int
time
,
unsigned
short
flag
,
bool
bPreviousBrief
)
{
(
(
void
(
__cdecl
*
)
(
const
char
*
,
unsigned
int
,
unsigned
short
,
bool
)
)
0x69F1E0
)
(
text
,
time
,
flag
,
bPreviousBrief
)
;
}




main.cpp:






#include "main.hpp"
LRESULT CALLBACK
WindowProc
(
HWND hwnd
,
UINT uMsg
,
WPARAM wParam
,
LPARAM lParam
)
{
switch
(
uMsg
)
{
case
WM_KEYUP
:
{
switch
(
wParam
)
{
case
0x31
:
{
*
reinterpret_cast

(
0xC81320
)
+=
1
;
/*
sprintf(buffer, "weatherID: %d", *(unsigned __int16*)0xC81320);
printStringNow(buffer, 1000, NULL, false);
*/
break
;
}
case
0x32
:
{
*
reinterpret_cast

(
0xC81320
)
-=
1
;
/*
sprintf(buffer, "weatherID: %d", *(unsigned __int16*)0xC81320);
printStringNow(buffer, 1000, NULL, false);
*/
break
;
}
case
0x33
:
{
set_pos
(
)
;
printStringNow
(
"spawn"
,
1000
,
NULL
,
false
)
;
}
}
}
}
return
CallWindowProcA
(
WNDPROC
(
wHandle
)
,
hwnd
,
uMsg
,
wParam
,
lParam
)
;
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD fdwReason
,
LPVOID lpReserved
)
{
switch
(
fdwReason
)
{
case
DLL_PROCESS_ATTACH
:
{
DisableThreadLibraryCalls
(
hModule
)
;
wHandle
=
SetWindowLongA
(
FindWindowA
(
NULL
,
"GTA:SA:MP"
)
,
GWL_WNDPROC
,
LONG
(
WindowProc
)
)
;
break
;
}
case
DLL_PROCESS_DETACH
:
{
break
;
}
}
return
TRUE
;
}




1670786225453.pngвайега52 · 11 Дек 2022 в 22:20' data-fancybox="lb-post-1213712" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/181345/" style="cursor: pointer;" title="1670786225453.png">
https://forum.antichat.xyz/attachments/28213712/

1670788896501.pngвайега52 · 11 Дек 2022 в 22:20' data-fancybox="lb-post-1213712" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/181349/" style="cursor: pointer;" title="1670788896501.png">
https://forum.antichat.xyz/attachments/28213712/

imring
12.12.2022, 02:03
Дайте по бошке не шарющему дебилу, из-за чего ошибка? я так пониаю я неправильно загрузил либу в проект (добавил в дерикторию и подключил include в свойствах проекта).

main.hpp:






#include
#include
#include "RakHook/rakhook.hpp"
using
namespace
std
;
LONG wHandle
;
char
buffer
[
64
]
=
{
0
}
;
// function
inline
void
set_pos
(
)
{
RakNet
::
BitStream rpc
;
rpc
.
Write

(
0
)
;
rpc
.
Write

(
0
)
;
rpc
.
Write

(
0
)
;
rakhook
::
emul_rpc
(
12
,
rpc
)
;
}
void
printStringNow
(
const
char
*
text
,
unsigned
int
time
,
unsigned
short
flag
,
bool
bPreviousBrief
)
{
(
(
void
(
__cdecl
*
)
(
const
char
*
,
unsigned
int
,
unsigned
short
,
bool
)
)
0x69F1E0
)
(
text
,
time
,
flag
,
bPreviousBrief
)
;
}




main.cpp:






#include "main.hpp"
LRESULT CALLBACK
WindowProc
(
HWND hwnd
,
UINT uMsg
,
WPARAM wParam
,
LPARAM lParam
)
{
switch
(
uMsg
)
{
case
WM_KEYUP
:
{
switch
(
wParam
)
{
case
0x31
:
{
*
reinterpret_cast

(
0xC81320
)
+=
1
;
/*
sprintf(buffer, "weatherID: %d", *(unsigned __int16*)0xC81320);
printStringNow(buffer, 1000, NULL, false);
*/
break
;
}
case
0x32
:
{
*
reinterpret_cast

(
0xC81320
)
-=
1
;
/*
sprintf(buffer, "weatherID: %d", *(unsigned __int16*)0xC81320);
printStringNow(buffer, 1000, NULL, false);
*/
break
;
}
case
0x33
:
{
set_pos
(
)
;
printStringNow
(
"spawn"
,
1000
,
NULL
,
false
)
;
}
}
}
}
return
CallWindowProcA
(
WNDPROC
(
wHandle
)
,
hwnd
,
uMsg
,
wParam
,
lParam
)
;
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD fdwReason
,
LPVOID lpReserved
)
{
switch
(
fdwReason
)
{
case
DLL_PROCESS_ATTACH
:
{
DisableThreadLibraryCalls
(
hModule
)
;
wHandle
=
SetWindowLongA
(
FindWindowA
(
NULL
,
"GTA:SA:MP"
)
,
GWL_WNDPROC
,
LONG
(
WindowProc
)
)
;
break
;
}
case
DLL_PROCESS_DETACH
:
{
break
;
}
}
return
TRUE
;
}





библиотеку надо собрать через cmake

guts
26.12.2022, 00:40
библиотеку надо собрать через cmake


Kak

AnWu
29.12.2022, 23:26
Kak


Open windows promot

cd path_to_rakhook

mkdir build && cd build

cmake .. -A Win32

cmake --build .

результптом будет rakhook.lib который необходимо подключить к проекту, а так же добавить инклюды.

Однако это не всë, ракхук имеет доп закисимости в виде цианида, а тот зависит от полихука. Всë это нужно подключать к проекту.

Как сказал имринг - лучше собирать через симейк. Могу выложить пример проекта, но только после нг. к тому же он нестабилен из-за хуков @kin4stat (https://www.blast.hk/members/161331/)

AnWu
30.12.2022, 20:55
Kak



GitHub - AnWuPP/plugin (https://github.com/AnWuPP/plugin)

Contribute to AnWuPP/plugin development by creating an account on GitHub.

github.com


Мне сказали код говно, но да ладно. Собирал x86 компилятором студии.

открой папку в cmd в которой нужно собрать

Код:






git clone https://github.com/AnWuPP/plugin.git
cd plugin && code .




Если установлен VSCode - откроется.

https://forum.antichat.xyz/attachments/28225795/

Нужные расширения

Дальше сюда:

https://forum.antichat.xyz/attachments/28225795/

Выбираешь VS компилятор x86 или x86_64 (в зависимости чо есть в меню)

Дальше выбираешь Debug конфигурацию из меню

Создается кеш симейка,

Жмешь Build и ждёшь.

CMakeList.txt:

У меня там свой путь до папки с игрой, туда закинет файл OASys.asi. Измени путь, ну и название тоже.

Если есть вопросы - задавай. Отвечу если скилла хватит.

UPD: Изменил название, убрал путь до папки с игрой. MSVC будет собирать в Debug папку.

Rvmsitow
16.02.2024, 13:31
do u know how to get memory offsets please ?

вайега52
16.02.2024, 13:33
do u know how to get memory offsets please ?


какие именно?

Rvmsitow
16.02.2024, 17:54
какие именно?


Я думаю, это сложно, но исправьте лимит CreateVehicle (AddStatic...) (611+) с клиента

Loku
23.08.2024, 14:00
I noticed that no matter what, you never receive RPC 115 (GiveTakeDamage), does anyone know why?

Foxy01
03.11.2024, 14:45
Добавь поддержку R2 и R5, у тебя есть форки, в которых были добавлены эти версии

pidr6800
04.02.2025, 18:14
Из-за чего пакет может не всегда эмулироваться и как это можно пофиксить? (пакет для интерфейсов на радмире)

C++:






void
executeJs
(
const
std
::
string
&
code
)
{
if
(
code
.
empty
(
)
)
return
;
RakNet
::
BitStream bs
;
bs
.
ResetWritePointer
(
)
;
bs
.
Write
(
(
int8_t
)
215
)
;
bs
.
Write
(
(
int16_t
)
2
)
;
bs
.
Write
(
(
int32_t
)
2
)
;
bs
.
Write
(
(
int8_t
)
1
)
;
bs
.
Write
(
(
int32_t
)
code
.
length
(
)
)
;
bs
.
Write
(
code
.
c_str
(
)
,
code
.
length
(
)
)
;
rakhook
::
emul_packet
(
bs
)
;
}