ANTICHAT

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

nonelike 08.10.2024 22:07

код че:





Код:

using
CChat__AddEntry
=
void
(
__thiscall
*
)
(
void
*
,
void
*
,
int
,
const
char
*
,
const
char
*
,
unsigned
long
,
unsigned
long
)
;
CChat__AddEntry pOriginalFunction
=
nullptr
;
void
*
SetCallHook
(
uintptr_t HookAddress
,
void
*
DetourFunction
)
{
uintptr_t OriginalFunction
=
*
reinterpret_cast

(
HookAddress
+
1
)
+
HookAddress
+
5
;
DWORD oldProt
;
VirtualProtect
(
reinterpret_cast

(
HookAddress
+
1
)
,
sizeof
(
uintptr_t
)
,
PAGE_READWRITE
,
&
oldProt
)
;
*
reinterpret_cast

(
HookAddress
+
1
)
=
reinterpret_cast

(
DetourFunction
)
-
HookAddress
-
5
;
VirtualProtect
(
reinterpret_cast

(
HookAddress
+
1
)
,
sizeof
(
uintptr_t
)
,
oldProt
,
&
oldProt
)
;
return
reinterpret_cast

(
OriginalFunction
)
;
}
void
__fastcall
HOOK_AddEntry
(
void
*
pChat
,
void
*
EDX
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
unsigned
long
textColor
,
unsigned
long
prefixColor
)
{
pOriginalFunction
(
pChat
,
EDX
,
nType
,
szText
,
szPrefix
,
textColor
,
prefixColor
)
;
}
if
(
uintptr_t dwSAMP
=
reinterpret_cast

(
GetModuleHandleA
(
"samp.dll"
)
)
;
dwSAMP
!=
0
)
{
pOriginalFunction
=
reinterpret_cast

(
SetCallHook
(
dwSAMP
+
0x67460
,
&
HOOK_AddEntry
)
)
;
}



пытаюсь хукнуть CChat__AddEntry, чтоб сменить текст samp started бла бла бла, но игра после запуска просто крашится

ARMOR 08.10.2024 22:09

Цитата:

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

код че:





Код:

using
CChat__AddEntry
=
void
(
__thiscall
*
)
(
void
*
,
void
*
,
int
,
const
char
*
,
const
char
*
,
unsigned
long
,
unsigned
long
)
;
CChat__AddEntry pOriginalFunction
=
nullptr
;
void
*
SetCallHook
(
uintptr_t HookAddress
,
void
*
DetourFunction
)
{
uintptr_t OriginalFunction
=
*
reinterpret_cast

(
HookAddress
+
1
)
+
HookAddress
+
5
;
DWORD oldProt
;
VirtualProtect
(
reinterpret_cast

(
HookAddress
+
1
)
,
sizeof
(
uintptr_t
)
,
PAGE_READWRITE
,
&
oldProt
)
;
*
reinterpret_cast

(
HookAddress
+
1
)
=
reinterpret_cast

(
DetourFunction
)
-
HookAddress
-
5
;
VirtualProtect
(
reinterpret_cast

(
HookAddress
+
1
)
,
sizeof
(
uintptr_t
)
,
oldProt
,
&
oldProt
)
;
return
reinterpret_cast

(
OriginalFunction
)
;
}
void
__fastcall
HOOK_AddEntry
(
void
*
pChat
,
void
*
EDX
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
unsigned
long
textColor
,
unsigned
long
prefixColor
)
{
pOriginalFunction
(
pChat
,
EDX
,
nType
,
szText
,
szPrefix
,
textColor
,
prefixColor
)
;
}
if
(
uintptr_t dwSAMP
=
reinterpret_cast

(
GetModuleHandleA
(
"samp.dll"
)
)
;
dwSAMP
!=
0
)
{
pOriginalFunction
=
reinterpret_cast

(
SetCallHook
(
dwSAMP
+
0x67460
,
&
HOOK_AddEntry
)
)
;
}



пытаюсь хукнуть CChat__AddEntry, чтоб сменить текст samp started бла бла бла, но игра после запуска просто крашится

Потому что ты установил __thiscall но почему-то указываешь void* EDX. Или убери параметр EDX, или поставь соглашение о вызове __fastcall

nonelike 08.10.2024 22:14

Цитата:

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

Потому что ты установил __thiscall но почему-то указываешь void* EDX. Или убери параметр EDX, или поставь соглашение о вызове __fastcall

оба твои варианта не сработали, крашнуло

ARMOR 08.10.2024 22:20

C++:





Код:

using
CChat__AddEntry
=
void
(
__thiscall
*
)
(
void
*
,
int
,
const
char
*
,
const
char
*
,
unsigned
long
,
unsigned
long
)
;
CChat__AddEntry pOriginalFunction
=
nullptr
;
void
*
SetCallHook
(
uintptr_t HookAddress
,
void
*
DetourFunction
)
{
uintptr_t OriginalFunction
=
*
reinterpret_cast

(
HookAddress
+
1
)
+
HookAddress
+
5
;
DWORD oldProt
;
VirtualProtect
(
reinterpret_cast

(
HookAddress
+
1
)
,
sizeof
(
uintptr_t
)
,
PAGE_READWRITE
,
&
oldProt
)
;
*
reinterpret_cast

(
HookAddress
+
1
)
=
reinterpret_cast

(
DetourFunction
)
-
HookAddress
-
5
;
VirtualProtect
(
reinterpret_cast

(
HookAddress
+
1
)
,
sizeof
(
uintptr_t
)
,
oldProt
,
&
oldProt
)
;
return
reinterpret_cast

(
OriginalFunction
)
;
}
void
__fastcall
HOOK_AddEntry
(
void
*
pChat
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
unsigned
long
textColor
,
unsigned
long
prefixColor
)
{
pOriginalFunction
(
pChat
,
nType
,
szText
,
szPrefix
,
textColor
,
prefixColor
)
;
}
if
(
uintptr_t dwSAMP
=
reinterpret_cast

(
GetModuleHandleA
(
"samp.dll"
)
)
;
dwSAMP
!=
0
)
{
pOriginalFunction
=
reinterpret_cast

(
SetCallHook
(
dwSAMP
+
0x67460
,
&
HOOK_AddEntry
)
)
;
}



Если все равно крашит - проблема в адресе или функции для хука

nonelike 08.10.2024 22:22

Цитата:

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

C++:





Код:

using
CChat__AddEntry
=
void
(
__thiscall
*
)
(
void
*
,
int
,
const
char
*
,
const
char
*
,
unsigned
long
,
unsigned
long
)
;
CChat__AddEntry pOriginalFunction
=
nullptr
;
void
*
SetCallHook
(
uintptr_t HookAddress
,
void
*
DetourFunction
)
{
uintptr_t OriginalFunction
=
*
reinterpret_cast

(
HookAddress
+
1
)
+
HookAddress
+
5
;
DWORD oldProt
;
VirtualProtect
(
reinterpret_cast

(
HookAddress
+
1
)
,
sizeof
(
uintptr_t
)
,
PAGE_READWRITE
,
&
oldProt
)
;
*
reinterpret_cast

(
HookAddress
+
1
)
=
reinterpret_cast

(
DetourFunction
)
-
HookAddress
-
5
;
VirtualProtect
(
reinterpret_cast

(
HookAddress
+
1
)
,
sizeof
(
uintptr_t
)
,
oldProt
,
&
oldProt
)
;
return
reinterpret_cast

(
OriginalFunction
)
;
}
void
__fastcall
HOOK_AddEntry
(
void
*
pChat
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
unsigned
long
textColor
,
unsigned
long
prefixColor
)
{
pOriginalFunction
(
pChat
,
nType
,
szText
,
szPrefix
,
textColor
,
prefixColor
)
;
}
if
(
uintptr_t dwSAMP
=
reinterpret_cast

(
GetModuleHandleA
(
"samp.dll"
)
)
;
dwSAMP
!=
0
)
{
pOriginalFunction
=
reinterpret_cast

(
SetCallHook
(
dwSAMP
+
0x67460
,
&
HOOK_AddEntry
)
)
;
}



Если все равно крашит - проблема в адресе или функции для хука

адрес брал с https://github.com/BlastHackNet/SAMP...R3-1/CChat.cpp

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

также глянул в иде, адреса совпадают на р3

крашит до сих пор

плюс:





Код:

#include "plugin.h"
#include
using
CChat__AddEntry
=
void
(
__thiscall
*
)
(
void
*
,
int
,
const
char
*
,
const
char
*
,
unsigned
long
,
unsigned
long
)
;
CChat__AddEntry pOriginalFunction
=
nullptr
;
void
*
SetCallHook
(
uintptr_t HookAddress
,
void
*
DetourFunction
)
{
uintptr_t OriginalFunction
=
*
reinterpret_cast

(
HookAddress
+
1
)
+
HookAddress
+
5
;
DWORD oldProt
;
VirtualProtect
(
reinterpret_cast

(
HookAddress
+
1
)
,
sizeof
(
uintptr_t
)
,
PAGE_READWRITE
,
&
oldProt
)
;
*
reinterpret_cast

(
HookAddress
+
1
)
=
reinterpret_cast

(
DetourFunction
)
-
HookAddress
-
5
;
VirtualProtect
(
reinterpret_cast

(
HookAddress
+
1
)
,
sizeof
(
uintptr_t
)
,
oldProt
,
&
oldProt
)
;
return
reinterpret_cast

(
OriginalFunction
)
;
}
void
__fastcall
HOOK_AddEntry
(
void
*
pChat
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
unsigned
long
textColor
,
unsigned
long
prefixColor
)
{
std
::
cout
: "

ref
(
)
==
nullptr
)
return
game_loop_hook
.
call_original
(
)
;
initialized
=
true
;
if
(
uintptr_t dwSAMP
=
reinterpret_cast

(
GetModuleHandleA
(
"samp.dll"
)
)
;
dwSAMP
!=
0
)
{
pOriginalFunction
=
reinterpret_cast

(
SetCallHook
(
dwSAMP
+
0x67460
,
&
HOOK_AddEntry
)
)
;
}
return
game_loop_hook
.
call_original
(
)
;
}
void
c_plugin
::
attach_console
(
)
{
if
(
!
AllocConsole
(
)
)
return
;
FILE
*
f
;
freopen_s
(
&
f
,
"CONOUT$"
,
"w"
,
stdout
)
;
freopen_s
(
&
f
,
"CONOUT$"
,
"w"
,
stderr
)
;
freopen_s
(
&
f
,
"CONIN$"
,
"r"
,
stdin
)
;
}
c_plugin
::
c_plugin
(
HMODULE hmodule
)
:
hmodule
(
hmodule
)
{
attach_console
(
)
;
game_loop_hook
.
add
(
&
c_plugin
::
game_loop
)
;
}
c_plugin
::
~
c_plugin
(
)
{
rakhook
::
destroy
(
)
;
}


fuflexxxx 08.10.2024 23:19

У __fastcall'a в х86 архитектуре аргументы передаются в ecx, edx + стэк, тебе надо в хуке после объекта добавить ещё один аргумент любой(чтобы учесть edx). В оригинал соответственно edx передавать не надо, т.к у thiscall передача ecx + stack.

nonelike 08.10.2024 23:26

Цитата:

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

У __fastcall'a в х86 архитектуре аргументы передаются в ecx, edx + стэк, тебе надо в хуке после объекта добавить ещё один аргумент любой(чтобы учесть edx). В оригинал соответственно edx передавать не надо, т.к у thiscall передача ecx + stack.

C++:





[CODE]
void
__fastcall
HOOK_AddEntry
(
void
*
pChat
,
void
*
EDX
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
unsigned
long
textColor
,
unsigned
long
prefixColor
)
{
std
::
cout
: "



внес правки, samp started бла бла бла прошло, а когда начала выбиваться следующая строка(коннект на сервер) крашнуло

fuflexxxx 08.10.2024 23:36

Закоментируй свой вывод в хуке и посмотри что будет. И попробуй отладчиком посмотреть, где крашит.

nonelike 08.10.2024 23:42

Цитата:

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

Закоментируй свой вывод в хуке и посмотри что будет. И попробуй отладчиком посмотреть, где крашит.

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

Musaigen 08.10.2024 23:53

Ты ставишь хук на пролог функции, а не на один из ее вызовов, да и по коду непонятно как у тебя вообще твоя функция вызывается, ибо ты даже не пишешь 0xE8 или 0xE9.

Второе, тебе нужен JMP hook (для него есть библиотека minhook например) в таком случае (если ты хукаешь пролог функции), иначе ты просто караптнешь стек и краш

nonelike 08.10.2024 23:56

Цитата:

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

Ты ставишь хук на пролог функции, а не на один из ее вызовов, да и по коду непонятно как у тебя вообще твоя функция вызывается, ибо ты даже не пишешь 0xE8 или 0xE9.

Второе, тебе нужен JMP hook (для него есть библиотека minhook например) в таком случае (если ты хукаешь пролог функции), иначе ты просто караптнешь стек и краш

в планах было ловить эту функцию, после считывать нужный текст который в неё приходит и редачить его под нужный мне (по аналогии samp started -> custom_text, connected to server -> custom text)

fuflexxxx 08.10.2024 23:58

У тебя функция по реализации меняет rva(когда ты передаёшь адрес пролога функции), либо перепиши и измени оффсет, либо юзай такое или минхук

C++:





Код:

static
void
RedirectJump
(
DWORD address
,
void
*
foo
)
{
DWORD protect
;
VirtualProtect
(
(
LPVOID
)
address
,
5
,
PAGE_EXECUTE_READWRITE
,
&
protect
)
;
*
reinterpret_cast

(
address
)
=
0xE9
;
*
reinterpret_cast

(
address
+
1
)
=
reinterpret_cast

(
foo
)
-
address
-
5
;
VirtualProtect
(
(
LPVOID
)
address
,
5
,
protect
,
&
protect
)
;
}





Только надо добавить сохранение указателя на ориг функцию, ибо код из инета взял для примера.

nonelike 09.10.2024 20:45

код:





Код:

#include "plugin.h"
#include
void
*
pOriginalFunction
=
nullptr
;
void
*
SetJmpHook
(
uintptr_t HookAddress
,
size_t HookSize
,
void
*
DetourFunction
)
{
void
*
Trampoline
=
VirtualAlloc
(
0
,
HookSize
+
5
,
MEM_COMMIT
|
MEM_RESERVE
,
PAGE_EXECUTE_READWRITE
)
;
if
(
Trampoline
)
{
uintptr_t TrampolineJmpBack
=
reinterpret_cast

(
Trampoline
)
+
HookSize
;
memcpy
(
Trampoline
,
reinterpret_cast

(
HookAddress
)
,
HookSize
)
;
DWORD oldProt
;
VirtualProtect
(
reinterpret_cast

(
HookAddress
)
,
HookSize
,
PAGE_READWRITE
,
&
oldProt
)
;
memset
(
reinterpret_cast

(
HookAddress
)
,
0x90
,
HookSize
)
;
*
reinterpret_cast

(
HookAddress
)
=
0xE9
;
*
reinterpret_cast

(
HookAddress
+
1
)
=
reinterpret_cast

(
DetourFunction
)
-
HookAddress
-
5
;
VirtualProtect
(
reinterpret_cast

(
HookAddress
)
,
HookSize
,
oldProt
,
&
oldProt
)
;
*
reinterpret_cast

(
TrampolineJmpBack
)
=
0xE9
;
*
reinterpret_cast

(
TrampolineJmpBack
+
1
)
=
(
HookAddress
+
HookSize
)
-
TrampolineJmpBack
-
5
;
return
Trampoline
;
}
return
nullptr
;
}
void
HOOK_AddChatMessage
(
void
*
pChat
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
unsigned
long
textColor
,
unsigned
long
prefixColor
)
{
std
::
cout
: "

ref
(
)
==
nullptr
)
return
game_loop_hook
.
call_original
(
)
;
if
(
uintptr_t dwSAMP
=
reinterpret_cast

(
GetModuleHandleA
(
"samp.dll"
)
)
;
dwSAMP
!=
0
)
{
SetJmpHook
(
dwSAMP
+
0x67460
,
5
,
&
HOOK_Raw_AddChatMessage
)
;
}
initialized
=
true
;
return
game_loop_hook
.
call_original
(
)
;
}
void
c_plugin
::
attach_console
(
)
{
if
(
!
AllocConsole
(
)
)
return
;
FILE
*
f
;
freopen_s
(
&
f
,
"CONOUT$"
,
"w"
,
stdout
)
;
freopen_s
(
&
f
,
"CONOUT$"
,
"w"
,
stderr
)
;
freopen_s
(
&
f
,
"CONIN$"
,
"r"
,
stdin
)
;
}
c_plugin
::
c_plugin
(
HMODULE hmodule
)
:
hmodule
(
hmodule
)
{
attach_console
(
)
;
game_loop_hook
.
add
(
&
c_plugin
::
game_loop
)
;
}
c_plugin
::
~
c_plugin
(
)
{
rakhook
::
destroy
(
)
;
}



че то все равно крашит

g305noobo 09.10.2024 21:10

Цитата:

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

код:





Код:

#include "plugin.h"
#include
void
*
pOriginalFunction
=
nullptr
;
void
*
SetJmpHook
(
uintptr_t HookAddress
,
size_t HookSize
,
void
*
DetourFunction
)
{
void
*
Trampoline
=
VirtualAlloc
(
0
,
HookSize
+
5
,
MEM_COMMIT
|
MEM_RESERVE
,
PAGE_EXECUTE_READWRITE
)
;
if
(
Trampoline
)
{
uintptr_t TrampolineJmpBack
=
reinterpret_cast

(
Trampoline
)
+
HookSize
;
memcpy
(
Trampoline
,
reinterpret_cast

(
HookAddress
)
,
HookSize
)
;
DWORD oldProt
;
VirtualProtect
(
reinterpret_cast

(
HookAddress
)
,
HookSize
,
PAGE_READWRITE
,
&
oldProt
)
;
memset
(
reinterpret_cast

(
HookAddress
)
,
0x90
,
HookSize
)
;
*
reinterpret_cast

(
HookAddress
)
=
0xE9
;
*
reinterpret_cast

(
HookAddress
+
1
)
=
reinterpret_cast

(
DetourFunction
)
-
HookAddress
-
5
;
VirtualProtect
(
reinterpret_cast

(
HookAddress
)
,
HookSize
,
oldProt
,
&
oldProt
)
;
*
reinterpret_cast

(
TrampolineJmpBack
)
=
0xE9
;
*
reinterpret_cast

(
TrampolineJmpBack
+
1
)
=
(
HookAddress
+
HookSize
)
-
TrampolineJmpBack
-
5
;
return
Trampoline
;
}
return
nullptr
;
}
void
HOOK_AddChatMessage
(
void
*
pChat
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
unsigned
long
textColor
,
unsigned
long
prefixColor
)
{
std
::
cout
: "

ref
(
)
==
nullptr
)
return
game_loop_hook
.
call_original
(
)
;
if
(
uintptr_t dwSAMP
=
reinterpret_cast

(
GetModuleHandleA
(
"samp.dll"
)
)
;
dwSAMP
!=
0
)
{
SetJmpHook
(
dwSAMP
+
0x67460
,
5
,
&
HOOK_Raw_AddChatMessage
)
;
}
initialized
=
true
;
return
game_loop_hook
.
call_original
(
)
;
}
void
c_plugin
::
attach_console
(
)
{
if
(
!
AllocConsole
(
)
)
return
;
FILE
*
f
;
freopen_s
(
&
f
,
"CONOUT$"
,
"w"
,
stdout
)
;
freopen_s
(
&
f
,
"CONOUT$"
,
"w"
,
stderr
)
;
freopen_s
(
&
f
,
"CONIN$"
,
"r"
,
stdin
)
;
}
c_plugin
::
c_plugin
(
HMODULE hmodule
)
:
hmodule
(
hmodule
)
{
attach_console
(
)
;
game_loop_hook
.
add
(
&
c_plugin
::
game_loop
)
;
}
c_plugin
::
~
c_plugin
(
)
{
rakhook
::
destroy
(
)
;
}



че то все равно крашит

у тебя ж мой враппер MinHook в проекте , используй его или напрямую саму библиотеку, зачем тебе это говно которое ты юзаешь с калхуками или даже тем, что скинули с сырым джамп хуком?

также учти, точно ли ты юзаешь верную версию сампа, ведь у тебя адрес для р3.

с моим проектом это должно выглядеть так(должно работать, не тестил):

C++:





Код:

// объявляю функцию
// объявление функции нужно, чтобы можно было использовать decltype для создания
// объекта хука, не указывая тип явно через using. это упрощает код, так как
// вывод типа происходит автоматически, однако, можно было бы и явно определить
// тип с помощью using
void
__fastcall
add_chat_entry
(
void
*
pChat
,
void
*
edx
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
unsigned
long
textColor
,
unsigned
long
prefixColor
)
;
// создаю объект хука, в котором указываю тип функции, с помощью decltype
inline
c_hook

add_chat_entry_hook
{
}
;
void
__fastcall
add_chat_entry
(
void
*
pChat
,
void
*
edx
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
unsigned
long
textColor
,
unsigned
long
prefixColor
)
{
//вывод текста в чате
std
::
printf
(
"add_chat_entry: %s\n"
,
szText
)
;
// вызов оригинала
return
add_chat_entry_hook
.
call_original
(
pChat
,
edx
,
nType
,
szText
,
szPrefix
,
textColor
,
prefixColor
)
;
}
// edx - неиспользуемый параметр, так как функция использует __fastcall.
// этот регистр добавлен для совместимости с thiscall-функцией,
// поскольку __fastcall требует двух регистров (ecx и edx),
// что позволяет перехватывать вызовы thiscall функций
c_plugin
::
c_plugin
(
HMODULE hmodule
)
:
_hmodule
(
hmodule
)
{
attach_console
(
)
;
std
::
uintptr_t address_func_to_hook
=
(
std
::
uintptr_t
)
GetModuleHandleA
(
"samp.dll"
)
+
0x67460
;
add_chat_entry_hook
.
set_adr
(
address_func_to_hook
)
;
add_chat_entry_hook
.
add
(
&
add_chat_entry
)
;
}



p.s лучше почитай про хуки, какие типы бывают и как работают, а также используй готовые решения, как например писал раньше - MinHook, это намного удобнее и круче

nonelike 09.10.2024 21:24

Цитата:

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

у тебя ж мой враппер MinHook в проекте , используй его или напрямую саму библиотеку, зачем тебе это говно которое ты юзаешь с калхуками или даже тем, что скинули с сырым джамп хуком?

также учти, точно ли ты юзаешь верную версию сампа, ведь у тебя адрес для р3.
с моим проектом это должно выглядеть так(должно работать, не тестил):

C++:





Код:

// объявляю функцию
// объявление функции нужно, чтобы можно было использовать decltype для создания
// объекта хука, не указывая тип явно через using. это упрощает код, так как
// вывод типа происходит автоматически, однако, можно было бы и явно определить
// тип с помощью using
void
__fastcall
add_chat_entry
(
void
*
pChat
,
void
*
edx
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
unsigned
long
textColor
,
unsigned
long
prefixColor
)
;
// создаю объект хука, в котором указываю тип функции, с помощью decltype
inline
c_hook

add_chat_entry_hook
{
}
;
void
__fastcall
add_chat_entry
(
void
*
pChat
,
void
*
edx
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
unsigned
long
textColor
,
unsigned
long
prefixColor
)
{
//вывод текста в чате
std
::
printf
(
"add_chat_entry: %s\n"
,
szText
)
;
// вызов оригинала
return
add_chat_entry_hook
.
call_original
(
pChat
,
edx
,
nType
,
szText
,
szPrefix
,
textColor
,
prefixColor
)
;
}
// edx - неиспользуемый параметр, так как функция использует __fastcall.
// этот регистр добавлен для совместимости с thiscall-функцией,
// поскольку __fastcall требует двух регистров (ecx и edx),
// что позволяет перехватывать вызовы thiscall функций
c_plugin
::
c_plugin
(
HMODULE hmodule
)
:
_hmodule
(
hmodule
)
{
attach_console
(
)
;
std
::
uintptr_t address_func_to_hook
=
(
std
::
uintptr_t
)
GetModuleHandleA
(
"samp.dll"
)
+
0x67460
;
add_chat_entry_hook
.
set_adr
(
address_func_to_hook
)
;
add_chat_entry_hook
.
add
(
&
add_chat_entry
)
;
}



p.s лучше почитай про хуки, какие типы бывают и как работают, а также используй готовые решения, как например писал раньше - MinHook, это намного удобнее и круче

ща попробовал с твоим кодом, ваще нет сообщений в консоли (я про враппер в проекте забыл ваще, говно вытворял лютое)

C++:





Код:

#include "plugin.h"
#include
void
__fastcall
add_chat_entry
(
void
*
pChat
,
void
*
edx
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
unsigned
long
textColor
,
unsigned
long
prefixColor
)
;
inline
c_hook

add_chat_entry_hook
{
}
;
void
__fastcall
add_chat_entry
(
void
*
pChat
,
void
*
edx
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
unsigned
long
textColor
,
unsigned
long
prefixColor
)
{
//вывод текста в чате
std
::
printf
(
"add_chat_entry: %s\n"
,
szText
)
;
// вызов оригинала
return
add_chat_entry_hook
.
call_original
(
pChat
,
edx
,
nType
,
szText
,
szPrefix
,
textColor
,
prefixColor
)
;
}
void
c_plugin
::
game_loop
(
)
{
static
bool
initialized
=
false
;
if
(
initialized
||
!
rakhook
::
initialize
(
)
||
c_chat
::
get
(
)
->
ref
(
)
==
nullptr
)
return
game_loop_hook
.
call_original
(
)
;
initialized
=
true
;
return
game_loop_hook
.
call_original
(
)
;
}
void
c_plugin
::
attach_console
(
)
{
if
(
!
AllocConsole
(
)
)
return
;
FILE
*
f
;
freopen_s
(
&
f
,
"CONOUT$"
,
"w"
,
stdout
)
;
freopen_s
(
&
f
,
"CONOUT$"
,
"w"
,
stderr
)
;
freopen_s
(
&
f
,
"CONIN$"
,
"r"
,
stdin
)
;
}
c_plugin
::
c_plugin
(
HMODULE hmodule
)
:
hmodule
(
hmodule
)
{
attach_console
(
)
;
std
::
uintptr_t address_func_to_hook
=
(
std
::
uintptr_t
)
GetModuleHandleA
(
"samp.dll"
)
+
0x67460
;
add_chat_entry_hook
.
set_adr
(
address_func_to_hook
)
;
add_chat_entry_hook
.
add
(
&
add_chat_entry
)
;
game_loop_hook
.
add
(
&
c_plugin
::
game_loop
)
;
}
c_plugin
::
~
c_plugin
(
)
{
rakhook
::
destroy
(
)
;
}


g305noobo 09.10.2024 21:56

Цитата:

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

ща попробовал с твоим кодом, ваще нет сообщений в консоли (я про враппер в проекте забыл ваще, говно вытворял лютое)

C++:





Код:

#include "plugin.h"
#include
void
__fastcall
add_chat_entry
(
void
*
pChat
,
void
*
edx
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
unsigned
long
textColor
,
unsigned
long
prefixColor
)
;
inline
c_hook

add_chat_entry_hook
{
}
;
void
__fastcall
add_chat_entry
(
void
*
pChat
,
void
*
edx
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
unsigned
long
textColor
,
unsigned
long
prefixColor
)
{
//вывод текста в чате
std
::
printf
(
"add_chat_entry: %s\n"
,
szText
)
;
// вызов оригинала
return
add_chat_entry_hook
.
call_original
(
pChat
,
edx
,
nType
,
szText
,
szPrefix
,
textColor
,
prefixColor
)
;
}
void
c_plugin
::
game_loop
(
)
{
static
bool
initialized
=
false
;
if
(
initialized
||
!
rakhook
::
initialize
(
)
||
c_chat
::
get
(
)
->
ref
(
)
==
nullptr
)
return
game_loop_hook
.
call_original
(
)
;
initialized
=
true
;
return
game_loop_hook
.
call_original
(
)
;
}
void
c_plugin
::
attach_console
(
)
{
if
(
!
AllocConsole
(
)
)
return
;
FILE
*
f
;
freopen_s
(
&
f
,
"CONOUT$"
,
"w"
,
stdout
)
;
freopen_s
(
&
f
,
"CONOUT$"
,
"w"
,
stderr
)
;
freopen_s
(
&
f
,
"CONIN$"
,
"r"
,
stdin
)
;
}
c_plugin
::
c_plugin
(
HMODULE hmodule
)
:
hmodule
(
hmodule
)
{
attach_console
(
)
;
std
::
uintptr_t address_func_to_hook
=
(
std
::
uintptr_t
)
GetModuleHandleA
(
"samp.dll"
)
+
0x67460
;
add_chat_entry_hook
.
set_adr
(
address_func_to_hook
)
;
add_chat_entry_hook
.
add
(
&
add_chat_entry
)
;
game_loop_hook
.
add
(
&
c_plugin
::
game_loop
)
;
}
c_plugin
::
~
c_plugin
(
)
{
rakhook
::
destroy
(
)
;
}



Цитата:

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

точно ли ты юзаешь верную версию сампа, ведь у тебя адрес для р3.


nonelike 09.10.2024 21:57

https://forum.antichat.xyz/attachments/28547300/
я чекал в иде по samp.dll, адрес сходится

Red Fox 10.10.2024 13:09

c MinHook работает нормально

C++:





Код:

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
)
{
if
(
nType
==
8
&&
strstr
(
szText
,
"{FFFFFF}SA-MP {B9C9BF}0.3.7-R3 {FFFFFF}Started"
)
)
sprintf
(
szText
,
"{FFFFFF}Custom Text"
)
;
return
origChatAddEntry
(
_this
,
nType
,
szText
,
szPrefix
,
textColor
,
prefixColor
)
;
}
DWORD base
=
(
DWORD
)
GetModuleHandleA
(
"samp.dll"
)
;
MH_Initialize
(
)
;
MH_CreateHook
(
(
void
*
)
(
base
+
0x0067460
)
,
&
HOOKED_ChatAddEntry
,
(
void
*
*
)
&
origChatAddEntry
)
;
MH_EnableHook
(
(
void
*
)
(
base
+
0x0067460
)
)
;
//================= [unload .asi] =================
MH_DisableHook
(
(
void
*
)
(
base
+
0x0067460
)
)
;


nonelike 10.10.2024 20:36

Цитата:

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

у тебя ж мой враппер MinHook в проекте , используй его или напрямую саму библиотеку, зачем тебе это говно которое ты юзаешь с калхуками или даже тем, что скинули с сырым джамп хуком?

также учти, точно ли ты юзаешь верную версию сампа, ведь у тебя адрес для р3.
с моим проектом это должно выглядеть так(должно работать, не тестил):

C++:





Код:

// объявляю функцию
// объявление функции нужно, чтобы можно было использовать decltype для создания
// объекта хука, не указывая тип явно через using. это упрощает код, так как
// вывод типа происходит автоматически, однако, можно было бы и явно определить
// тип с помощью using
void
__fastcall
add_chat_entry
(
void
*
pChat
,
void
*
edx
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
unsigned
long
textColor
,
unsigned
long
prefixColor
)
;
// создаю объект хука, в котором указываю тип функции, с помощью decltype
inline
c_hook

add_chat_entry_hook
{
}
;
void
__fastcall
add_chat_entry
(
void
*
pChat
,
void
*
edx
,
int
nType
,
const
char
*
szText
,
const
char
*
szPrefix
,
unsigned
long
textColor
,
unsigned
long
prefixColor
)
{
//вывод текста в чате
std
::
printf
(
"add_chat_entry: %s\n"
,
szText
)
;
// вызов оригинала
return
add_chat_entry_hook
.
call_original
(
pChat
,
edx
,
nType
,
szText
,
szPrefix
,
textColor
,
prefixColor
)
;
}
// edx - неиспользуемый параметр, так как функция использует __fastcall.
// этот регистр добавлен для совместимости с thiscall-функцией,
// поскольку __fastcall требует двух регистров (ecx и edx),
// что позволяет перехватывать вызовы thiscall функций
c_plugin
::
c_plugin
(
HMODULE hmodule
)
:
_hmodule
(
hmodule
)
{
attach_console
(
)
;
std
::
uintptr_t address_func_to_hook
=
(
std
::
uintptr_t
)
GetModuleHandleA
(
"samp.dll"
)
+
0x67460
;
add_chat_entry_hook
.
set_adr
(
address_func_to_hook
)
;
add_chat_entry_hook
.
add
(
&
add_chat_entry
)
;
}



p.s лучше почитай про хуки, какие типы бывают и как работают, а также используй готовые решения, как например писал раньше - MinHook, это намного удобнее и круче

твой код работает, но если

Код:





Код:

std::uintptr_t address_func_to_hook =

      (std::uintptr_t)GetModuleHandleA("samp.dll") + 0x67460;

  add_chat_entry_hook.set_adr(address_func_to_hook);

  add_chat_entry_hook.add(&add_chat_entry);



засунуть в game_loop, разве это так должно работать? не в c_plugin::c_plugin?

nonelike 11.10.2024 22:48

Цитата:

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

твой код работает, но если

Код:





Код:

std::uintptr_t address_func_to_hook =

      (std::uintptr_t)GetModuleHandleA("samp.dll") + 0x67460;

  add_chat_entry_hook.set_adr(address_func_to_hook);

  add_chat_entry_hook.add(&add_chat_entry);



засунуть в game_loop, разве это так должно работать? не в c_plugin::c_plugin?

@g305noobo

g305noobo 11.10.2024 23:13

Цитата:

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

твой код работает, но если

Код:





Код:

std::uintptr_t address_func_to_hook =

      (std::uintptr_t)GetModuleHandleA("samp.dll") + 0x67460;

  add_chat_entry_hook.set_adr(address_func_to_hook);

  add_chat_entry_hook.add(&add_chat_entry);



засунуть в game_loop, разве это так должно работать? не в c_plugin::c_plugin?

не понял, что ты хочешь

тебе надо это в геймлуп засунуть что-ли? c_plugin - это конструктор, который выступает в роли аля dllmain, он вызывается 1 раз, геймлуп вызывается постоянно, можешь и там хук ставить просто проверяя на иниацилизацию и все, как хочешь

nonelike 11.10.2024 23:59

Цитата:

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

не понял, что ты хочешь
тебе надо это в геймлуп засунуть что-ли? c_plugin - это конструктор, который выступает в роли аля dllmain, он вызывается 1 раз, геймлуп вызывается постоянно, можешь и там хук ставить просто проверяя на иниацилизацию и все, как хочешь

у меня в конструкторе хук не канает на чат, из-за того что самп не успевает инициализироваться? на геймлуп хук робит, а в геймлупе работает, но постоянно делает хук

g305noobo 12.10.2024 00:51

Цитата:

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

у меня в конструкторе хук не канает на чат, из-за того что самп не успевает инициализироваться? на геймлуп хук робит, а в геймлупе работает, но постоянно делает хук

у тебя в геймлупе есть if !initialized что то такое, туда суй


Время: 06:24