Просмотр полной версии : hook char
legendabrn
08.01.2021, 14:44
https://forum.antichat.xyz/attachments/27643469/
https://forum.antichat.xyz/attachments/27643469/
C++:
namespace
{
const
auto
HOOK_ADDR
=
0x8A76
;
const
auto
HOOK_LEN
=
1
;
auto
__cdecl
name_hook
(
)
{
const
char
aServerClosedTh
[
]
=
"Closed"
;
return
aServerClosedTh
;
}
;
}
void
installHook
(
)
{
auto
samp
=
(
DWORD
)
GetModuleHandleA
(
"samp"
)
;
auto
relative_addr
=
(
DWORD
)
&
name_hook
-
(
samp
+
HOOK_ADDR
+
HOOK_LEN
)
;
DWORD vp
;
VirtualProtect
(
(
void
*
)
(
samp
+
HOOK_ADDR
)
,
HOOK_LEN
,
PAGE_EXECUTE_READWRITE
,
&
vp
)
;
*
(
DWORD
*
)
(
samp
+
HOOK_ADDR
+
1
)
=
relative_addr
;
VirtualProtect
(
(
void
*
)
(
samp
+
HOOK_ADDR
)
,
HOOK_LEN
,
vp
,
&
vp
)
;
}
;
в чат выводит пробел, как правильно хукать ?
C++:
uintptr_t sampModule
=
reinterpret_cast
(
GetModuleHandle
(
"samp.dll"
)
)
;
if
(
sampModule
!=
0
)
{
char
*
str
=
"Oh yes, server closed the connection."
;
void
*
address
=
reinterpret_cast
(
sampModule
+
0x8A76
+
1
)
;
DWORD vp
;
VirtualProtect
(
address
,
sizeof
(
str
)
,
PAGE_EXECUTE_READWRITE
,
&
vp
)
;
*
reinterpret_cast
(
address
)
=
str
;
VirtualProtect
(
address
,
sizeof
(
str
)
,
vp
,
&
vp
)
;
}
Важно чтобы строка оставалась в памяти, то есть твой плагин не должен быть выгружен, иначе выделяй память и копируй строку туда.
legendabrn
08.01.2021, 15:27
C++:
uintptr_t sampModule
=
reinterpret_cast
(
GetModuleHandle
(
"samp.dll"
)
)
;
if
(
sampModule
!=
0
)
{
char
*
str
=
"Oh yes, server closed the connection."
;
void
*
address
=
reinterpret_cast
(
sampModule
+
0x8A76
+
1
)
;
DWORD vp
;
VirtualProtect
(
address
,
sizeof
(
str
)
,
PAGE_EXECUTE_READWRITE
,
&
vp
)
;
*
reinterpret_cast
(
address
)
=
str
;
VirtualProtect
(
address
,
sizeof
(
str
)
,
vp
,
&
vp
)
;
}
Важно чтобы строка оставалась в памяти, то есть твой плагин не должен быть выгружен, иначе выделяй память и копируй строку туда.
Спасибо! Почему когда я меняю таким образом, то при превышение лимита символов, затрагивается другой текст?
Код:
DWORD dwProtect = PAGE_EXECUTE_READWRITE;
VirtualProtect(reinterpret_cast((DWORD)GetModuleHa ndle("samp.dll") + 0x8A76), 100, dwProtect, &dwProtect);
strcpy(reinterpret_cast((DWORD)GetModuleHandle("samp.dll") + 0x8A76), "Test123Test123Test123Test123Test123");
VirtualProtect(reinterpret_cast((DWORD)GetModuleHa ndle("samp.dll") + 0x8A76), 100, dwProtect, nullptr);
Копируя свою строку по адресу расположения оригинальной строки, ты можешь задеть и соседние данные если твоя строка длиннее изначальной.
Поэтому либо копируешь туда свою строку с аналогичной длинной, а если меньше то убедится что после последнего символа будет ноль.
Либо заменяешь адреса у всех инструкций обращающих к этой строке на свою.
legendabrn
08.01.2021, 15:49
Копируя свою строку по адресу расположения оригинальной строки, ты можешь задеть и соседние данные если твоя строка длиннее изначальной.
Поэтому либо копируешь туда свою строку с аналогичной длинной, а если меньше то убедится что после последнего символа будет ноль.
Либо заменяешь адреса у всех инструкций обращающих к этой строке на свою.
А если хукнуть функцию чата, и сделать проверку на соответствующий текст, а после вызвать прототип, то не будет затрагивать соседние строчки?
Можно сделать так, но она будет заменять и фейк сообщения (если такие будут с других плагинов и скриптов). Ну и зря тратишь процессорное время.
Что ты хочешь сделать? Тот код что я написал проблем не имеет.
legendabrn
08.01.2021, 15:53
Можно сделать так, но она будет заменять и фейк сообщения (если такие будут с других плагинов и скриптов). Ну и зря тратишь процессорное время.
Что ты хочешь сделать? Тот код что я написал проблем не имеет.
Я пробую разные методы, для повышения знаний 😀
Спасибо за помощь!
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot