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

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

Репутация: 183


По умолчанию

  1. Создание ASI-плагина с нуля
  2. Хуки – что это такое и как с ними работать
  3. Безопасная инициализация и работа с SAMP
  4. Работа с рендером и Directx9
  5. Обработка событий окна + ImGui

В этом гайде будет рассказано как инициализироваться без потоков, а также как работать с SAMP'ом

При использовании на других ресурсах необходимо указание авторства и ссылки на оригинальную темы!

Все действия производились на Visual Studio 2019 с параметром
Код:
/std:c++17
, в других версиях интерфейс может отличаться.

И так, начнем:

Создаем новый проект, настраиваем его.

В свойствах проекта, в вкладке общие, стандарт языка C++ ставим /std:c++17

Добавляем sampapi в наш проект:

Первый способ:

  1. В верхнем меню жмем Git -> Создать репозиторий Git(Create git repository)
  2. В открывшемся окне выбираем либо github репозиторий, либо локальный репозиторий и жмем Создать.
  3. Снова жмем Git -> Открыть в командной строке (Open in command line).
  4. В консоли пишем
    Код:
    git submodule add https://github.com/BlastHackNet/SAMP-API.git
  5. Ждем завершения операции и далее жмем Файл(File) -> Добавить(Add) -> Существующий проект (Existing projeect). Открываем папку с нашим проектом, заходим в папку SAMP-API и выбираем sampapi.vcxproj.
  6. Открываем настройки проекта, выбираем C/C++ -> Общие -> Дополнительные каталоги включаемых файлов(Additional directories of included files). Жмем изменить

    В открывшемся окне жмем на иконку файла со звездочкой, и жмем на появившуюся кнопку
    Код:
    ...
    Переходим в директорию
    Код:
    path_to_project\SAMP-API\include
    и жмем выбор папки.
  7. Переходим в настройки проекта
    Код:
    sampapi


    Набор инструментов платформы(Build tools) - выбираем свое(у меня это v142

    Версия пакета SDK для Windows - выбираем свое(у меня это 10.0)
  8. Заходим в настройки нашего основного проекта, Компоновщик(Linker) -> Дополнительные каталоги библиотек(Additional library directories)

    Повторяем те же самые операции что в шаге 6, но выбираем папку
    Код:
    path_to_project\SAMP-API\build\bin
  9. Далее переходим в вкладку Ввод(Input) и в поле Дополнительные зависимости(Additional dependecies) в начало вписываем
    Код:
    Release\sampapi.lib;
    для Release конфигурации проект, и
    Код:
    Debug\sampapi.lib;
    . Точка с запятой ОБЯЗАТЕЛЬНА
  10. Жмем правой кнопкой по проекту sampapi, Только проект -> Собрать только sampapi(делаем это для Release и Debug конфигураций)
Второй способ:

Скачиваем репозиторий, распаковываем по пути
Код:
path_to_project
Повторяем шаги 5-10 из первого способа.

Готово, мы подключили sampapi

Теперь добавим библиотеку для хуков в наш проект:

Начну свое описание с подключения моей библиотеки для хуков - kthook
  1. Скачиваем kthook из репозитория и распаковываем в себе в папку с кодом(Пкм по проекту -> открыть папку в проводнике).

    Папку tests перекидывать к себе не нужно.
  2. Скачиваем ktsignal из репозитория и распаковываем содержимое
    Код:
    ktsignal-master
    в папку
    Код:
    kthook\ktsignal
  3. Жмем показать все файлы

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




    ПКМ по папке kthook -> Включить в проект
  4. Т.к. мы не используем CMake, тогда мы должны вручную переназначить все зависимости для kthook
  5. Добавляем папку kthook в Дополнительные каталоги включаемых файлов(Additional directories of included files) (как в шаге 6 у sampapi)
  6. В kthook.hpp изменяем
    Код:
    #include "ktsignal/ktsignal.hpp"
    на
    Код:
    #include "ktsignal/include/ktsignal/ktsignal.hpp"
  7. Также ради собственного удобства добавляем
    Код:
    kthook/include
    Дополнительные каталоги включаемых файлов(Additional directories of included files)

Вместо kthook могу посоветовать вам SRHook либо MinHook

SRHook подключается также как и kthook, MinHook можно подключить также двумя способами, как и sampapi.

Но я рекомендую установить его через vcpkg.
Код:
vcpkg install minhook
И теперь перейдем к написанию кода:

SAMP инициализирует свои структуры в вызове
Код:
CHud::DrawRadar
, поэтому мы перехватим эту функцию, и после ее вызова будем уверены что самп инициализировался.

Для инициализации плагина лично я обычно использую хук на
Код:
CTimer::Update
Цитата:
Сообщение от Спойлер  


C++:





Код:
using
CTimer__Update
=
void
(
__cdecl
*
)
(
)
;
void
*
func_addr
=
reinterpret_cast

(
0x561B10
)
;


Создаем хук:

C++:





Код:
#include "kthook/kthook.hpp"
using
CHud__DrawRadar
=
void
(
__cdecl
*
)
(
)
;
// Прототип CHud::DrawRadar
kthook
::
kthook_simple_t

samp_init_hook
{
reinterpret_cast

(
0x58A330
)
}
;
// хук на CHud::DrawRadar


Создаем функцию-коллбэк для хука:

C++:





Код:
#include "sampapi/CChat.h"
void
HOOK_after_samp_init
(
)
{
static
bool
inited
=
false
;
// переменная инициализации
namespace
samp
=
sampapi
::
v037r3
;
// Ваша версия сампа, у меня это 037r3
if
(
!
inited
&&
samp
::
RefChat
(
)
!=
nullptr
)
{
// если еще не инициализировались, и чат сампа уже инициализировался
samp
::
RefChat
(
)
->
AddMessage
(
0xFFFFFFFF
,
"Этот текст выведен после инициализации сампа"
)
;
// Выводим сообщение
samp
::
RefChat
(
)
->
m_debugColor
=
0xFFFF0000
;
// Меняем цвет системных сообщений сампа на красный
inited
=
true
;
// отмечаем что иницализировались
}
}


Код:
samp::RefChat()
аналогичен
Код:
SF->getSAMP()->getChat()
Подключаем нашу функцию к хуку:

C++:





Код:
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD ul_reason_for_call
,
LPVOID lpReserved
)
{
switch
(
ul_reason_for_call
)
{
case
DLL_PROCESS_ATTACH
:
DisableThreadLibraryCalls
(
hModule
)
;
samp_init_hook
.
after
.
connect
(
HOOK_after_samp_init
)
;
// Подключаем нашу функцию-коллбэк после вызова CHud::DrawRadar
break
;
case
DLL_PROCESS_DETACH
:
break
;
}
return
TRUE
;
}


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


C++:





Код:
#include 
#include "sampapi/CChat.h"
#include "kthook/kthook.hpp"
using
CHud__DrawRadar
=
void
(
__cdecl
*
)
(
)
;
// Прототип CHud::DrawRadar
kthook
::
kthook_simple_t

samp_init_hook
{
reinterpret_cast

(
0x58A330
)
}
;
// хук на CHud::DrawRadar
void
HOOK_after_samp_init
(
)
{
static
bool
inited
=
false
;
// переменная инициализации
namespace
samp
=
sampapi
::
v037r3
;
// Ваша версия сампа, у меня это 037r3
if
(
!
inited
&&
samp
::
RefChat
(
)
!=
nullptr
)
{
// если еще не инициализировались, и чат сампа уже инициализировался
samp
::
RefChat
(
)
->
AddMessage
(
0xFFFFFFFF
,
"Этот текст выведен после инициализации сампа"
)
;
// Выводим сообщение
samp
::
RefChat
(
)
->
m_debugColor
=
0xFFFF0000
;
// Меняем цвет системных сообщений сампа на красный
inited
=
true
;
// отмечаем что иницализировались
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD ul_reason_for_call
,
LPVOID lpReserved
)
{
switch
(
ul_reason_for_call
)
{
case
DLL_PROCESS_ATTACH
:
DisableThreadLibraryCalls
(
hModule
)
;
samp_init_hook
.
after
.
connect
(
HOOK_after_samp_init
)
;
// Подключаем нашу функцию-коллбэк после вызова CHud::DrawRadar
break
;
case
DLL_PROCESS_DETACH
:
break
;
}
return
TRUE
;
}


Компилируем, запускаем и видим:

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




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

  #2  
Старый 12.09.2021, 22:24
etereon
Постоянный
Регистрация: 08.03.2016
Сообщений: 332
С нами: 5358262

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

Надеюсь, что всё не закончится на 3-ем уроке как обычно

1631471083580.pngetereon · 12 Сен 2021 в 21:24' data-fancybox="lb-post-841058" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/114055/" style="cursor: pointer;" title="1631471083580.png">
 
Ответить с цитированием

  #3  
Старый 12.09.2021, 23:18
loganhackerdff
Постоянный
Регистрация: 24.07.2017
Сообщений: 867
С нами: 4633764

Репутация: 148


По умолчанию

simple хук чё сам после первого вызова убирается? надо бы после инициализации убрать хук
 
Ответить с цитированием

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

Репутация: 183


По умолчанию

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

simple хук чё сам после первого вызова убирается? надо бы после инициализации убрать хук
static bool inited же

Внутри самого слота нельзя делать дисконнект, т.к. это удаляет текущий итератор, в следовательно и при итерации все сломается
 
Ответить с цитированием

  #5  
Старый 13.09.2021, 00:40
loganhackerdff
Постоянный
Регистрация: 24.07.2017
Сообщений: 867
С нами: 4633764

Репутация: 148


По умолчанию

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

static bool inited же
Внутри самого слота нельзя делать дисконнект, т.к. это удаляет текущий итератор, в следовательно и при итерации все сломается
это то да, но зачем, можно же просто убрать хук после инициализации
 
Ответить с цитированием

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

Репутация: 183


По умолчанию

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

это то да, но зачем, можно же просто убрать хук после инициализации
И вероятно еще снести цепочку вызовов вместе с собой. Хорошее решение
 
Ответить с цитированием

  #7  
Старый 13.09.2021, 01:00
ARMOR
Флудер
Регистрация: 02.02.2019
Сообщений: 5,070
С нами: 3831395

Репутация: 183


По умолчанию

Новый гайд, по новой делать вид как будто я все понял и просто переписывать код в VS и думать что я пиздец програмист после того как код заработал
 
Ответить с цитированием

  #8  
Старый 13.09.2021, 16:43
etereon
Постоянный
Регистрация: 08.03.2016
Сообщений: 332
С нами: 5358262

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

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

Надеюсь, что всё не закончится на 3-ем уроке как обычно
Вот мы смеемся, а 4-о гайда реально не будет, ведь моё сообщение собрало лайков больше, чем сам урок...

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

  #9  
Старый 20.11.2021, 16:58
ччбчлчлчъ ччччшчьпьппзвжв
Постоянный
Регистрация: 16.08.2020
Сообщений: 553
С нами: 3022568

Репутация: 68


По умолчанию

можно пожалуста проект, ничего не получается :сссссссссссссссссссссссс сссссссссссссссссссссссс ссссссс
 
Ответить с цитированием

  #10  
Старый 20.11.2021, 18:55
sc6ut
Постоянный
Регистрация: 03.05.2020
Сообщений: 385
С нами: 3174020

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

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

можно пожалуста проект, ничего не получается :сссссссссссссссссссссссс сссссссссссссссссссссссс ссссссс
если не получается, то проект тут не поможет
 
Ответить с цитированием
Ответ





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


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




ANTICHAT ™ © 2001- Antichat Kft.