 |
|

23.08.2021, 23:27
|
|
Постоянный
Регистрация: 05.08.2018
Сообщений: 372
С нами:
4091290
Репутация:
213
|
|
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
;

|
|
|

24.08.2021, 09:53
|
|
Новичок
Регистрация: 22.09.2019
Сообщений: 8
С нами:
3496590
Репутация:
1
|
|
Сообщение от 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
;
так, а каким образом можно заменить эти сообщения на свои?
|
|
|

24.08.2021, 14:49
|
|
Постоянный
Регистрация: 05.08.2018
Сообщений: 372
С нами:
4091290
Репутация:
213
|
|
В самое начало, перед всеми инклюдами
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
)
;
}

|
|
|

24.08.2021, 15:08
|
|
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами:
4483143
Репутация:
183
|
|
Сообщение от 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
)
;
}
|
|
|

24.08.2021, 15:14
|
|
Постоянный
Регистрация: 05.08.2018
Сообщений: 372
С нами:
4091290
Репутация:
213
|
|
Сообщение от 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(). Из-за этого весь чат будет пустым, кроме сообщения о старте сампа
|
|
|

24.08.2021, 15:41
|
|
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами:
4483143
Репутация:
183
|
|
Сообщение от AdCKuY_DpO4uLa
В чем проявляется UB?
Undefined Behaviour.
|
|
|

24.08.2021, 15:44
|
|
Постоянный
Регистрация: 05.08.2018
Сообщений: 372
С нами:
4091290
Репутация:
213
|
|
Сообщение от kin4stat
Undefined Behaviour.
Переформулирую. Из-за чего он происходит?
|
|
|

24.08.2021, 16:07
|
|
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами:
4483143
Репутация:
183
|
|
Сообщение от AdCKuY_DpO4uLa
Переформулирую. Из-за чего он происходит?
Можешь случайно задеть какую нибудь переменную из внутренней имплементации
|
|
|

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

24.08.2021, 18:25
|
|
Флудер
Регистрация: 10.08.2017
Сообщений: 2,659
С нами:
4609424
Репутация:
183
|
|
Сообщение от .deserve
поддержка этого кейворда есть только начиная с MSVC 2005
msbuild запрещает использование __thiscall в любом случае, поэтому приходится костылить через __fastcall
|
|
|
|
 |
|
Предыдущая тема
Следующая тема
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|