ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   HOOKS (https://forum.antichat.xyz/showthread.php?t=1312462)

SR_team 05.05.2016 18:17

UPD 23.10.2017: Ну и УГ, не юзайте это. Лучше тащите хуки из этого шаблона: Prime-Hack | AsiPlugin(https://dl.prime-hack.net/AsiPlugin/)

Написал небольшой класс для управления хуками.

Функции класса:

Цитата:

Сообщение от Спойлер

Поиск участка кода, по его части.

Использование:

Код:





Код:

DWORD ret = FindPattern(DWORD dwAddress, DWORD dwLen, BYTE *bMask, char * szMask)


где dsAddress - начальный аддрес поиска. Например GetModuleHandle(samp.dll), для поиска функций в samp.dll

dwLen - размер адресного пространство (как далеко искать). Например для поиска статичных функций в samp.dll, можно указать ее размер.

bMask - часть кода искомой функции

szMask - маска кода (x - байт должен быть такой же как в bMask, ? - байт может быть любой)

ret - адрес искомого участка кода

Цитата:

Сообщение от Спойлер

Создает хук.

Использование:

Код:





Код:

DWORD ret = CreateHOOK(DWORD dwAddress, DWORD dwFunc, TypeHOOK type, size_t len)


где dwAddress - адрес кода, на который необходимо поставить хук.

dwFunc - функция на которую будет ссылаться хук

type - тип хука
  • Jump - обычный переход, оригинальный код будет вызываться после выхода из вашей функции
  • Call - вызов вашей функции, оригинальный код не будет вызываться после выхода из вашей функции
  • Call_s - вызов вашей функции, оригинальный код будет вызываться после выхода из вашей функции
len - количество заменяемых байт (не меньше 5)

ret - адрес выхода из функции, у Jump хуков в конце должен быть переход на этот адрес, для вызова оригинального кода, этот же адрес используется для удаления хука (сделано это в связи с тем, что на 1 адрес можно нацепить несколько хуков)

Цитата:

Сообщение от Спойлер

Удаляет хук.

Использование:

Код:





Код:

bool ret = RemoveHOOK(DWORD dsAddress)


где dwAddress - адрес который вернула функция создания хука

ret - результат операции:
  • false - хук не существует, удален ранее, или создан не через данный класс
  • true - хук успешно удален

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

Весь сок в том, что хуки можно ставить друг на друга, пока не кончится память.

Копиригхт:

функция memcpy_safe и memset_safe взяты из соба

функция поиска участка кода была давно найдена где-то в интернетах, кажется на unkowncheats.me

SR_team 05.05.2016 18:57

HotFix?

Поправил call хуки

Добавил Call_s хук

SR_team 05.05.2016 20:37

Кароч понял, что функция удаления хуков дерьмо:
  1. не освобождается выделеная память
  2. на 1 адрес может быть посажено несколько хуков
В связи с этим обнова, в которой это исправленно:
  1. Для удаления хука используется адрес, который вернула функция его создания, что решает проблему удаления части хуков с 1 адреса
  2. При удаление хука освобождается выделенная для него память
  3. изменен порядок удаления хуков - от последнего установленного к первому

Gabriel__ 06.05.2016 13:16

Сделай инициализацию через конструктор. А то у меня компилятор ругается.

Код:





Код:

c:\documents and settings\\мои документы\visual studio 2010\projects\consolemain\consolemain\hooks.hpp(16): error C2864: CHOOKS::VirtFunc::addr: в пределах класса могут быть инициализированы только статические константные данные-члены целого типа
c:\documents and settings\\мои документы\visual studio 2010\projects\consolemain\consolemain\hooks.hpp(17): error C2864: CHOOKS::VirtFunc::len: в пределах класса могут быть инициализированы только статические константные данные-члены целого типа
c:\documents and settings\\мои документы\visual studio 2010\projects\consolemain\consolemain\hooks.hpp(18): error C2864: CHOOKS::VirtFunc::rehook: в пределах класса могут быть инициализированы только статические константные данные-члены целого типа
c:\documents and settings\\мои документы\visual studio 2010\projects\consolemain\consolemain\hooks.hpp(19): error C2864: CHOOKS::VirtFunc::Call_s: в пределах класса могут быть инициализированы только статические константные данные-члены целого типа


SR_team 06.05.2016 17:40

Цитата:

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

Сделай инициализацию через конструктор. А то у меня компилятор ругается.

Код:





Код:

c:\documents and settings\\мои документы\visual studio 2010\projects\consolemain\consolemain\hooks.hpp(16): error C2864: CHOOKS::VirtFunc::addr: в пределах класса могут быть инициализированы только статические константные данные-члены целого типа
c:\documents and settings\\мои документы\visual studio 2010\projects\consolemain\consolemain\hooks.hpp(17): error C2864: CHOOKS::VirtFunc::len: в пределах класса могут быть инициализированы только статические константные данные-члены целого типа
c:\documents and settings\\мои документы\visual studio 2010\projects\consolemain\consolemain\hooks.hpp(18): error C2864: CHOOKS::VirtFunc::rehook: в пределах класса могут быть инициализированы только статические константные данные-члены целого типа
c:\documents and settings\\мои документы\visual studio 2010\projects\consolemain\consolemain\hooks.hpp(19): error C2864: CHOOKS::VirtFunc::Call_s: в пределах класса могут быть инициализированы только статические константные данные-члены целого типа



Возьми да сделай сам, ты же сурс качаешь

Gabriel__ 06.05.2016 18:29

Если бы у меня получилось я бы не писал о проблеме.

SR_team 06.05.2016 19:11

Цитата:

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

Если бы у меня получилось я бы не писал о проблеме.

Если бы у меня была такая же ощибка, то я мог бы ее исправить

Gabriel__ 07.05.2016 12:07

Да что там исправлять просто проинициализируй значения по умолчанию для структуры VirtFunc. Не все же могут юзать 2012 студию хотя бы. И еще подключи Windows.h прям в свой файл и ты не добавил защиту от подключения #pragma once или лучше через #define HOOKS_H дабы на всякий случай внести информацию для других хидеров что твой класс включен.

SR_team 07.05.2016 12:26

Цитата:

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

Да что там исправлять просто проинициализируй значения по умолчанию для структуры VirtFunc. Не все же могут юзать 2012 студию хотя бы. И еще подключи Windows.h прям в свой файл и ты не добавил защиту от подключения #pragma once или лучше через #define HOOKS_H дабы на всякий случай внести информацию для других хидеров что твой класс включен.

Я хотел поделиться конкретно кодом, если бы я хотел сделать его юзерабельным, то я бы замутил либу

Gabriel__ 07.05.2016 16:42

Покажи простой пример как пользоваться на примере простой функции. Просто я хз как должен выглядить сам хук что должен принимать в аргументах переменную или указатель ? Что должен возвращать ? Должен ли там быть _stdcall ?


Время: 08:17