PDA

Просмотр полной версии : Безопасная инициализация и работа с SAMP [3]


kin4stat
12.09.2021, 20:42
Создание ASI-плагина с нуля (https://www.blast.hk/threads/89122/)

Хуки – что это такое и как с ними работать (https://www.blast.hk/threads/91079/)

Безопасная инициализация и работа с SAMP (https://www.blast.hk/threads/101433/)

Работа с рендером и Directx9 (https://www.blast.hk/threads/113060/)

Обработка событий окна + ImGui (https://www.blast.hk/threads/115851/)


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

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

Все действия производились на Visual Studio 2019 с параметром

/std:c++17

, в других версиях интерфейс может отличаться.

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

Создаем новый проект, настраиваем (https://www.blast.hk/threads/89122/) его.

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

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

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


В верхнем меню жмем Git -> Создать репозиторий Git(Create git repository)

В открывшемся окне выбираем либо github репозиторий, либо локальный репозиторий и жмем Создать.

Снова жмем Git -> Открыть в командной строке (Open in command line).

В консоли пишем

git submodule add https://github.com/BlastHackNet/SAMP-API.git


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

Открываем настройки проекта, выбираем C/C++ -> Общие -> Дополнительные каталоги включаемых файлов(Additional directories of included files). Жмем изменить

В открывшемся окне жмем на иконку файла со звездочкой, и жмем на появившуюся кнопку

...


Переходим в директорию

path_to_project\SAMP-API\include

и жмем выбор папки.

Переходим в настройки проекта
sampapi


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

Версия пакета SDK для Windows - выбираем свое(у меня это 10.0)

Заходим в настройки нашего основного проекта, Компоновщик(Linker) -> Дополнительные каталоги библиотек(Additional library directories)

Повторяем те же самые операции что в шаге 6, но выбираем папку

path_to_project\SAMP-API\build\bin


Далее переходим в вкладку Ввод(Input) и в поле Дополнительные зависимости(Additional dependecies) в начало вписываем

Release\sampapi.lib;

для Release конфигурации проект, и

Debug\sampapi.lib;

. Точка с запятой ОБЯЗАТЕЛЬНА

Жмем правой кнопкой по проекту sampapi, Только проект -> Собрать только sampapi(делаем это для Release и Debug конфигураций)
Второй способ:

Скачиваем репозиторий (https://github.com/BlastHackNet/SAMP-API), распаковываем по пути

path_to_project


Повторяем шаги 5-10 из первого способа.

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

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

Начну свое описание с подключения моей библиотеки для хуков - kthook (https://github.com/KiN4StAt/kthook/)


Скачиваем kthook из репозитория (https://github.com/KiN4StAt/kthook/) и распаковываем в себе в папку с кодом(Пкм по проекту -> открыть папку в проводнике).

Папку tests перекидывать к себе не нужно.

Скачиваем ktsignal из репозитория (https://github.com/KiN4StAt/ktsignal) и распаковываем содержимое

ktsignal-master

в папку

kthook\ktsignal


Жмем показать все файлы




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


ПКМ по папке kthook -> Включить в проект

Т.к. мы не используем CMake, тогда мы должны вручную переназначить все зависимости для kthook

Добавляем папку kthook в Дополнительные каталоги включаемых файлов(Additional directories of included files) (как в шаге 6 у sampapi)

В kthook.hpp изменяем

#include "ktsignal/ktsignal.hpp"

на

#include "ktsignal/include/ktsignal/ktsignal.hpp"


Также ради собственного удобства добавляем

kthook/include

Дополнительные каталоги включаемых файлов(Additional directories of included files)


Вместо kthook могу посоветовать вам SRHook (https://gitlab.com/SR_team/llmo/) либо 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
;
}







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




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

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
simple хук чё сам после первого вызова убирается? надо бы после инициализации убрать хук


static bool inited же

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

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


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

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


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

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

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


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

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

ччбчлчлчъ ччччшчьпьппзвжв
20.11.2021, 16:58
можно пожалуста проект, ничего не получается :сссссссссссссссссссссссс сссссссссссссссссссссссс ссссссс

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


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

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 многое зависит (файл которого нет)?



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


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

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

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


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

ya_noob
29.03.2023, 15:05
почему папка 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""



Заметил что в пространствах имен 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
kthook::kthook_simple не содержит члена "after""


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



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


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

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

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


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

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


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



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

ya_noob
19.04.2023, 15:04
ты читаешь вообще?


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

Lance_Sterling
11.12.2023, 14:33
и где оно

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

ARMOR
11.12.2023, 18:28
и где оно


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

maksmanus228
26.08.2024, 14:56
у меня вылетает ошибка при хуке DrawRadar

CPFire
01.02.2026, 17:02
Ждем завершения операции и далее жмем Файл(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?



sampapi.vcxproj


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