HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 15.02.2019, 20:06
ЯedЯuM
Участник форума
Регистрация: 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
 
Ответить с цитированием

  #2  
Старый 15.02.2019, 20:56
Stiopko
Постоянный
Регистрация: 28.02.2018
Сообщений: 307
С нами: 4319022

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

А для чего нужен трамплин?
 
Ответить с цитированием

  #3  
Старый 15.02.2019, 21:20
#Rin
Познавший АНТИЧАТ
Регистрация: 09.08.2015
Сообщений: 1,213
С нами: 5663255

Репутация: 183


По умолчанию

Цитата:
Сообщение от Stiopko  

А для чего нужен трамплин?
Что бы вызывать оригинальную функцию, не снимая хук.
 
Ответить с цитированием

  #4  
Старый 15.02.2019, 21:34
Stiopko
Постоянный
Регистрация: 28.02.2018
Сообщений: 307
С нами: 4319022

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

А для чего нужен пролог?
 
Ответить с цитированием

  #5  
Старый 15.02.2019, 21:44
#Rin
Познавший АНТИЧАТ
Регистрация: 09.08.2015
Сообщений: 1,213
С нами: 5663255

Репутация: 183


По умолчанию

 
Ответить с цитированием

  #6  
Старый 15.02.2019, 22:06
ЯedЯuM
Участник форума
Регистрация: 13.03.2016
Сообщений: 242
С нами: 5351007

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

Цитата:
Сообщение от Stiopko  

А для чего нужен пролог?
Пролог это начало функции (push ebp, mov ebp, esp и тд), Эпилог её конец(перед возвратом).

Само понятие на сколько знаю пришло из ассемблера.

Просто если поставить хук, на прыжок требуется 5 байт, в вин апи почти в каждой стоит в самом начале инструкция mov edi, edi и вместе с push ebp, mov ebp, esp код как раз столько же и весит. А в случае с пользовательскими функциями к примеру, после mov ebp, esp может не быть инструкции размером в два байта, в итоге получится что хук затрёт два байта от той инструкции и она разобьется на другой код который будет уже не валид, возврат трамплином в такой код спровоцирует краш, вот почему нужно учитывать размер пролога функции, потому что инструкции push ebp, mov ebp, esp весят только 3 байта чего не достаточно для jmp инструкции прыжка на хук.

@Stiopko вот пример с пояснением как знать сколько байт указывать в размер пролога



Нам нужно занопить лишний байт, по этому указываем размер хука в 6 байт и тот байт 08 переставит на 90 (nop - ничего не делающая инструкция).



А вот наглядный пример для чего нужен трамплин а он нужен не только для возврата в оригинальную функцию.

 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.

×

Внести депозит

Введите сумму USDT:

Принимается только USDT TRC20. Fake/Flash USDT не засчитывается.

×

Вывести депозит

Сумма USDT:

Ваш USDT TRC20 кошелек:

Заявка будет отправлена администратору. Комиссия форума: 2%.

×

Создать сделку

Продавец: ник или ID

Название сделки:

Сумма USDT:

Срок сделки, дней:

Кто платит комиссию:

Условия сделки:

После создания сделки средства будут зарезервированы в холде до завершения сделки.

×

Мои сделки

Загрузка...
×

Сделка


Загрузка чата...
×

ESCROW ADMIN PANEL

Загрузка...
Загрузка...