ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   Перехват сообщений SAMP (https://forum.antichat.xyz/showthread.php?t=1399333)

AdCKuY_DpO4uLa 23.08.2021 23:27

C++:





Код:

#include
#include
#include "MinHook.h"
#pragma comment(lib, "libMinHook-x86-v141-mt.lib")
typedef
void
(
__thiscall
*
tChatAddEntry
)
(
void
*
,
int
nType
,
char
*
szText
,
char
*
szPrefix
,
DWORD textColor
,
DWORD prefixColor
)
;
tChatAddEntry origChatAddEntry
=
nullptr
;
void
__fastcall
HOOKED_ChatAddEntry
(
void
*
_this
,
void
*
pUnk
,
int
nType
,
char
*
szText
,
char
*
szPrefix
,
DWORD textColor
,
DWORD prefixColor
)
{
printf
(
"type: %d, msg: %s\n"
,
nType
,
szText
)
;
return
origChatAddEntry
(
_this
,
nType
,
szText
,
szPrefix
,
textColor
,
prefixColor
)
;
}
class
CPluginInit
{
public
:
CPluginInit
(
)
{
base
=
(
DWORD
)
GetModuleHandleA
(
"samp.dll"
)
;
MH_Initialize
(
)
;
MH_CreateHook
(
(
void
*
)
(
base
+
0x0064010
)
,
&
HOOKED_ChatAddEntry
,
(
void
*
*
)
&
origChatAddEntry
)
;
MH_EnableHook
(
(
void
*
)
(
base
+
0x0064010
)
)
;
}
;
~
CPluginInit
(
)
{
MH_DisableHook
(
(
void
*
)
(
base
+
0x0064010
)
)
;
}
;
private
:
DWORD base
=
0
;
}
PluginInit
;



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

F1reGG 24.08.2021 09:53

Цитата:

Сообщение от AdCKuY_DpO4uLa

C++:





Код:

#include
#include
#include "MinHook.h"
#pragma comment(lib, "libMinHook-x86-v141-mt.lib")
typedef
void
(
__thiscall
*
tChatAddEntry
)
(
void
*
,
int
nType
,
char
*
szText
,
char
*
szPrefix
,
DWORD textColor
,
DWORD prefixColor
)
;
tChatAddEntry origChatAddEntry
=
nullptr
;
void
__fastcall
HOOKED_ChatAddEntry
(
void
*
_this
,
void
*
pUnk
,
int
nType
,
char
*
szText
,
char
*
szPrefix
,
DWORD textColor
,
DWORD prefixColor
)
{
printf
(
"type: %d, msg: %s\n"
,
nType
,
szText
)
;
return
origChatAddEntry
(
_this
,
nType
,
szText
,
szPrefix
,
textColor
,
prefixColor
)
;
}
class
CPluginInit
{
public
:
CPluginInit
(
)
{
base
=
(
DWORD
)
GetModuleHandleA
(
"samp.dll"
)
;
MH_Initialize
(
)
;
MH_CreateHook
(
(
void
*
)
(
base
+
0x0064010
)
,
&
HOOKED_ChatAddEntry
,
(
void
*
*
)
&
origChatAddEntry
)
;
MH_EnableHook
(
(
void
*
)
(
base
+
0x0064010
)
)
;
}
;
~
CPluginInit
(
)
{
MH_DisableHook
(
(
void
*
)
(
base
+
0x0064010
)
)
;
}
;
private
:
DWORD base
=
0
;
}
PluginInit
;



так, а каким образом можно заменить эти сообщения на свои?

AdCKuY_DpO4uLa 24.08.2021 14:49

В самое начало, перед всеми инклюдами

C++:





Код:

#define _CRT_SECURE_NO_WARNINGS


Один из вариантов того, как можно подменить определенное сообщение

C++:





Код:

void
__fastcall
HOOKED_ChatAddEntry
(
void
*
_this
,
void
*
pUnk
,
int
nType
,
char
*
szText
,
char
*
szPrefix
,
DWORD textColor
,
DWORD prefixColor
)
{
if
(
nType
==
8
&&
strstr
(
szText
,
"{FFFFFF}SA-MP {B9C9BF}0.3.7 {FFFFFF}Started"
)
)
sprintf
(
szText
,
"САМП ЗАПУЩЕН ЪУЪЪУЪУЪУЪУЪ"
)
;
return
origChatAddEntry
(
_this
,
nType
,
szText
,
szPrefix
,
textColor
,
prefixColor
)
;
}



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

kin4stat 24.08.2021 15:08

Цитата:

Сообщение от AdCKuY_DpO4uLa

В самое начало, перед всеми инклюдами

А прочитать сообщение об ошибке и попытаться вникнуть что там написано не пробовал? Эти предупреждения появляются из-за многочисленных выстрелов в ногу другими людьми, и даже в крупных проектах по типу MTA/Linux/CPython.

Да и вообще, зачем использовать функцию форматирования с кучей проверок форматирования для копирования константной строки? Про strcpy не слышал? Еще ты потерял const у szText и szPrefix.

О, а еще у тебя UB, так как имена начинающиеся на _ и на __ зарезервированы.

C++:





Код:

void
__fastcall
HOOKED_ChatAddEntry
(
void
*
_this
,
void
*
pUnk
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
DWORD textColor
,
DWORD prefixColor
)
{
std
::
string_view Message
=
szText
;
if
(
nType
==
8
&&
Message
==
"{FFFFFF}SA-MP {B9C9BF}0.3.7 {FFFFFF}Started"
)
Message
=
"САМП ЗАПУЩЕН ЪУЪЪУЪУЪУЪУЪ"
;
return
origChatAddEntry
(
_this
,
nType
,
Message
.
data
(
)
,
szPrefix
,
textColor
,
prefixColor
)
;
}


AdCKuY_DpO4uLa 24.08.2021 15:14

Цитата:

Сообщение от kin4stat

А прочитать сообщение об ошибке и попытаться вникнуть что там написано не пробовал? Эти предупреждения появляются из-за многочисленных выстрелов в ногу другими людьми, и даже в крупных проектах по типу MTA/Linux/CPython.
Да и вообще, зачем использовать функцию форматирования с кучей проверок форматирования для копирования константной строки? Про strcpy не слышал? Еще ты потерял const у szText и szPrefix.
О, а еще у тебя UB, так как имена начинающиеся на _ и на __ зарезервированы.

C++:





Код:

void
__fastcall
HOOKED_ChatAddEntry
(
void
*
_this
,
void
*
pUnk
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
DWORD textColor
,
DWORD prefixColor
)
{
std
::
string_view Message
;
if
(
nType
==
8
&&
std
::
string_view
(
szText
)
==
"{FFFFFF}SA-MP {B9C9BF}0.3.7 {FFFFFF}Started"
)
Message
=
"САМП ЗАПУЩЕН ЪУЪЪУЪУЪУЪУЪ"
;
return
origChatAddEntry
(
_this
,
nType
,
Message
.
data
(
)
,
szPrefix
,
textColor
,
prefixColor
)
;
}



В чем проявляется UB?

upd: ты возвращаешь Message.data(). Из-за этого весь чат будет пустым, кроме сообщения о старте сампа

kin4stat 24.08.2021 15:41

Цитата:

Сообщение от AdCKuY_DpO4uLa

В чем проявляется UB?

Undefined Behaviour.

AdCKuY_DpO4uLa 24.08.2021 15:44

Цитата:

Сообщение от kin4stat

Undefined Behaviour.

Переформулирую. Из-за чего он происходит?

kin4stat 24.08.2021 16:07

Цитата:

Сообщение от AdCKuY_DpO4uLa

Переформулирую. Из-за чего он происходит?

Можешь случайно задеть какую нибудь переменную из внутренней имплементации

.deserve 24.08.2021 18:05

Не советую использовать __thiscall, потому что поддержка этого кейворда есть только начиная с MSVC 2005. При этом компилируя через GCC, clang ты вообще потеряешь доступ к регистру хранящему this ptr (ecx) ибо он будет на стеке валяться. Для почти полной совместимости желательно использовать соглашение __fastcall, ибо оно абсолютно точно реализовано идентично в GCC, g++, clang, ICC и этого набора уже достаточно. А еще при создании функции хука ты можешь попасться на IDB на некоторых имплементациях MSVC, в связи с тем что у тебя нету дефайна класса, что лучше не допускать. (но к удивлению в 14.2 всё нормально)

#Northn 24.08.2021 18:25

Цитата:

Сообщение от .deserve

поддержка этого кейворда есть только начиная с MSVC 2005

msbuild запрещает использование __thiscall в любом случае, поэтому приходится костылить через __fastcall


Время: 23:28