Тема: беда с аси
Показать сообщение отдельно

  #14  
Старый 09.10.2024, 21:10
g305noobo
Постоянный
Регистрация: 24.09.2020
Сообщений: 364
С нами: 2966237

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

Цитата:
Сообщение от 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, это намного удобнее и круче
 
Ответить с цитированием