Как редактировать asi файл gta

Обновлено: 17.05.2024

Введение:
Для начала скажу, что вам понадобится 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, когда игра еще не инициализирована, поэтому мы не можем взаимодействовать с игрой на этом моменте, и придется дождаться ее инициализации, это можно сделать разными путями, но на этот раз сделаем через создание потока, но так лучше не делать, и в дальнейшем я возможно покажу как сделать лучше.

Дело в том, что потоки на процессоре могут выполняться совершенно параллельно, и может возникнуть ситуация когда сразу несколько потоков(в нашем случае это поток игры и наш поток) обращаются к одной и той же памяти. Возникает состояние гонки потоков, и это приводит к Undefined Behaviour (по-русски - все пойдет по пизде)

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

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

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

Далее спокойно вызываем функцию AddMessageJumpQ, ведь мы знаем, что игра уже инициализирована
Теперь создадим поток инициализации в DllMain, передав ему нашу функцию (не забывайте что для std::thread нужно подключить заголовок thread):
std::thread(InitializeAndLoad).detach();
Либо:
CreateThread(0, 0, &InitializeAndLoad, 0, 0, 0);
Итого должно выйти примерно так:

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


Жмем Ctrl+Shift+B, ждем окончания сборки, заходим в игру и видим:

kin4stat

Palapka
Активный
loganhackerdff
Режим чтения
kin4stat
Да господи я же написал что не в этот раз, ибо придется объяснять что такое хуки зачем куда и почему
loganhackerdff
Режим чтения
Да господи я же написал что не в этот раз, ибо придется объяснять что такое хуки зачем куда и почему
Gruzin Gang
Известный

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

Введение:
Для начала скажу, что вам понадобится 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, когда игра еще не инициализирована, поэтому мы не можем взаимодействовать с игрой на этом моменте, и придется дождаться ее инициализации, это можно сделать разными путями, но на этот раз сделаем через создание потока, но так лучше не делать, и в дальнейшем я возможно покажу как сделать лучше.

Дело в том, что потоки на процессоре могут выполняться совершенно параллельно, и может возникнуть ситуация когда сразу несколько потоков(в нашем случае это поток игры и наш поток) обращаются к одной и той же памяти. Возникает состояние гонки потоков, и это приводит к Undefined Behaviour (по-русски - все пойдет по пизде)

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

Пишем простой ASI плагин для GTA San Andreas

Сразу предупреждаю будет сложно, но не все так страшно, как кажется.
Давайте напишем простой плагин, функцией которого будет: по нажатию клавиши, даем нашему игроку кучу баксов, для богатой и счастливой жизни! <!--smile:smile--><!--/smile-->
Статья для новичков, опытным кодерам она будет бесполезна.

Заранее предупреждаю, если вы не смогли установить себе данную программу, или скачать, то дальше вам не стоит читать эту статью.

Запускаем программу, щелкаем в меню - создать ---> проект и выбираем DLL.

Пишем простой ASI плагин

Сохраняем наш проект в любую, заранее созданную папку, под именем AsiPlugin.
Перед нами открывается исходный код проекта, ничего не трогаем, все что вам сейчас нужно - это функция под названием DllMain.

Пишем простой ASI плагин

Что такое DllMain? Это функция, которая может быть вызвана игрой при запуске и соответственно, все, что вы задумали выполнится в этом участке кода. Для нашего маленького эксперимента нам понадобится следующий участок кода:

Что нам нужно для того чтобы пополнить счет игрока? Правильно, сначала узнать когда мы нажали на клавишу!
Я дам вам шаблон данной функции и им можно будет пользоваться в дальнейшем.

Коды для клавиатуры можно найти здесь.
Данный участок кода, постоянно будет повторяться и каждый раз будет проверяться состояние клавиши G.

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

Видим наш адрес: 0xB7CE50 - [dword] Деньги.
Как этим пользоваться спросите вы? Объясняю!

Что-бы прочитать количество денег в переменную, вам нужно объявить переменную и проделать следующий фокус с указателем на этот адрес:

DWORD Many = *(DWORD*)0xB7CE50; // получаем деньги.
*(DWORD*)0xB7CE50 = 1000000; // даем денег игроку

В итоге получим следующий код:

Далее нам необходимо запустить таймер, который будет выполнять нашу функцию и каждый раз спрашивать: нажали ли мы клавишу?
Делается это так - SetTimer(0, 0, 200, (TIMERPROC)OnTimer); // 200 интервал в миллисекундах

В итоге получим следующий код:

Теперь нам осталось скомпилировать нашу программу и попробовать ее в игре. Сразу хочу обратить внимание. Выберите 32 битный компилятор в Dev C++, иначе наш плагин работать не будет.
Смотрите картинку, как это сделать и что нажать для компиляции.

Пишем простой ASI плагин

Получилось без ошибок? Если да, то идем в папку с нашим проектом и находим файл DLL, который у нас получился. Переименовываем расширение в ASI и кидаем в папку с игрой. Важно! Не забудьте установить AsiLoader, или CLEO 4.
Вот и все. Запускайте игру и жмите G. Все работает? Молодцы, поздравляю!
Спросите что дальше? Отвечу: изучайте программирование, быть может из вас получится гуру моддинга, а может быть и круче. <!--smile:smile--><!--/smile-->
Тем у кого не получилось, дарю плагин AsiPlugin.rar и исходник проекта lesson.rar .

Полезные ссылки:
Книги по программированию можно скачать здесь.
Адреса и функции Gta San Andreas, там же можно найти базу для IDA, в которой много чего интересного. Как пользоваться IDA боюсь, нужна отдельная статья.

Программы для создания модов и редактирования


Всем доброго времени суток.Сегодня создал свой трейнер и теперь пытаюсь найти программу которая сможет редактировать другие моды тоесть .asi и .lua файлы. В интернете нечего подобного не нашёл,а нашел лишь то что нужна какая-то C++ Script Hook
Кто подскажет где скачать C++ Script Hook?
Есть ли вообще еще какие-то программы для редактирования модов?

MrRiddler
ASI-моды закриптованы создателями, их отредактировать сложно или невозможно. А LUA-скрипты с открытым кодом, можешь спокойно изменять. Если в этом деле шаришь, конечно)


Ilya233
Просто хотел пару скриптов взять из Native Treiner,что б не искать в инете.А открыть не могу.
А чем собственно lua файл открыть не знаете?


MrRiddler
Текстовым редактором, или xml-форматом. Лучше использовать Notepad++


HackerokX
xml форматом не открывает(ошибку выдвет)
а в текстовом редакторе вот такое творится




MrRiddler
Не может быть, что текстовым редактором нельзя открыл *.lua



MrRiddler
А я то про lua говорю) А Asi еще ни разу не открывал.


Ilya233
Но есть же на белом свете хоть что-то что открывает формат asi


MrRiddler
Программы : FileViewPro ; Assembler Include (Borland Software Corporation) ; Alpha Software Alpha Five


HackerokX
Спасибо щас гляну что это.
HackerokX
Ilya233
Вот что выдает программа FileViewPro



MrRiddler
Говорю же. ASI-моды закриптованы создателями, их отредактировать сложно или невозможно. Так что пока .lua редактируй.


Ilya233
Но вопрос как я сделаю мод-меню в lua формате?Это ж бред какой-то.

MrRiddler
Ну не ну думаю, что бред прям. Вон в LUA сделаны несколько трейнеров и ничего, вроде работают)





nigga40000
оооо спасибо но я теперь не знаю как пользоваться SDK


MrRiddler
А вот это сложнее уже намного.Нужен пакет C++. 2010 или 2013 версии. Здесь уже начинается программирование на С. По сравнению с языком С++ Lua детский сад)) Скажу сразу,я в этом не силён


nigga40000
Ладно и на этом большое спасибо.Я кстати такой же как и ты больше по железу а не по скриптам.Но стремлюсь к чему-то большему.Спасибо.


MrRiddler
привет коллега! Я вот тоже мечтаю расти,развиваться, но пока обстоятельства не позволяют,увы)))) В любом случае,тебе удачи в начинаниях!

Загрузчик плагинов - Ultimate ASI Loader v4.57

Это DLL-файл, который добавляет функцию загрузки ASI-плагинов в любую игру, в которой используются следующие библиотеки:

  • d3d8.dll
  • d3d9.dll
  • d3d11.dll
  • ddraw.dll
  • dinput.dll
  • dinput8.dll (x86 and x64)
  • dsound.dll (x86 and x64)
  • msacm32.dll
  • msvfw32.dll
  • version.dll (x86 and x64)
  • vorbisFile.dll
  • wininet.dll (x86 and x64)
  • winmm.dll
  • xlive.dll

Инструкции по Ultimate ASI Loader v4.57:

Чтобы установить его, вам просто нужно поместить DLL в каталог с игрой. Обычно он работает как dinput8.dll.

Rekkr: Sunken Land: Таблица для Cheat Engine [UPD: 13.10.2021] <ndck76></p>
<p>

Читайте также: