Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
12 Jul 2019, 22:04
Сообщение
#421
|
|
![]() Immortal Сообщений: 1 468 Спасибо сказали: 1153 раза |
А почему на этом месте не освоить Erm Hooker 2.0?
-------------------- |
|
|
|
13 Jul 2019, 00:26
Сообщение
#422
|
|
![]() ---------------------- New_Life_of_Heroes ---------------------- Сообщений: 280 Спасибо сказали: 408 раз |
!!UN:Cy1/5/?"G" - Попытка воткнуть команду JMP 4787854 (адрес для примера) в начало (в данном случае) массива, для этого и нужно правильно вычислить число (скрин ниже) Пихать куда-то байткод через ERM - очень неудачное решение для применения ERM. Намного более разумным шагом будет создание собственной dll средствами бесплатного FASM например. Либо использовать статичное адресное пространство (если нужны дозы БДСМ-байткодинга, пусть и на ERM), которое всегда можно найти, было бы желание: 1. Можно патчить код, выделяющий и очищающий память под основные игровые массивы данных. Через ERM всегда можно прочитать базовый адрес и что-то записать и прочитать за игровыми данными, под которые будет выделена память "сверх нормы". Патчить, естественно, в exe, через dll или bin. Ну а читать и записывать можно через ERM. 2. Можно записывать код в огромное количество NOPS, располагающихся между функциями (если мало, то можно оптимизировать окончания функций - многие имеют повторяющиеся элементы - для кода ставятся прыжки с повторов на один единый участок, для данных кейсов - изменяются их адреса в самих функциях) (если и этого мало, то можно двигать сами функции, расширяя таким образом NOPS, но это уже совсем для каких-то маняков). 3. Можно оптимизировать сами геройские функции, освобождая пространство - вынос повторяющихся линейных участков функций в отдельные функции с установкой их вызовов (будет работать немного медленнее, но зато освободится куча пространства), снижение размера самого кода - использование более коротких, но более затратных для ЦП, команд, например, хорошие результаты даёт добавление прямой команды умножения вместо оптимизационной колбасы из имитации умножения (так же будет работать немного медленнее, но зато освободится куча пространства), а воговский код в exe достаточно топорно собран и без особых проблем ужимается раза вчетверть где-то. Но.... есть одно но: все эти "процессы" отнимут огромное количество времени - Richter, твой мод выйдет намного намного намного намного быстрее, если всё делать по-человечески через DLL, а не через ж.пу. -------------------- WoG + MoP + HoA + Forge + Bastion = ERA+
|
|
|
|
13 Jul 2019, 01:46
Сообщение
#423
|
|
![]() допустим, мяў Сообщений: 24 129 Спасибо сказали: 13439 раз |
Пихать куда-то байткод через ERM - очень неудачное решение для применения ERM. Намного более разумным шагом будет создание собственной dll средствами бесплатного FASM например. Смотря какой код. Если нужно тупо что-то занопить, чтобы не мешало - самое оно. Или что-то поправить в самой инициализации игры. А вот функции, разумеется, лучше использовать нативные, либо писать свои.-------------------- Вокруг столько фильмов, книг, музыки - а природа какая невероятная!
Если тебе скучно жить - ты совсем дурак. (Татьяна Черниговская) |
|
|
|
13 Jul 2019, 02:11
(Сообщение отредактировал Richter - 13 Jul 2019, 08:15)
Сообщение
#424
|
|
![]() collector of time Сообщений: 159 Спасибо сказали: 73 раза |
Занести адрес массива в какую-нибудь глобальную переменную, а прыжок исправить на jmp [переменная]. Или не? Вообще, вроде в ЭРЕ давно есть способы вставки хука, а тебе он и нужен, как я понял. Неплохая идея. Правда не до конца представляю как это сделать, что бы работало. Спасибо. 0777A02D - 777A0013 = 8FFDA01A (байты в команде в обратном порядке, потому что intel) Точно! Блин как я забыл это в расчет взять. А то какие то триллионные значения получались. Спасибо. Это не самая большая проблема. Насущный вопрос: как вернуться таким способом назад, в исходное место? Эровский числовой массив состоит из интов, а чтобы записать команду JMP нужен байт. Можно конечно запилить сначала 3 нопа, а потом JMP и адрес прыжка назад (который тоже еще нужно высчитать!), но как по мне всё это еще тот гемор. Это нужно вычислить адрес переменной массива, которая будет указывать на обратный адрес, потом через UN:C по этому адресу записать нопы и опткод джампа, в следующей перменной массива нужно указать высчитанное смещение назад и правильно его записать обратно в массив, смещение к тому же будет зависеть от длинны массива. В во всём этом винигрете нужно еще не запороть регистры. Ахтунг, одним словом... И что это за такая интересная команда?! Код !!UN:Cy1/5/?"G" Во первых: UN:C поддерживает только 1, 2 или 4 байта для патчинга. Во вторых: ?"G" - WTF?! И еще: не забываем про точки с запятой... Хорошо и правильно объяснили. Пытался пробовать. Это просто капец. Вообщем пришёл к выводу, что сделать даже часть задуманного через !!SN:M, нужны железобетонные нервы. Команды !!UN:Cy1/5/?"G" не существует, это эмоциональная составляющая). А точки с запятой, это, да. Спасибо. Не джампьте в память, пацаны, вы матерям еще нужны а если все-таки ннадо, то делайте примерно так... если свободных регистров нет, а их обычно нет, то можно в стек засунуть, а в конце своего кода высунуть А вообще именно на этом месте надо все-таки осваивать плагины Про регистры не понял, знаний нет. А плагины потихоньку стараюсь. Спасибо. А почему на этом месте не освоить Erm Hooker 2.0? Это дело. Erm Hooker это просто класс, отдельная бладарность тому кто это сделал, уже использую его правда методом тыка, однако получается. Спасибо. И отдельное Спасибо Вам за создание платформы ERA! Пихать куда-то байткод через ERM - очень неудачное решение для применения ERM. Намного более разумным шагом будет создание собственной dll средствами бесплатного FASM например. Либо использовать статичное адресное пространство (если нужны дозы БДСМ-байткодинга, пусть и на ERM), которое всегда можно найти, было бы желание: 1. Можно патчить код, выделяющий и очищающий память под основные игровые массивы данных. Через ERM всегда можно прочитать базовый адрес и что-то записать и прочитать за игровыми данными, под которые будет выделена память "сверх нормы". Патчить, естественно, в exe, через dll или bin. Ну а читать и записывать можно через ERM. 2. Можно записывать код в огромное количество NOPS, располагающихся между функциями (если мало, то можно оптимизировать окончания функций - многие имеют повторяющиеся элементы - для кода ставятся прыжки с повторов на один единый участок, для данных кейсов - изменяются их адреса в самих функциях) (если и этого мало, то можно двигать сами функции, расширяя таким образом NOPS, но это уже совсем для каких-то маняков). 3. Можно оптимизировать сами геройские функции, освобождая пространство - вынос повторяющихся линейных участков функций в отдельные функции с установкой их вызовов (будет работать немного медленнее, но зато освободится куча пространства), снижение размера самого кода - использование более коротких, но более затратных для ЦП, команд, например, хорошие результаты даёт добавление прямой команды умножения вместо оптимизационной колбасы из имитации умножения (так же будет работать немного медленнее, но зато освободится куча пространства), а воговский код в exe достаточно топорно собран и без особых проблем ужимается раза вчетверть где-то. Но.... есть одно но: все эти "процессы" отнимут огромное количество времени - Richter, твой мод выйдет намного намного намного намного быстрее, если всё делать по-человечески через DLL, а не через ж.пу. А вот так на данный момент и действую, вроде получается, времени требует много, чтобы не порушить код. Динамические библиотеки вообще не знаю с чего начать. Искал видео на ютубе, непонятно нифига. Вообщем как не умел, так и не умею. Как бы то нибыло мод будет закончен. Было бы здоровье как говорится. Спасибо. Может кто нибудь сможет написать пустую DLL со статическими адресами для использования? -------------------- |
|
|
|
13 Jul 2019, 10:36
Сообщение
#425
|
|
![]() 😸🧡✊✌️ Сообщений: 16 495 Спасибо сказали: 3401 раз |
если свободных регистров нет, а их обычно нет Код push 71231312h
ret -------------------- Я слежу за тобой!
tolic.narod.ru![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
|
13 Jul 2019, 13:52
Сообщение
#426
|
|
![]() Immortal Сообщений: 1 468 Спасибо сказали: 1153 раза |
push/ret портит предсказание процессора по переходам, mov reg32, value, jmp reg32 лучше.
-------------------- |
|
|
|
13 Jul 2019, 13:59
Сообщение
#427
|
|
![]() 😸🧡✊✌️ Сообщений: 16 495 Спасибо сказали: 3401 раз |
Не понимаю, чему тут портиться: если пренебречь ситуациями вроде переполнения стека, переход предсказуем, как чаепитие в Англии в 17:00.
И, да: jmp value чемпион. -------------------- Я слежу за тобой!
tolic.narod.ru![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
|
13 Jul 2019, 17:13
Сообщение
#428
|
|
![]() Etoslozhnostatus Сообщений: 8 676 Спасибо сказали: 16200 раз |
Да и в большинстве случаев производительность не нужна.
Ещё можно сохранять регистры в регистрах с плавающей запятой FPU. Насчёт регистров SSE не уверен, но вроде MoP с ними работал. -------------------- - Да ну!?
- Horn of the Argali гну! |
|
|
|
13 Jul 2019, 17:37
Сообщение
#429
|
|
![]() Анти-Всë Сообщений: 2 989 Спасибо сказали: 2377 раз |
push/ret портит предсказание процессора по переходам, mov reg32, value, jmp reg32 лучше. В каком случае это критично? А то в WERD вся библиотека игровых функций на пуш-ретах. Цитата Насчёт регистров SSE не уверен, но вроде MoP с ними работал. Использовал для вычислений с плавающей запятой и для хранения и копирования 8- и 16-байтных массивов. Сохранять в них регистры процессора? Не, только push и pushad, да и то по допустимому минимуму. -------------------- Circle of destruction, hammer comes crushing
Powerhouse of energy Whipping up a fury, dominating flurry We create the battery |
|
|
|
14 Jul 2019, 00:01
Сообщение
#430
|
|
![]() ---------------------- New_Life_of_Heroes ---------------------- Сообщений: 280 Спасибо сказали: 408 раз |
1 параметр - указатель на структуру героя, 2 параметр - цвет флага 3 параметр - указатель на структуру войск гарнизона (7 DWORDов для типов, 7 DWORDов для количества (или наоборот (= ) и 8 байт непонятного назначения)" 1. Получить структуру нужного тебе героя: получить адрес базовой структуры и прибавить к ней расчётное смещение до структуры по номеру героя. 2. Это наверное разъяснять не надо - и так понятно. 3. Получить структуру гарнизона в игре (если гарнизоны присутствуют на карте): struct _Garrison_ Byte Хозяин db ? db ? db ? Dword Слот_1_тип_существа Dword Слот_2_тип_существа Dword Слот_3_тип_существа Dword Слот_4_тип_существа Dword Слот_5_тип_существа Dword Слот_6_тип_существа Dword Слот_7_тип_существа Dword Слот_1_количество_существ Dword Слот_2_количество_существ Dword Слот_3_количество_существ Dword Слот_4_количество_существ Dword Слот_5_количество_существ Dword Слот_6_количество_существ Dword Слот_7_количество_существ Byte Возможность_удаления_охраны; 0 - нельзя, 1 - можно Byte X Byte Y Byte L ends Получать структуру гарнизона можно воговской функцией: mov ebx,BASE mov ebx,[ebx] add ebx,0x4E3AC // -> табл.настр mov eax,[ebx] mov zret,eax -------------------- WoG + MoP + HoA + Forge + Bastion = ERA+
|
|
|
|
14 Jul 2019, 00:31
Сообщение
#431
|
|
![]() Immortal Сообщений: 1 468 Спасибо сказали: 1153 раза |
https://stackoverflow.com/questions/1546141...ddress-op-codes
push/ret will unbalance the return-address predictor stack. mov eax,addr / jmp eax is only 1 byte longer and doesn't have that problem. See also Call an absolute pointer in x86 machine code. Предсказание переходов работает с чётными парами call..ret. Непарные ret его нарушают, что определённо влияет на производительность в худшую сторону. Но с учётом всего навороченного в игре и требований это может быть абсолютно незаметно. -------------------- |
|
|
|
14 Jul 2019, 22:20
Сообщение
#432
|
|
![]() 😸🧡✊✌️ Сообщений: 16 495 Спасибо сказали: 3401 раз |
Формат файлов кампаний: Heroes 3 Campaign (h3c) format after unpacking (gz). h3c - gzip - архив, состоящий из нескольких частей, каждая со своим gzip-заголовком. Каждая карта находится в отдельной части. Заголовок и список зон — в первой части. При распаковке все части распаковываются в один непрерывный файл. Не надо так. -------------------- Я слежу за тобой!
tolic.narod.ru![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
|
14 Jul 2019, 23:41
Сообщение
#433
|
|
![]() Immortal Сообщений: 1 468 Спасибо сказали: 1153 раза |
С целью парсинга и извлечения можно распаковывать в один. Запаковывать обратно нужно в указанном тобой виде, согласен.
-------------------- |
|
|
|
30 Jul 2019, 19:47
Сообщение
#434
|
|
![]() collector of time Сообщений: 159 Спасибо сказали: 73 раза |
Решился заняться созданием dll
![]() Как ни смешно, дальше двинуться не получается Может у кого нибудь есть желание обсудить эту тему) Как дальше на FASM создать dll, скажем начать выполнение с адреса 4E3287h далее код....... потом чтобы программа дальше продолжала работать. Может немного не грамотно обрисовал. Надеюсь понятно) -------------------- |
|
|
|
30 Jul 2019, 21:56
Сообщение
#435
|
|
|
Silent One Сообщений: 91 Спасибо сказали: 56 раз |
Решился заняться созданием dl ..... Как дальше на FASM создать dll, скажем начать выполнение с адреса 4E3287h далее код....... потом чтобы программа дальше продолжала работать. Может немного не грамотно обрисовал. Надеюсь понятно) Философский вопрос -- тулчейн того же mingw по каким-то внешним причинам нельзя? Сгенерировать из .asm .o а их уже линковать через ld.exe? -------------------- All this moments will be lost in time...
|
|
|
|
31 Jul 2019, 00:39
Сообщение
#436
|
|
![]() collector of time Сообщений: 159 Спасибо сказали: 73 раза |
Философский вопрос -- тулчейн того же mingw по каким-то внешним причинам нельзя? Сгенерировать из .asm .o а их уже линковать через ld.exe? Благодарю за ответ на мой пост, но то что вы написали. Непонятно мне вообще) -------------------- |
|
|
|
31 Jul 2019, 07:53
(Сообщение отредактировал igrik - 31 Jul 2019, 07:58)
Сообщение
#437
|
|
![]() Immortal Сообщений: 589 Спасибо сказали: 891 раз |
Решился заняться созданием dll А С++ не?Как ни смешно, дальше двинуться не получается Может у кого нибудь есть желание обсудить эту тему) Как дальше на FASM создать dll, скажем начать выполнение с адреса 4E3287h далее код....... потом чтобы программа дальше продолжала работать. Может немного не грамотно обрисовал. Надеюсь понятно) По С++ вот тема (link), вот тема (link) Код int __stdcall LoHook_Name(LoHook* h, HookContext* c)
{ /* * * тут пишем необходимый нам код код * */ return EXEC_DEFAULT; // вернуться в код игры } // начать выполнение с адреса 4E3287h // означает поставить хук на адрес 0x4E3287h // итого: ставим хук с названием LoHook_Name _PI->WriteLoHook(0x4E3287, LoHook_Name); -------------------- |
|
|
|
31 Jul 2019, 09:46
Сообщение
#438
|
|
|
Silent One Сообщений: 91 Спасибо сказали: 56 раз |
Философский вопрос -- тулчейн того же mingw по каким-то внешним причинам нельзя? Сгенерировать из .asm .o а их уже линковать через ld.exe? Благодарю за ответ на мой пост, но то что вы написали. Непонятно мне вообще) Перевожу на русский: В fasm можно сделать format binary . Получить так называемый объектный файл. Есть набор утилит MinGW, который включает в себя в том числе линковщик, который позволяет собрать из объектников в том числе и dll. Документация есть тут . Помимо этого может пригодиться вот этот раздел . Там описана специфика под винду. P.S. А все же, зачем на голом asm? Компиляторы того же С давно дают сравнимый и превосходящий по скорости код. А возни на порядок меньше -------------------- All this moments will be lost in time...
|
|
|
|
31 Jul 2019, 12:43
(Сообщение отредактировал MasterOfPuppets - 31 Jul 2019, 12:47)
Сообщение
#439
|
|
![]() Анти-Всë Сообщений: 2 989 Спасибо сказали: 2377 раз |
В fasm можно сделать и dll, и exe, и ещё кучу форматов без сторонних компоновщиков.
Как делать? Читайте документацию, изучайте примеры. Небольшая популяризация фасма в геройском моддинге связана, видимо, с моими в нём скромными успехами. Но я просто выбрал инструмент, который мне нравится, а не лучший для всех. -------------------- Circle of destruction, hammer comes crushing
Powerhouse of energy Whipping up a fury, dominating flurry We create the battery |
|
|
|
31 Jul 2019, 13:13
Сообщение
#440
|
|
![]() 😸🧡✊✌️ Сообщений: 16 495 Спасибо сказали: 3401 раз |
В fasm не сделать батник.
-------------------- Я слежу за тобой!
tolic.narod.ru![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
|
![]() ![]() |
| Текстовая версия | Сейчас: 20 December 2025 - 12:28 |
|
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |
|