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

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

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


Время: 23:57