PDA

Просмотр полной версии : urmem hook


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
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
01.03.2021, 21:28
где

legendabrn
01.03.2021, 21:29
где



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

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

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


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

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

sc6ut
01.03.2021, 21:35
так я тебе блять и написал код не для модуля, емае.

legendabrn
01.03.2021, 21:37
так я тебе блять и написал код не для модуля, емае.


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

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

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

legendabrn
01.03.2021, 21:54
так я тебе блять и написал код не для модуля, емае.


а ок извини

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

legendabrn
01.03.2021, 22:27
@SC6UT (https://www.blast.hk/members/406860/), а как быть с фасткаллом, сможешь привести пример?

sc6ut
01.03.2021, 22:33
@SC6UT (https://www.blast.hk/members/406860/), а как быть с фасткаллом, сможешь привести пример?


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

legendabrn
01.03.2021, 22:34
тебе надо хукнуть именно fastcall функцию или все же thiscall?


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

sc6ut
01.03.2021, 23:31
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
покажу на примере функции гташки 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
не проще фастколл и EDX? да и stdcall вроде только через стек передает если это не функция класса явно объявленная как stdcall


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

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


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

sc6ut
01.03.2021, 23:43
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
)
;