You are not logged in.
Это моя новая разработка, суть которой сводится к написанию собственных опкодов через ассемблерные вставки.
В настоящий момент сделано 9 опкодов из возможных 100.
1 2 3 4 5 6 7 8 9 10 | 0A8C: write_memory 1@ size 4 value 1 virtual_protect 1 0A8D: 1@ = read_memory 2@ size 4 virtual_protect 1 0A8E: 1@ = 1 + 2 // int 0A8F: 1@ = $var - 5 // int 0A90: 1@ = 0@ * 1@ // int 0A91: 1@ = 3@ / 2 // int 0A96: 1@ = actor 0@ struct 0A97: 1@ = car 0@ struct 0A98: 1@ = object 0@ struct |
Сам код лежит здесь:
http://sannybuilder.com/dev/cleo.txt
Все подробности в теме на гтафорумс
http://www.gtaforums.com/index.php?showtopic=268976
Если у вас есть идеи, каких опкодов вам не хватает - пишите.
Готова вторая версия CLEO. Все подробности на странице http://cleo.sannybuilder.com/?lang=ru
Offline
2Seemann:
Я давно читаю этот форум,пользуюсь твоей прогой и сам довольно неплохой скриптер.
Когда я делал 2х персонажный режим игры для своего глобал мода,столкнулся с проблемой:
Нет ли опкода,который меняет модель актёра на заданную??
Спасибо.
Offline
Грубо-говоря это самые необходимые ... И придумать даже нечего )
Offline
2Seemann:
Если у вас есть идеи, каких опкодов вам не хватает - пишите.
1. Команда автонаведения прицела, как в двухплеерном режиме.
2. Команда присвоения бандам определённого вида транспорта.
3. Команда изменения уровня хаоса.
Сначала ты надежда и гордость,
Потом о спину ломают аршин. (c)БГ
Offline
я знаю что надоел уже всем
но пожалуйста попробуй написать опкод чтоб изменять уровень альфы(прозрачьноти) окраски(paintjob-a) машыны
Offline
Блин бд глюканула, посты пропали ...
Ладно вот тут обновление, десяток новых опкодов
версия 1.22
http://sannybuilder.com/dev/cleo.txt
там написано какие опкоды добавлены. все подробности об опкодах и параметрах читайте на гтафорумс (ссылка в первом посте)
а здесь был пример, как можно через скрипты открыть файл, и выполнить код оттуда (внешний скм)
http://sannybuilder.com/dev/cleo1.20.txt
Offline
Добавил сегодня 4 опкода, позволяющих загружать DLL и выполнять ее процедуры.
http://sannybuilder.com/dev/cleo.txt
2listener:
Возник вопрос, если я загружу DLL в память, но не выгружу ее самостоятельно, высвободится ли память при выходе из игры? Иными словами, можно ли оставлять DLL без присмотра, и надеяться, что игра сама позаботится обо всем?
Просто хотелось бы вынести ассемблерный код новых опкодов в длл. Как сделать, чтобы она загружалась всегда при запуске игры (новой или через сейв) я знаю, но вот проследить момент выхода из игры невозможно, а длл должна быть в памяти все время.
Offline
Добавил сегодня 4 опкода, позволяющих загружать DLL и выполнять ее процедуры.
2listener:
Возник вопрос, если я загружу DLL в память, но не выгружу ее самостоятельно, высвободится ли память при выходе из игры? Иными словами, можно ли оставлять DLL без присмотра, и надеяться, что игра сама позаботится обо всем?Просто хотелось бы вынести ассемблерный код новых опкодов в длл. Как сделать, чтобы она загружалась всегда при запуске игры (новой или через сейв) я знаю, но вот проследить момент выхода из игры невозможно, а длл должна быть в памяти все время.
Да, DLL выгрузится автоматом (если ее больше никто не использует).
Я сам хочу так сделать - но я думаю поступить проще: в таблице импорта секцию про wininet.dll заменить на что-то свое. В плюсах - можно будет вмешиваться в процесс инициализации.
А то я разобрал структуру CHandlingData и есть уже нездоровая мысль увеличить количество моделей машин.
PS. жду очередной паузы в рабочем проекте
Last edited by listener (23-03-2007 15:39)
Offline
есть уже нездоровая мысль увеличить количество моделей машин
имхо, есть лимиты поважнее: размер майн.скм и лимит на колы (+5). Про первый ты знаешь (200,000 байтов с адреса 0xA49960); второй - это возможность добавить в игру только 5 новых .col-файлов, после чего игра вылетает. Первый ограничивает возможности скриптеров (хотя в свете данного топика это становится менее актуально), второй - возможности мапперов.
Offline
Если я вызову LoadLibraryA для dll, которая уже загружена, будет ли это ошибкой? Процедура вернет мне указатель на старую dll или создаст ее копию в памяти?
Offline
Если я вызову LoadLibraryA для dll, которая уже загружена, будет ли это ошибкой? Процедура вернет мне указатель на старую dll или создаст ее копию в памяти?
На 100% не скажу без справочника, но она должна вернуть указатель на уже загруженную либу и увеличить для нее usageCount.
Касательно лимита на размер скрипта - посмотрел, там нужно выделить блок и поправить порядка 70 смещений и сколько-то мест, где жестко прописан размер. Но это нужно делать, как минимум, до инициализации скриптового движка.
Если сегодня сдам очередной этап, завтра попробую слепить ws2_32.dll с десятью заглушками (чтобы ничего в .exe не править) и попробовать из нее попатчить код.
Last edited by listener (24-03-2007 16:31)
Offline
В мсдн про LoadLibrary внизу написано
If the dll is already loaded - LoadLibrary will just increase the reference count to that library when returning the new handle
А в LoadLibraryEx
This is because the second call to LoadLibrary or LoadLibraryEx simply returns a handle to the already loaded DLL.
вот непонятно, то ли это будет 2 библиотеки или одна (но с двумя референсами?)?
Я хочу в начало main.scm вставить загрузку библиотеки CLEO, и получится так, что этот код может вызываться несколько раз в течении одного сеанса игры (например, при в начале и при загрузке сейва). Будет ли игра работать и завершаться корректно с таким неоднократным вызовом LoadLibrary?
edit:
Судя по тестам возвращается указатель на первую загруженную библиотеку. Надеюсь, она выгружается нормально независимо от референсов?
Last edited by Seemann (25-03-2007 09:23)
Offline
Да, все ресурсы, полученные процессом будут корректно освобождены по завершению процесса.
И о моих экспериментах. Этап я не сдал (подвели дизайнеры), но с dll-ю все-таки успел поэкспериментировать.
Просто так ws2_32.dll не грузится - используется та, что уже загружена системой. Если в .exe поправить имя на, скажем, ws3_32.dll, все нормально грузится и отрабатывает DllMain. (У меня в ней пишется в лог). Дальше нужно по загрузке сделать VirtualProtect - и у меня будет доступ к игровой памяти до начала какой-либо инициализации. (например, чтобы подменить ссылки на scmBlock до начала инициализации скриптового модуля)
Скорее всего, окончательная версия будет работать с vorbisFile.dll (чтобы вообще не править exe-шник), а пока и так пойдет.
Offline
Этап я не сдал (подвели дизайнеры)
было бы интересно узнать, что именно вы разрабатываете: софт или игры?
Дальше нужно по загрузке сделать VirtualProtect - и у меня будет доступ к игровой памяти до начала какой-либо инициализации. (например, чтобы подменить ссылки на scmBlock до начала инициализации скриптового модуля)
что-то я не пойму, ссылки на scm - это же часть exe (CODE), и его вроде нельзя менять в рантайм? Или после VP можно?
окончательная версия будет работать с vorbisFile.dll (чтобы вообще не править exe-шник)
на гтафорумс писали:
i've been using a modified vorbis dll (by delfi) to load .asi files, which alter the game's memory as i wish @ runtime
т.е. нечто подобное уже было сделано Delfi (aka JernejL). Правда, в свободном доступе я эту длл не видел, видимо ее делали для внутреннего использования в одном из больших западных модов (MI, LC или SAMP).
Offline
было бы интересно узнать, что именно вы разрабатываете: софт или игры?
Софт. В данном случае UI.
что-то я не пойму, ссылки на scm - это же часть exe (CODE), и его вроде нельзя менять в рантайм? Или после VP можно?
Нормально, сегмент кода read-only. VP позволяет это изменить.
Правда, в свободном доступе я эту длл не видел, видимо ее делали для внутреннего использования в одном из больших западных модов (MI, LC или SAMP).
Идеи носятся в воздухе. vorbisFile - практически единственный кандидат. Те dll, что уже загружены в системе, просто так использовать нельзя (они возьмутся из памяти, даже если положить свою). Брать EAX.dll - возиться с интерфейсом.
Так что, проще всего - переименовать имеющуюся vorbisFile.dll, положить свою, а при инициализации, первым делом загрузить оригинальную dll через LoadLibrary, и повесить на нее хуки из экспортируемых функций. Всей работы - строчек на 30-40.
Offline
Нормально, сегмент кода read-only. VP позволяет это изменить.
WOOOW! Я даже и не подумал об этом. Оказывается CLEO-опкод 0A8C может менять код ехе. I like Virtual Protect!
У меня сразу в голове концептики появились ...
переименовать имеющуюся vorbisFile.dll, положить свою, а при инициализации, первым делом загрузить оригинальную dll через LoadLibrary, и повесить на нее хуки из экспортируемых функций
т.е. сделать так, как если бы модифицированной длл не было вовсе? Т.е. и нужный длл-код выполнится и ворбис не пострадает.
Offline
Добавлена новая версия CLEO 2. Вся информация на этой странице: http://cleo.sannybuilder.com/?lang=ru
Last edited by Seemann (04-04-2007 16:03)
Offline
2listener:
нашел тот vorbis от delfi
http://gtafixxxer.dyndns.org/fixxxer/me … loader.rar
Offline
2Seemann:
Угу. Заглянул. Все, как я и говорил.
Сегодня выкроил полчасика и сделал свою. Обвязка (для подключения оригинальной vorbisFile) получилась строчек 60.
Заняться серьезно (и добавить в него что-то полезное) времени сейчас нет.
На то, что получается (и как это делается), можно глянуть: http://listener.pisem.net/tmp/gta_patch_dll.zip
Offline
С твоей игра не запускается. Оригинальную переименовал в vorbisFileHooked.dll, и скопировал твою длл. Пишет при запуске: ошибка инициализации приложения.
Last edited by Seemann (06-04-2007 10:21)
Offline
2Seemann:
Угу. Протормозил. Оно динамически собрано и не может найти msvcr80. С этим я чуть позже разберусь, а пока http://listener.pisem.net/tmp/gta_patch_dll_static.zip
(Мда. 90К вместо 7 - чувствуется разница).
Но, вообще-то, оно выкладывалось не ради кода, а ради исходников.
Offline
Но, вообще-то, оно выкладывалось не ради кода, а ради исходников.
для меня си исходники что есть, что нет. я ж на дельфи... Правда, есть borland c++ builder 6, подойдет?
Offline
Написал asi-плагин для гта cа 1.0, который увеличивает максимальный размер майн.скм до 500.000 байтов. Теперь не нужно мучиться с оптимизацией. Брать на http://cleo.sannybuilder.com
Для работы нужен ASI Loader от Delfi, ссылка есть в этой теме, чуть выше
Offline
2Seemann:
для меня си исходники что есть, что нет. я ж на дельфи...
Это не есть гут. Чем более активная работа с памятью делается (чем сложнее структуры), тем тяжелее делать это из паскаля/дельфи.
BCB на данном этапе подойдет (с учетом того, что вместо __declspec нужно экспортируемые функции описать в .def-файле).
На одном из дальнейших этапов я хочу выносить функции наружу (т.е., подпихивать отреверсенные и дополненные варианты). На этом этапе - только MSVC (благо, он сейчас раздается свободно урезанный (Express) и триалом на полгода - самый полный (Team Edition)).
На вопросы по C/C++ я могу поотвечать по аське, но деньков через пять. (Если интересно - закину номер аськи в PM).
Offline