HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 23.08.2021, 23:27
AdCKuY_DpO4uLa
Постоянный
Регистрация: 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
;


 
Ответить с цитированием

  #2  
Старый 24.08.2021, 09:53
F1reGG
Новичок
Регистрация: 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
;

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

  #3  
Старый 24.08.2021, 14:49
AdCKuY_DpO4uLa
Постоянный
Регистрация: 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
)
;
}


 
Ответить с цитированием

  #4  
Старый 24.08.2021, 15:08
kin4stat
Флудер
Регистрация: 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
)
;
}
 
Ответить с цитированием

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

  #6  
Старый 24.08.2021, 15:41
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

Цитата:
Сообщение от AdCKuY_DpO4uLa  

В чем проявляется UB?
Undefined Behaviour.
 
Ответить с цитированием

  #7  
Старый 24.08.2021, 15:44
AdCKuY_DpO4uLa
Постоянный
Регистрация: 05.08.2018
Сообщений: 372
С нами: 4091290

Репутация: 213
По умолчанию

Цитата:
Сообщение от kin4stat  

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

  #8  
Старый 24.08.2021, 16:07
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

Цитата:
Сообщение от AdCKuY_DpO4uLa  

Переформулирую. Из-за чего он происходит?
Можешь случайно задеть какую нибудь переменную из внутренней имплементации
 
Ответить с цитированием

  #9  
Старый 24.08.2021, 18:05
.deserve
Познающий
Регистрация: 06.09.2018
Сообщений: 32
С нами: 4045092

Репутация: 23
По умолчанию

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

  #10  
Старый 24.08.2021, 18:25
#Northn
Флудер
Регистрация: 10.08.2017
Сообщений: 2,659
С нами: 4609424

Репутация: 183


По умолчанию

Цитата:
Сообщение от .deserve  

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



Предыдущая тема Следующая тема

Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.