ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Безопасная инициализация и работа с SAMP [3] (https://forum.antichat.xyz/showthread.php?t=1401433)

kin4stat 12.09.2021 20:42

  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
;
}




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

Цитата:

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


etereon 12.09.2021 22:24

Надеюсь, что всё не закончится на 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">
https://forum.antichat.xyz/attachments/27841058/

loganhackerdff 12.09.2021 23:18

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

kin4stat 13.09.2021 00:40

Цитата:

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

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

static bool inited же

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

loganhackerdff 13.09.2021 00:40

Цитата:

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

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

это то да, но зачем, можно же просто убрать хук после инициализации

kin4stat 13.09.2021 00:45

Цитата:

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

это то да, но зачем, можно же просто убрать хук после инициализации

И вероятно еще снести цепочку вызовов вместе с собой. Хорошее решение

ARMOR 13.09.2021 01:00

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

etereon 13.09.2021 16:43

Цитата:

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

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

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

https://forum.antichat.xyz/attachments/27841377/

ччбчлчлчъ ччччшчьпьппзвжв 20.11.2021 16:58

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

sc6ut 20.11.2021 18:55

Цитата:

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

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

если не получается, то проект тут не поможет

manukhov 04.01.2022 01:02

Надо добавить, что для первого способа нужно установить Git для Windows в VS Installer

четыреста четыре 07.05.2022 18:17

а тут https://github.com/KiN4StAt/kthook/ преднамеренно папка xbyak при скачке пуста для подрыва пердаков?

sc6ut 07.05.2022 18:39

Цитата:

Сообщение от четыреста четыре

а тут https://github.com/KiN4StAt/kthook/ преднамеренно папка xbyak при скачке пуста для подрыва пердаков?

я бы назвал это защитой от долбаебов, которые бросаются что то делать не научившись пользоваться базовыми вещами. почитай про гит братишка)

Grinyov 24.05.2022 13:11

1653383481412.pngGrinyov · 24 Май 2022 в 12:11' data-fancybox="lb-post-1047125" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/149417/" style="cursor: pointer;" title="1653383481412.png">
https://forum.antichat.xyz/attachments/28047125/

Делал как надо, но тут какая-то херня. ПАМАГИТИ

ya_noob 29.03.2023 14:23

почему папка xbyak пуста, хотя от xbyak.h многое зависит (файл которого нет)?

Цитата:

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

почему папка xbyak пуста, хотя от xbyak.h многое зависит (файл которого нет)?

Скачал с репозитория xbyak, закинул содержимое в папку с этим же названием. Все отлично, но есть одна проблема. EO135 пространство имен "kthook" не содержит члена "kthook_simple_t"

EclipsedFlow 29.03.2023 14:54

Цитата:

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

почему папка xbyak пуста, хотя от xbyak.h многое зависит (файл которого нет)?

Скачал с репозитория xbyak, закинул содержимое в папку с этим же названием. Все отлично, но есть одна проблема. EO135 пространство имен "kthook" не содержит члена "kthook_simple_t"

В зависимости от версии kthook'a название методов могут меняться.

ya_noob 29.03.2023 15:05

Цитата:

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

почему папка xbyak пуста, хотя от xbyak.h многое зависит (файл которого нет)?

Скачал с репозитория xbyak, закинул содержимое в папку с этим же названием. Все отлично, но есть одна проблема. EO135 пространство имен "kthook" не содержит члена "kthook_simple_t"

Заметил что в пространствах имен kthook нет члена "kthook_simple_t", но есть "kthook_simple", "kthook_naked", "kthook_option", "kthook_signal". "kthook_simple_t" НЕ существует в природе, убрав t на конце, Visual Studio ругается на "kthook::kthook_simple не содержит члена "after""

Цитата:

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

Заметил что в пространствах имен kthook нет члена "kthook_simple_t", но есть "kthook_simple", "kthook_naked", "kthook_option", "kthook_signal". "kthook_simple_t" НЕ существует в природе, убрав t на конце, Visual Studio ругается на "kthook::kthook_simple не содержит члена "after""

член after находится в kthook_impl.hpp, и в этом самом "kthook_impl.hpp" 231 ошибки, первые ошибки которые увидел это "std::uint32_t", подключил , осталось 126 ошибок. При этом эти ошибки ссылаются на саму Visual Studio. kin4stat решил потроллить?

Почему в kthook_impl.hpp 231 ошибка?

Musaigen 12.04.2023 17:43

Цитата:

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

kthook::kthook_simple не содержит члена "after""

У симпловых хуков нет before/after, кинчстат понасоздавал классов, но не обновил примеры что на гите, что тут

Цитата:

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

Почему в kthook_impl.hpp 231 ошибка?

Потому что не умеешь пользоваться гитом, скорее всего у тебя багается интеллисенс из-за не подключенного ktsignal(скорее всего он не установлен у тебя), больше добавить не могу

ya_noob 18.04.2023 03:42

Цитата:

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

У симпловых хуков нет before/after, кинчстат понасоздавал классов, но не обновил примеры что на гите, что тут

Потому что не умеешь пользоваться гитом, скорее всего у тебя багается интеллисенс из-за не подключенного ktsignal(скорее всего он не установлен у тебя), больше добавить не могу

std 17. ktsignal и xbyak скачал с репозитория, пути к ним указал в настройках проекта, вставил готовый код, ошибка в одном файле, а из него ошибка в другом файле, эффект домино. kthook_simple_t заменил на kthook_simple. Впрочем сделал все по инструкции в гайде, он не работает нормально. SRHook ошибок не выдает.

Musaigen 18.04.2023 22:55

Цитата:

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

std 17. ktsignal и xbyak скачал с репозитория, пути к ним указал в настройках проекта, вставил готовый код, ошибка в одном файле, а из него ошибка в другом файле, эффект домино. kthook_simple_t заменил на kthook_simple. Впрочем сделал все по инструкции в гайде, он не работает нормально. SRHook ошибок не выдает.

ты читаешь вообще?

Цитата:

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

У симпловых хуков нет before/after, кинчстат понасоздавал классов, но не обновил примеры что на гите, что тут


ya_noob 19.04.2023 15:04

Цитата:

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

ты читаешь вообще?

И что мне надо из этого выяснить? Что мне использовать вместо before/after?

Lance_Sterling 11.12.2023 14:33

и где оно

https://forum.antichat.xyz/attachments/28423285/

ARMOR 11.12.2023 18:28

Цитата:

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

и где оно

Теперь самп-апи через CMake собирается.

maksmanus228 26.08.2024 14:56

у меня вылетает ошибка при хуке DrawRadar

CPFire 01.02.2026 17:02

Цитата:

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

Ждем завершения операции и далее жмем Файл(File) -> Добавить(Add) -> Существующий проект (Existing projeect). Открываем папку с нашим проектом, заходим в папку SAMP-API и выбираем sampapi.vcxproj.

1769950045378.pngCPFire · 1 Фев 2026 в 16:02' data-fancybox="lb-post-1657729" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/285914/" style="cursor: pointer;" title="1769950045378.png">
https://forum.antichat.xyz/attachments/28657729/

где эта sampapi?

Цитата:

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

sampapi.vcxproj

нет такого файла ни там ни там


Время: 03:24