 |
|

05.05.2016, 18:17
|
|
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами:
6603505
Репутация:
183
|
|
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
|
|
|

05.05.2016, 18:57
|
|
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами:
6603505
Репутация:
183
|
|
HotFix?
Поправил call хуки
Добавил Call_s хук
|
|
|

05.05.2016, 20:37
|
|
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами:
6603505
Репутация:
183
|
|
Кароч понял, что функция удаления хуков дерьмо:
- не освобождается выделеная память
- на 1 адрес может быть посажено несколько хуков
В связи с этим обнова, в которой это исправленно:
- Для удаления хука используется адрес, который вернула функция его создания, что решает проблему удаления части хуков с 1 адреса
- При удаление хука освобождается выделенная для него память
- изменен порядок удаления хуков - от последнего установленного к первому
|
|
|

06.05.2016, 13:16
|
|
Постоянный
Регистрация: 23.06.2015
Сообщений: 411
С нами:
5731627
Репутация:
108
|
|
Сделай инициализацию через конструктор. А то у меня компилятор ругается.
Код:
Код:
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: в пределах класса могут быть инициализированы только статические константные данные-члены целого типа
|
|
|

06.05.2016, 17:40
|
|
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами:
6603505
Репутация:
183
|
|
Сообщение от 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: в пределах класса могут быть инициализированы только статические константные данные-члены целого типа
Возьми да сделай сам, ты же сурс качаешь
|
|
|

06.05.2016, 18:29
|
|
Постоянный
Регистрация: 23.06.2015
Сообщений: 411
С нами:
5731627
Репутация:
108
|
|
Если бы у меня получилось я бы не писал о проблеме.
|
|
|

06.05.2016, 19:11
|
|
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами:
6603505
Репутация:
183
|
|
Сообщение от Gabriel__
Если бы у меня получилось я бы не писал о проблеме.
Если бы у меня была такая же ощибка, то я мог бы ее исправить
|
|
|

07.05.2016, 12:07
|
|
Постоянный
Регистрация: 23.06.2015
Сообщений: 411
С нами:
5731627
Репутация:
108
|
|
Да что там исправлять просто проинициализируй значения по умолчанию для структуры VirtFunc. Не все же могут юзать 2012 студию хотя бы. И еще подключи Windows.h прям в свой файл и ты не добавил защиту от подключения #pragma once или лучше через #define HOOKS_H дабы на всякий случай внести информацию для других хидеров что твой класс включен.
|
|
|

07.05.2016, 12:26
|
|
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами:
6603505
Репутация:
183
|
|
Сообщение от Gabriel__
Да что там исправлять просто проинициализируй значения по умолчанию для структуры VirtFunc. Не все же могут юзать 2012 студию хотя бы. И еще подключи Windows.h прям в свой файл и ты не добавил защиту от подключения #pragma once или лучше через #define HOOKS_H дабы на всякий случай внести информацию для других хидеров что твой класс включен.
Я хотел поделиться конкретно кодом, если бы я хотел сделать его юзерабельным, то я бы замутил либу
|
|
|

07.05.2016, 16:42
|
|
Постоянный
Регистрация: 23.06.2015
Сообщений: 411
С нами:
5731627
Репутация:
108
|
|
Покажи простой пример как пользоваться на примере простой функции. Просто я хз как должен выглядить сам хук что должен принимать в аргументах переменную или указатель ? Что должен возвращать ? Должен ли там быть _stdcall ?
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|