
15.02.2019, 20:06
|
|
Участник форума
Регистрация: 13.03.2016
Сообщений: 242
С нами:
5351007
Репутация:
0
|
|
Сделано для тех кто не любит таскать за собой целые библиотеки хуков.
Благодаря возможности указывать размер пролога, можно хукать как WIN API так и пользовательские функции.
Присутствует трамплин.
Сообщение от Спойлер
C++:
[CODE]
DWORD
MakeJump
(
DWORD jmp_address
,
DWORD hookAddr
,
byte
*
prologue
,
size_t prologue_size
)
{
DWORD old_prot
=
0x0
;
if
(
prologue
==
nullptr
)
return
0x0
;
VirtualProtect
(
(
void
*
)
jmp_address
,
prologue_size
,
PAGE_EXECUTE_READWRITE
,
&
old_prot
)
;
memcpy
(
prologue
,
(
void
*
)
jmp_address
,
prologue_size
)
;
byte addrToBytes
[
5
]
=
{
0xE9
,
0x90
,
0x90
,
0x90
,
0x90
}
;
DWORD JMPBytes
=
(
hookAddr
-
jmp_address
-
5
)
;
memcpy
(
&
addrToBytes
[
1
]
,
&
JMPBytes
,
4
)
;
memcpy
(
(
void
*
)
jmp_address
,
addrToBytes
,
5
)
;
PVOID Trampoline
=
VirtualAlloc
(
0
,
(
5
+
(
prologue_size
-
5
)
)
,
MEM_COMMIT
|
MEM_RESERVE
,
PAGE_EXECUTE_READWRITE
)
;
byte TrampolineBytes
[
5
]
=
{
0xE9
,
0x90
,
0x90
,
0x90
,
0x90
}
;
if
(
prologue_size
>
5
)
{
byte nop
[
]
=
{
0x90
}
;
for
(
byte x
=
0
;
x
Пример установки и удаления хука
C++:
Код:
DWORD Trampoline
=
0x0
;
byte prologue
[
5
]
;
void
__stdcall
UserHook
(
DWORD access
,
BOOL inherit
,
DWORD procID
)
{
printf
(
"Hooked: %d\n"
,
procID
)
;
__asm jmp Trampoline
}
void
InstallAndDeleteHook
(
)
{
DWORD Addr
=
(
DWORD
)
GetProcAddress
(
GetModuleHandleA
(
"kernel32.dll"
)
,
"OpenProcess"
)
;
Trampoline
=
MakeJump
(
Addr
,
(
DWORD
)
&
UserHook
,
prologue
,
5
)
;
// Устанавливаем
RestorePrologue
(
Addr
,
prologue
,
5
)
;
// Удаляем
}
Автор: ЯedЯuM
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|