ANTICHAT

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

legendabrn 01.03.2021 18:11

крашит когда вызывается функция, в чем проблема?

Код:





Код:

urmem::hook hooks;
int sub_48C8D0(char* Format, char ArgList)
{
    return hooks.call(Format, ArgList);
}

hooks.install(0x48C8D0, urmem::get_func_addr(sub_48C8D0), urmem::hook::type::call, 5);



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

sc6ut 01.03.2021 20:05

C++:





Код:

urmem
::
hook hk
;
int
__cdecl
sub_48C8D0
(
char
*
format
,
char
argList
)
{
return
urmem
::
call_function

(
hk
.
get_original_addr
(
)
,
format
,
argList
)
;
}
hk
.
install
(
0x48C8D0
,
urmem
::
get_func_addr
(
&
sub_48C8D0
)
,
urmem
::
hook
::
type
::
jmp
,
5
)
;



вроде так, если это конечно не функция какого-то модуля, если это так, то надо брать от него оффсет (reinterpret_cast(GetModuleHandleA("имя модуля")) + 0x48C8D0)

legendabrn 01.03.2021 20:15

Цитата:

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

C++:





Код:

urmem
::
hook hk
;
int
__cdecl
sub_48C8D0
(
char
*
format
,
char
argList
)
{
return
urmem
::
call_function

(
hk
.
get_original_addr
(
)
,
format
,
argList
)
;
}
hk
.
install
(
0x48C8D0
,
urmem
::
get_func_addr
(
&
sub_48C8D0
)
,
urmem
::
hook
::
type
::
jmp
,
5
)
;



вроде так, если это конечно не функция какого-то модуля, если это так, то надо брать от него оффсет (reinterpret_cast(GetModuleHandleA("имя модуля")) + 0x48C8D0)

инжектится в обычный процесс, и изменяет в самом процессе, а не в модуле

sc6ut 01.03.2021 21:17

тогда пробуй то что я тебе скинул.

legendabrn 01.03.2021 21:22

Цитата:

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

тогда пробуй то что я тебе скинул.

ты мне скинул для модуля, мне не нужен модуль

sc6ut 01.03.2021 21:28

где

legendabrn 01.03.2021 21:29

Цитата:

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

где

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

sc6ut 01.03.2021 21:31

перечитай что я написал, я тебе написал исправленный код и написал что делать, если функция относится к какому-либо модулю, а не самому приложению.

legendabrn 01.03.2021 21:32

Цитата:

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

перечитай что я написал, я тебе написал исправленный код и написал что делать, если функция относится к какому-либо модулю, а не самому приложению.

перечитай что я тебе написал, я инжектирую дллку в обычный процесс, моя дллка хукает функцию НЕ МОДУЛЯ, а процесса

на минхуке идеально работает, и не нужен никакой "код модуля", мне интересен принцип для юрмема на данный момент

sc6ut 01.03.2021 21:35

так я тебе блять и написал код не для модуля, емае.

legendabrn 01.03.2021 21:37

Цитата:

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

так я тебе блять и написал код не для модуля, емае.

где блин
https://forum.antichat.xyz/attachments/27681904/

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

sc6ut 01.03.2021 21:40

ты хотя бы читал, что я пишу. я написал, что если функция НЕ ЯВЛЯЕТСЯ частью модуля, то ВОТ ТАК.

legendabrn 01.03.2021 21:54

Цитата:

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

так я тебе блять и написал код не для модуля, емае.

а ок извини

не обратил внимание на код выше, думал процитировал моё сообщение и все

legendabrn 01.03.2021 22:27

@SC6UT, а как быть с фасткаллом, сможешь привести пример?

sc6ut 01.03.2021 22:33

Цитата:

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

@SC6UT, а как быть с фасткаллом, сможешь привести пример?

тебе надо хукнуть именно fastcall функцию или все же thiscall?

legendabrn 01.03.2021 22:34

Цитата:

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

тебе надо хукнуть именно fastcall функцию или все же thiscall?

thiscall, но на минхуке использовал fastcall

sc6ut 01.03.2021 23:31

Цитата:

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

thiscall, но на минхуке использовал fastcall

покажу на примере функции гташки CWeapon::Fire
Код:

bool CWeapon::Fire(CEntity *, CVector *, CVector *, CEntity *, CVector *, CVector *)
я не проверял, так как не могу сейчас, но вроде как вот так:

C++:





Код:

urmem
::
hook hkCWeapon_Fire
;
bool
__stdcall
HOOK_CWeapon_Fire
(
void
*
firingEntity
,
void
*
origin
,
void
*
muzzlePosn
,
void
*
targetEntity
,
void
*
target
,
void
*
originForDriveBy
)
{
// берем указатель на класс из регистра ecx
void
*
dis
;
__asm mov dis
,
ecx
// вызываем оригинальную функцию
return
urmem
::
call_function

(
hkCWeapon_Fire
.
get_original_addr
(
)
,
dis
,
firingEntity
,
origin
,
muzzlePosn
,
targetEntity
,
target
,
originForDriveBy
)
;
}
hkCWeapon_Fire
.
install
(
0x742300
,
urmem
::
get_func_addr
(
&
HOOK_CWeapon_Fire
)
,
urmem
::
hook
::
type
::
jmp
,
5
)
;


kin4stat 01.03.2021 23:35

Цитата:

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

покажу на примере функции гташки CWeapon::Fire
Код:

CWeapon::Fire(CEntity *, CVector *, CVector *, CEntity *, CVector *, CVector *)
я не проверял, так как не могу сейчас, но вроде как вот так:

C++:





Код:

urmem
::
hook hkCWeapon_Fire
;
bool
__stdcall
HOOK_CWeapon_Fire
(
void
*
firingEntity
,
void
*
origin
,
void
*
muzzlePosn
,
void
*
targetEntity
,
void
*
target
,
void
*
originForDriveBy
)
{
// берем указатель на класс из регистра ecx
void
*
dis
;
__asm mov dis
,
ecx
// вызываем оригинальную функцию
return
urmem
::
call_function

(
hkCWeapon_Fire
.
get_original_addr
(
)
,
firingEntity
,
origin
,
muzzlePosn
,
targetEntity
,
target
,
originForDriveBy
)
;
}
hkCWeaponFire
.
install
(
0x742300
,
urmem
::
get_func_addr
(
&
HOOK_CWeapon_Fire
)
,
urmem
::
hook
::
type
::
jmp
,
5
)
;



не проще фастколл и EDX? да и stdcall вроде только через стек передает если это не функция класса явно объявленная как stdcall

sc6ut 01.03.2021 23:40

Цитата:

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

не проще фастколл и EDX? да и stdcall вроде только через стек передает если это не функция класса явно объявленная как stdcall

а какая разница как реализовать? через аргументы получил все что идёт в стеке, а потом достал указатель на класс вручную.

kin4stat 01.03.2021 23:40

Цитата:

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

а какая разница как реализовать? через аргументы получил все что идёт в стеке, а потом достал указатель на класс вручную.

inline asm ломает оптимизатор компилятора

sc6ut 01.03.2021 23:43

Цитата:

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

inline asm ломает оптимизатор компилятора

а, понял, ну тогда действительно лучше так:

C++:





Код:

urmem
::
hook hkCWeapon_Fire
;
bool
__fastcall
HOOK_CWeapon_Fire
(
void
*
dis
,
void
*
EDX
,
void
*
firingEntity
,
void
*
origin
,
void
*
muzzlePosn
,
void
*
targetEntity
,
void
*
target
,
void
*
originForDriveBy
)
{
// вызываем оригинальную функцию
return
urmem
::
call_function

(
hkCWeapon_Fire
.
get_original_addr
(
)
,
dis
,
firingEntity
,
origin
,
muzzlePosn
,
targetEntity
,
target
,
originForDriveBy
)
;
}
hkCWeapon_Fire
.
install
(
0x742300
,
urmem
::
get_func_addr
(
&
HOOK_CWeapon_Fire
)
,
urmem
::
hook
::
type
::
jmp
,
5
)
;



Время: 01:40