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

  #1  
Старый 03.07.2021, 09:28
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

HHelper (x86)​Небольшая библиотека для упрощения работы с хуками при выгрузке.

Больше не нужно заботиться о снятии хуков

Библиотека имеет настраеваемые типы для вызова оригинальной функции, и функции трамплина. Перед трамплином можно выделить немного памяти для некоторых манипуляций.

Немного примеров кода:​

Хук обычной функции:





Код:
static
HookHelper
helper
(
&
HookFunction
)
;
MH_CreateHook
(
functionPointer
,
helper
.
GetInstructionPointer
(
)
,
&
Trampoline
)
;
MH_EnableHook
(
functionPointer
)
;
helper
.
SetTrampoline
(
Trampoline
)
;


Output:





Код:
jmp 01C42C0A
jmp 01910FE0
jmp ASIPlugin.asi+11168


В данном случае после опкода вызова функции ret будет поставлен автоматически:

WNDPROC:





Код:
WNDPROC m_pWindowProc
;
LRESULT __stdcall
WndProcHandler
(
HWND hWnd
,
UINT msg
,
WPARAM wParam
,
LPARAM lParam
)
{
return
CallWindowProcA
(
m_pWindowProc
,
hWnd
,
msg
,
wParam
,
lParam
)
;
}
void
InstallWndProcHook
(
)
{
static
HookHelper
helper
(
&
WndProcHandler
,
CallType
::
JMP
,
CallType
::
CALL
)
;
m_pWindowProc
=
reinterpret_cast

(
SetWindowLongW
(
hWnd
,
GWL_WNDPROC
,
reinterpret_cast

(
helper
.
GetInstructionPointer
(
)
)
)
)
;
helper
.
SetTrampoline
(
GetProcAddress
(
GetModuleHandleA
(
"user32.dll"
)
,
"CallWindowProcA"
)
,
CallWindowProcA
,
1
)
;
helper
.
PushBytesRightBeforeCall
(
'\x68'
)
;
// Opcode::PUSH
helper
.
PushBytesRightBeforeCall
(
m_pWindowProc
)
;
}


WNDPROC:





Код:
WNDPROC m_pWindowProc
;
LRESULT __stdcall
WndProcHandler
(
HWND hWnd
,
UINT msg
,
WPARAM wParam
,
LPARAM lParam
)
{
return
CallWindowProcA
(
m_pWindowProc
,
hWnd
,
msg
,
wParam
,
lParam
)
;
}
void
InstallWndProcHook
(
)
{
const
char
Pushes
[
]
=
{
"\xFF\x74\x24\x10"
// push [esp + 0x10]
"\xFF\x74\x24\x10"
// push [esp + 0x10]
"\xFF\x74\x24\x10"
// push [esp + 0x10]
"\xFF\x74\x24\x10"
// push [esp + 0x10]
"\x68"
}
;
// push
auto
push_size
=
sizeof
(
Pushes
)
-
1
;
static
HookHelper
helper
(
&
WndProcHandler
,
push_size
+
5
,
Pushes
,
push_size
,
CallType
::
JMP
,
CallType
::
CALL
)
;
auto
HandlerPointer
=
reinterpret_cast

(
helper
.
GetInstructionPointer
(
)
)
)
;
m_pWindowProc
=
reinterpret_cast

(
SetWindowLongW
(
hWnd
,
GWL_WNDPROC
,
HandlerPointer
)
;
helper
.
SetAdditionalBytes
(
m_pWindowProc
)
;
helper
.
SetTrampoline
(
GetProcAddress
(
GetModuleHandleA
(
"user32.dll"
)
,
"CallWindowProcA"
)
)
;
}


Output:





Код:
jmp 132EC420
push [esp+10]
push [esp+10]
push [esp+10]
push [esp+10]
push ___mainthing.asi+2430
call USER32.CallWindowProcA
ret
jmp ASIPlugin.asi+113E8


Небольшое описание методов:​Конструктор
Код:
HookHelper
- Принимает указатель на функцию для которой создается прослойка, и типы вызовов для функции на которую создается прослойка и функции-трамплина

Код:
GetInstructionPointer
- Создает в памяти саму прослойку, ее нужно использовать вместо функции, которую вы хотели использовать вместо хука

Код:
SetTrampoline
- Ставит прыжок на функцию-трамплин, имеет перегрузку которая принимает прототип функции и количество аргументов которые вы будете обрабатывать самостоятельно. Прототип функции нужен для автоматической генерации кода пробрасывающего аргументы в трамплин.

manual_args_count - количество аргументов которое будет обработано вами. Можно увидеть использование во втором примере.

Код:
PushBytesRightBeforeCall
- передает ваши данные в прослойку ПРЯМО перед вызовом. Имеет две перегрузки, одна принимает массив байт и его размер, вторая - любые данные. Использование можно увидеть во втором примере

Код:
PushBytesBeforeCall
- передает ваши данные в прослойку перед вызовом, но не гаратируется что они будут расположены непосредственно перед вызовом, имеет такие же две перегрузки как и PushBytesRightBeforeCall.

Как это работает?​Библиотека создает код-прослойку. До отгрузки будет производиться прыжок в оригинальную функцию, после отгрузки - в трамплин.

Download & Source:

KiN4StAt/HHelper

Contribute to KiN4StAt/HHelper development by creating an account on GitHub.

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

  #2  
Старый 04.07.2021, 13:29
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

Обновил.

Добавил документацию в самом коде, и на форуме.

Также небольшие улучшения в коде, ну а также более удобный интерфейс. Теперь пробрасывать функции стало еще удобнее. Сравнить можно в примерах WNDPROC
 
Ответить с цитированием
Ответ





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


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




ANTICHAT ™ © 2001- Antichat Kft.

×

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

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

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

Сумма USDT:

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

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

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

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

×

Мои сделки

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

Сделка


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