0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Гайд; Создание ASI-плагина с нуля 1

Гайд Создание ASI-плагина с нуля [1]

  • Форумы
  • Разработка
  • C/C++

Делать мне было нечего, а работать не хотелось, поэтому вы видите этот гайд

Введение:
Для начала скажу, что вам понадобится Visual Studio(Так проще всего), и пакеты к ней, а именно — Разработка классических приложений на C++ и Разработка приложений на универсальной платформы Windows.
Все действия производились на Visual Studio 2019, в других версиях интерфейс может отличаться

Создание проекта:
И так, начнем с создания проекта. Жмем кнопку создать проект, и ищем «Библиотека динамической компоновки (DLL)» (Дело в том, что ASI это и есть DLL файл, только с измененным расширением).
Создаем проект. Я назвал его ASIPlugin.

После создания проекта мы видим перед собой окно редактора с подготовленным шаблоном. Шаблон содержит в себе подключение pch.h и функции DllMain.

Настройка проекта:
Начнем с настройки проекта.
В панели меню сверху жмем Проект, и выпадающем меню выбираем пункт Свойства: $ProjectName
Сверху, в выпадающем меню в открывшемся диалоге выбираем Конфигурация -> Все конфигурации.
После этого я обычно отключаю предварительно скомпилированные заголовки(pch.h), но вы можете их оставить(поэкспериментируйте сами)
Включить/Выключить можно в подменю C/C++ -> Предварительно откомпилированные заголовки -> Предварительно откомпилированный заголовок

Статья в тему:  Бельгия известна в мире своими вкусными. Интересные факты о бельгии. География и экономика Бельгии

После этого переходим в Дополнительно -> Расширение целевого файла, меняем .dll на .asi(чтобы подгружалось ASI Лоадером)
(ОПЦИОНАЛЬНО) После этого переходим в Общие -> Выходной каталог, здесь указываем путь до своей GTA

Настройка проекта окончена, переходим к написанию кода

Написание кода:
Функция DllMain — основная функция Dll библиотеки, которая в нашем случае играет роль Asi плагина. Эта функция вызывается при четырех условиях — создании/уничтожении потока, и при присоединении и отсоединении нашей библиотеки. Первые два условия в данный момент нас не особо интересуют, поэтому перейдем к другим двум. Функция принимает в себя 3 аргумента, один из которых зарезервирован системой(lpReserved). Остальные два аргумента показывают нам базовый адрес библиотеки(Адрес по которому начинается наша библиотека в оперативной памяти) и причину вызова функции. Причина вызова как я уже описал выше — имеет 4 значения: DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, DLL_THREAD_DETACH и DLL_PROCESS_DETACH. На данные момент нас интересуют первое и последнее из них. Первое вызывается при присоединении к процессу, последнее — при отсоединении.

Дальше работаем с DLL_PROCESS_ATTACH(В нашем случае оно будет выполнять функцию int main, как в консольном приложении C/C++).
DLL_PROCESS_DETACH на данный момент нам не нужен, т.к. нам нечего освобождать после выгрузки.
Начну с того, что DllMain с причиной DLL_PROCESS_ATTACH вызывается еще до появления окна GTA, когда игра еще не инициализирована, поэтому мы не можем взаимодействовать с игрой на этом моменте, и придется дождаться ее инициализации, это можно сделать разными путями, но на этот раз сделаем через создание потока, но так лучше не делать, и в дальнейшем я возможно покажу как сделать лучше.

Статья в тему:  Презентация воздушная одежда земли 5 кл география. Атмосфера - воздушная одежда Земли. Не должно быть открытых дверей

Начнем с того, что к case DLL_PROCESS_ATTACH: добавим break; , чтобы выполнение кода не пошло по другим веткам. Так как нас не интересуют события с потоками, скажем Windows, чтобы она вообще не дергала нас по этому поводу, вызвав функцию DisableThreadLibraryCalls(hModule);

Переходим к созданию функции ожидания инициализации и добавления сообщения на экран.
Для функции CreateThread требуется функция определенного типа, а для std::thread подойдет любая. В этом гайде я покажу оба варианта.
Создаем функции:

Или (для std::thread)

Функцию добавления сообщения на экран возьмем с plugin-sdk

Далее переходим к инициализации.
Игра хранит свою стадию по адресу 0xC8D4C0
И пока значение по адресу не станет 9(полная инициализация игры) — спим и ждем

Либо так, в случае с CreateThread:

kin4stat

  • Сообщения 2,113
  • Реакции 2,673
  • Баллы 133

Palapka

Активный
  • 27 Май 2021
  • #2
  • loganhackerdff

    Известный
    • 27 Май 2021
  • #3
  • kin4stat

    mq-team
    • 27 Май 2021
  • #4
  • loganhackerdff

    Известный
    • 27 Май 2021
  • #5
  • Gruzin Gang

    Известный
    • 27 Май 2021
  • #6
  • Делать мне было нечего, а работать не хотелось, поэтому вы видите этот гайд

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

    Введение:
    Для начала скажу, что вам понадобится Visual Studio(Так проще всего), и пакеты к ней, а именно — Разработка классических приложений на C++ и Разработка приложений на универсальной платформы Windows.
    Все действия производились на Visual Studio 2019, в других версиях интерфейс может отличаться

    Статья в тему:  Пожелания с днем рождения 9 лет

    Создание проекта:
    И так, начнем с создания проекта. Жмем кнопку создать проект, и ищем «Библиотека динамической компоновки (DLL)» (Дело в том, что ASI это и есть DLL файл, только с измененным расширением).
    Создаем проект. Я назвал его ASIPlugin.

    После создания проекта мы видим перед собой окно редактора с подготовленным шаблоном. Шаблон содержит в себе подключение pch.h и функции DllMain.

    Настройка проекта:
    Начнем с настройки проекта.
    В панели меню сверху жмем Проект, и выпадающем меню выбираем пункт Свойства: $ProjectName
    Сверху, в выпадающем меню в открывшемся диалоге выбираем Конфигурация -> Все конфигурации.
    После этого я обычно отключаю предварительно скомпилированные заголовки(pch.h), но вы можете их оставить(поэкспериментируйте сами)
    Включить/Выключить можно в подменю C/C++ -> Предварительно откомпилированные заголовки -> Предварительно откомпилированный заголовок

    После этого переходим в Дополнительно -> Расширение целевого файла, меняем .dll на .asi(чтобы подгружалось ASI Лоадером)
    (ОПЦИОНАЛЬНО) После этого переходим в Общие -> Выходной каталог, здесь указываем путь до своей GTA

    Настройка проекта окончена, переходим к написанию кода

    Написание кода:
    Функция DllMain — основная функция Dll библиотеки, которая в нашем случае играет роль Asi плагина. Эта функция вызывается при четырех условиях — создании/уничтожении потока, и при присоединении и отсоединении нашей библиотеки. Первые два условия в данный момент нас не особо интересуют, поэтому перейдем к другим двум. Функция принимает в себя 3 аргумента, один из которых зарезервирован системой(lpReserved). Остальные два аргумента показывают нам базовый адрес библиотеки(Адрес по которому начинается наша библиотека в оперативной памяти) и причину вызова функции. Причина вызова как я уже описал выше — имеет 4 значения: DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, DLL_THREAD_DETACH и DLL_PROCESS_DETACH. На данные момент нас интересуют первое и последнее из них. Первое вызывается при присоединении к процессу, последнее — при отсоединении.

    Статья в тему:  Какой флаг отличается от всех. Разница между флагом и знаменем. Какими были древние флаги

    Дальше работаем с DLL_PROCESS_ATTACH(В нашем случае оно будет выполнять функцию int main, как в консольном приложении C/C++).
    DLL_PROCESS_DETACH на данный момент нам не нужен, т.к. нам нечего освобождать после выгрузки.
    Начну с того, что DllMain с причиной DLL_PROCESS_ATTACH вызывается еще до появления окна GTA, когда игра еще не инициализирована, поэтому мы не можем взаимодействовать с игрой на этом моменте, и придется дождаться ее инициализации, это можно сделать разными путями, но на этот раз сделаем через создание потока, но так лучше не делать, и в дальнейшем я возможно покажу как сделать лучше.

    Начнем с того, что к case DLL_PROCESS_ATTACH: добавим break; , чтобы выполнение кода не пошло по другим веткам. Так как нас не интересуют события с потоками, скажем Windows, чтобы она вообще не дергала нас по этому поводу, вызвав функцию DisableThreadLibraryCalls(hModule);

    Переходим к созданию функции ожидания инициализации и добавления сообщения на экран.
    Для функции CreateThread требуется функция определенного типа, а для std::thread подойдет любая. В этом гайде я покажу оба варианта.
    Создаем функции:

    Ссылка на основную публикацию
    Статьи c упоминанием слов:
    Adblock
    detector