Автор Тема: Свободные адреса памяти  (Прочитано 7131 раз)

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Свободные адреса памяти
« : Декабрь 04, 2013, 02:16:11 pm »
Возникла ситуация, когда понадобилось хранить в игре собственные переменные, созданные плагином, значения которых бы считывало какое-то внешнее приложение, либо другой плагин, вобщем нужно организовать информационный обмен через область памяти самой игры.
Примером новой информации может быть пробег и запас топлива всех авто в городе. Скорее всего подсунуть эти переменные в класс CVehicle уже некуда, поэтому есть ли свободные адреса памяти, в которых можно смело хранить свою информацию, чтобы считывать другим плагином. Я раньше находил пустые блоки 00 00 00 00 00 00 00..., но хранил там информацию на свой страх и риск.
Какая-то фишка может стать новым стандартом игры, под которую остальные смогут писать что-то еще, точно зная откуда считать эту информацию. Нужны 100% неиспользуемые области статической памяти игры.

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: Свободные адреса памяти
« Ответ #1 : Декабрь 04, 2013, 02:42:36 pm »
Цитировать
поэтому есть ли свободные адреса памяти

Зачем это все? Когда мы пишем dll, и объявляем в ней глобальные переменные, мы можем потом с ними работать как нам по душе. Зная адрес. Жаль что я пока еще об этом статьи не написал, все болезни да болезни. Запомните если 00, 00, 00 попадается, это не свободные адреса, так как они уже выделены компилятором. Просто скорее всего не про инициализированы или обнулены. Все что есть уже выделено, то не как не может быть свободным. Просто туда потом могут записаться значения.
« Последнее редактирование: Декабрь 04, 2013, 02:45:42 pm от Sektor »

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Свободные адреса памяти
« Ответ #2 : Декабрь 04, 2013, 03:55:28 pm »
Применение этому есть, например я пишу отдельно d3d8.dll для графического оформления игры, но я не хочу перегружать это какими-то скриптовыми дополнениями, которые будут в отдельной asi-шке. Т.е. у меня все изменения в игровом мире происходят в asi-шке, но прорисовка индикаторов на экране идет в d3d8.dll, мне надо вытащит некоторые мои значения из asi. Конечно можно написать одну мега-тяжелую asi-шку и все туда затолкать, но все-таки хотелось бы рассмотреть вариант обмена информацией.

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: Свободные адреса памяти
« Ответ #3 : Декабрь 04, 2013, 04:08:21 pm »
Что-бы понять всю логику работы, этого всего. То нужно сперва рассказать это в пошаговых статьях, так просто все не объяснить. Пока скажу то что, можно обойтись всего лишь одним asi плагином без подмены dll от DirectX.

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Свободные адреса памяти
« Ответ #4 : Декабрь 04, 2013, 04:33:21 pm »
Кажется понял идею с глобальными переменными, пока тяжеловато ориентироваться в этом, надо более четко изучить процесс компиляции. Это типа реверсивная инженерия, направленная на свои же плагины. Будем ждать статей, хотя вариант с d3d8 тоже рабочий, я его почти дописал, хотя не все мне нравится, посмотрим все ли можно будет перенести.

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: Свободные адреса памяти
« Ответ #5 : Декабрь 04, 2013, 05:02:14 pm »
Цитировать
Кажется понял идею с глобальными переменными, пока тяжеловато ориентироваться в этом, надо более четко изучить процесс компиляции. Это типа реверсивная инженерия, направленная на свои же плагины. Будем ждать статей, хотя вариант с d3d8 тоже рабочий, я его почти дописал, хотя не все мне нравится, посмотрим все ли можно будет перенести.

Да, все верно, это самый оптимальный вариант, но не одной статьей это не объяснить. Тут нужно целые курсы пошаговых статей написать и изложить текст, как можно подробней.

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Свободные адреса памяти
« Ответ #6 : Январь 11, 2014, 09:19:40 am »
Все никак не успокоюсь. Если отбросить вопрос "зачем это нужно" и поставить "а вдруг пригодится", то кажется я нашел как можно безболезненно отобрать у игры несколько адресочков для себя.

1 способ - найти одинаковые константы, например flt_696B10 dd 100.0 и flt_697500 dd 100.0, к первой обращение происходит всего из одного места, почему бы его не перенаправить на вторую константу, а первую забрать для собственных нужд, получив адресок, к которому можно обращаться из любых плагинов м скриптов. Я так понимаю, можно вообще любое обращение к константе перенаправить на свою глобальную переменную, используя ее адрес типа (DWORD)&my_global_var, а адрес константы забрать себе.

2 способ - использовать процедуры, которые нупятся и точно не нужны, например 0x57479D никому не нужное рисование кубиков на фарах. Когда мы исключаем обращение к процедуре, то область памяти, занятая под тело процедуры, оказывается незадействованной, и мы можем что-то туда записать для себя, правда наверное только на этапе запуска игры.

Или я не прав?

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: Свободные адреса памяти
« Ответ #7 : Январь 11, 2014, 12:29:46 pm »
Не чего забирать не нужно. По крайне мере, по мере надобности мы можем сами, объявить собственные переменные любого типа и размера, хоть структуры. Затем их использовать в своих нуждах, например переписать функции, в этой функции за использовать свои глобальные переменные, ну и затем сделать замену. Вот в чем и суть ASI плагинов они очень гибкие.

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Свободные адреса памяти
« Ответ #8 : Январь 11, 2014, 01:25:31 pm »
Мы все-таки говорим о разных вещах. Дело не в том, как грамотно написать плагин. Я понимаю, что внутри можно переписать функции на свои, это крутая штука, из статей я это понял. Но задача стоит шире. Сможет ли идеально написанный плагин отдать какие-то значения во вне для интеграции с другими приложениями и плагинами. Я не говорю, что это так уж необходимо, просто рассматриваю возможность.

Вот пример (бессмысленный, просто задачка): параллельно с игрой запущен трейнер, который читит какие-то параметры игры, и одним из этих параметров будет запас топлива. Что трейнер должен менять, если такого параметра в игре вообще нет, но я его создал своим плагином. Разве сможет трейнер обратиться к адресу глобальной переменной плагина? Поэтому нужен конкретный адрес из самой игры, плагин в него пишет, трейнер к нему обращается.

Или другой пример, я выкладывают плагин без исходников, а люди захотят переписать скажем алгоритм заправки авто, перекомпилировать уже не смогут, с чем им работать? Но зная адрес, они смогут создать свой дополнительный плагин.

Повторюсь, вопрос не "зачем", вопрос "как". Не убедил?

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: Свободные адреса памяти
« Ответ #9 : Январь 11, 2014, 01:47:10 pm »
Цитировать
Или другой пример, я выкладывают плагин без исходников, а люди захотят переписать скажем алгоритм заправки авто, перекомпилировать уже не смогут, с чем им работать? Но зная адрес, они смогут создать свой дополнительный плагин.

Для этого надо с твоего плагина, делать экспорт функций, которые и будут возвращать, адреса переменных и все то что нужно и также к нему еще написать собственный SDK, как это обычно делается.

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Свободные адреса памяти
« Ответ #10 : Январь 11, 2014, 02:14:15 pm »
Это конечно совсем навороченно получается. Хорошо, последний аргумент, и я успокоюсь. Забудем о плагинах, не все их пишут. У нас есть только скрипт, никакой не cleo с наворотами sanny builder'а, никаких asi loader'ов. К примеру в один прекрасный день все заявили об авторских правах на моды и программы и все стало платным. Остается только main.scm со стандартным набором опкодов. Мы занимаемся его отладкой и хотим, чтобы он умел писать в log-файл какие-то координаты например. Насколько я знаю, опкода, который пишет в файл нету (зачем он игре), но есть который пишет в память. Вот тут-то и понадобился свободный адресок. Пишем простую программку, которая висит параллельно, забирает с этого адреса и записывает в лог для дальнейшего исследования. По крайней мере году в 2006 я только так бы и смог сделать.

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: Свободные адреса памяти
« Ответ #11 : Январь 11, 2014, 02:32:52 pm »
Как мы можем забыть об этом, если же cleo это и есть как бы свой менеджер скриптов, а он же asi плагин. Я уже говорил что под свой мод, надо делать SDK, это нужно что-бы сторонние программисты, писали свои собственные плагины скажем под глобальный мод xanser-а. Обычно везде сейчас делают SDK. 

Еще один момент:

Цитировать
CLEO 4 позволяет создавать новые опкоды, используя исходные коды CLEO SDK. В стартовом комплекте библиотеки можно найти три примера таких плагинов:

Это кажись не давно, введено было. Достаточно сделать 2 опкода:

setFuel
getFuel

которые и буду работать с топливом скажем к конкретной машине.
« Последнее редактирование: Январь 11, 2014, 02:38:07 pm от Sektor »

Оффлайн DK

  • Новичок
  • **
  • Сообщений: 234
  • Репутация: +328/-0
    • dk22pac
    • Просмотр профиля
Re: Свободные адреса памяти
« Ответ #12 : Январь 21, 2014, 08:59:03 pm »
xanser, обьясните, каким способом R* предьявит авторские права по поводу ASI loader'a.

Цитировать
Или другой пример, я выкладывают плагин без исходников, а люди захотят переписать скажем алгоритм заправки авто, перекомпилировать уже не смогут, с чем им работать? Но зная адрес, они смогут создать свой дополнительный плагин.
Выкладывай исходники, делай API. Только выкладывая плагин/скрипт без исходников, ты уже даешь понять, что не разрешаешь его изменять/модифицировать.
« Последнее редактирование: Январь 21, 2014, 09:02:02 pm от DK »
Plugin-SDK https://github.com/DK22Pac/plugin-sdk

Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 521
  • Репутация: +34/-0
    • Просмотр профиля
Re: Свободные адреса памяти
« Ответ #13 : Январь 21, 2014, 09:32:00 pm »
Если на то пошло, то можно просто SDK написать, пример этого есть плагин VC Opcode Hook 0.1 Alpha, тут именно такая система. Но это далеко не единственный плагин, в сети еще кое какие есть...

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 598
  • Репутация: +92/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Свободные адреса памяти
« Ответ #14 : Январь 22, 2014, 04:08:45 pm »
Не воспринимайте все буквально. Я просто пытался всячески отвести тему от программирования и использования asi loader-а. Тема превратилась в поиски разумной альтернативы, а хотелось все-таки узнать можно ли писать в память игры для себя, если приспичит. В общем-то ответ уже дан, хотя могли бы быть варианты "нельзя ни при каких обстоятельствах" или "можно аккуратно сюда, при выполнении определенных условий".