Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обсуждение инженерного анализа
DF2 :: ФОРУМЫ > Игровые форумы > Heroes of Might & Magic III > Моды
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9
Berserker
Но если указанный файл содержит только геройские структуры и функции (возможно, на пару с cpp), то вреда от его публикации ведь не будет? smile2.gif
Sav
Анализ кода игры и сбор реверсерской информации — такой же труд, как и написание нового кода по этой информации. Лично для меня анализ даже более важен. Поэтому отношение к заголовочникам у меня такое же, как к коду, а к базам ещё более бережное.

Многие люди работают над проектами с открытым исходным кодом — и то, что они его открывают, достойно уважения. Но для меня такой режим разработки неприемлем. Практика показала, что в вопросе модификации игры меня серьёзно мотивирует только работа на развитие и продвижение большого проекта. А продвижение в немалой степени обеспечивается за счёт вещей, которые удалось сделать мне и не удалось (или не было попыток) сделать в других проектах. Включая глубокий анализ кода игры и возможность за счёт этого более качественно исправлять её ошибки и реализовывать нововведения. Так что выкладывание каких-то частей исходников не вписывается в мой образ деятельности как моддера — у меня нет желаниия работать в таком режиме.
Если рассматривать взаимодействие с «остальным миром», то, грубо говоря, есть два варианта моей моддерской деятельности: либо я работаю на развитие продвижение только HotA (и код не выкладывается публично), либо я вообще не занимаюсь моддингом (и код не выкладывается, потому что просто не был написан). С учётом того, что аудитория HotA не так уж и мала, думаю, первый вариант всё же более полезен «остальному миру».

Врочем, когда я буду уверен, что больше не стану работать над серьёзным проектом в Героях, я, скорее всего, выложу свои наработки.
baratorch
Тот HOMM3.h все-таки не из хоты, а из ХД.
Я при необходимости брал какие-то вещи из хотовского HOMM3.h в ХДшный.
Исходники ХД же я одно время вообще выкладывал в открытый доступ, позднее изредка передавал кому-нибудь с условием нераспространения.
Так что я причина утечки из хоты.
Sav
Я сравнивал с выкладывавшимся вариантом из HD 3.15f, там есть отличия. Например, содержимое Base.h соответствует хотовскому, а не HD-шному варианту (есть TFileStream, TArray и т. п.). Поэтому это взялось скорее из какого-то другого источника и от хотовских исходников.
Но по содержательной части добавлений относительно выкладывавшихся исходников HD и BattleFigures там немного, так что всё это не столь важно.
baratorch
Да, TFileStream, TArray, оставшихся в наследство после первичной конвертации исходников Хоты из делфи в с++
в ХД никогда не было, нет и сейчас.

Richter
Как то видел функцию передающую управление Маскировкой, кажется by MoP. Если кто знает сориентируйте где найти или запостите пожалуйста.
MasterOfPuppets
Исходники MoP (Disguise.txt):
Код
; case 04 - Подкрепления и новые заклинания
1C778 FF7508;          PUSH DWORD PTR SS:[EBP+8] - Номер заклинания
1C77B 51;              PUSH ECX - ИИ-чность игрока-хозяина
1C77C 57;              PUSH EDI - уровень заклинания
1C77D E8874DFEFF;      CALL MoP.00401509 <- хук Werd.dll
1C782 E9F4FEFFFF;      JMP MoP.0041C67B
Richter
Здравствуйте форумчане.
После смещения слотов существ в экране героя, полностью перестал отображаться опыт существ (см.скриншот). Также стало невозможным передача знамени полководца слоту существа.
Смещал две маски + само изображение, больше не нашел. Наверно вряд ли кто то сталкивался, однако надеюсь на помощь. Может кто нибудь подскажет в чем я не доглядел.
MasterOfPuppets
Посмотрел, как сам смещал. Наверное, дело в этом:

DF234 23020000; - смещение текста кол-ва существ
DF285 23020000;
DF2D6 23020000;
DF32A 23020000;
DF37E 23020000;
DF3D2 23020000;
DF426 23020000;
3000D7 1402; смещение при включенном опыте
Richter
Подскажите есть возможность(триггер, хук, лом железный)) поймать AI на постройке здания в городе? Например (!?)AI построил здание, далее (!!) ресивер.
MasterOfPuppets
Может, пригодится.
Реализация городской реликвии, позволяющей строить дважды в день в MoP v.4. Работает как для человека, так и для ИИ.

Код
;*******************************************************************
; Реликвия №35 - Плеть Погонщика Рабов
1BF265 807D0C00;              CMP BYTE PTR SS:[EBP+C],0
1BF269 7439;                   JE SHORT MoP.005BF2A4
1BF26B 83FF14;                 CMP EDI,14
1BF26E 7434;                   JE SHORT MoP.005BF2A4
1BF270 8B0D38956900;           MOV ECX,DWORD PTR DS:[699538]
1BF276 80B9D8F6010002;        CMP BYTE PTR DS:[ECX+1F6D8],2
1BF27D 7D20;                   JGE SHORT MoP.005BF29F
1BF27F 0FBE4601;               MOVSX EAX,BYTE PTR DS:[ESI+1]
1BF283 85C0;                    TEST EAX,EAX
1BF285 7C08;                   JL SHORT MoP.005BF28F
1BF287 0FBE840879F80100;       MOVSX EAX,BYTE PTR DS:[EAX+ECX+1F879]
1BF28F 50;                      PUSH EAX
1BF290 E84BC7E6FF;             CALL MoP.0042B9E0
1BF295 84C0;                    TEST AL,AL
1BF297 7506;                   JNZ SHORT MoP.005BF29F
1BF299 C6460202;              MOV BYTE PTR DS:[ESI+2],2
1BF29D EB05;                   JMP SHORT MoP.005BF2A4
1BF29F E8F0CAF4FF;             CALL MoP.0050BD94

10BD94 0FBE1E;                     MOVSX EBX,BYTE PTR DS:[ESI] - номер города
10BD97 6BC370;                    IMUL EAX,EBX,70 - размер структуры городских реликвий
10BD9A 80B8B20C7D0000;           CMP BYTE PTR DS:[EAX+7D0CB2],0 - есть ли Плеть?
10BDA1 7417;                      JE SHORT MoP.0050BDBA - нет
10BDA3 69C3A00F0000;              IMUL EAX,EBX,0FA0 - размер структуры городских переменных
10BDA9 80B83BF8A30200;           CMP BYTE PTR DS:[EAX+2A3F83B],0 - использовалась ли Плеть на этом ходу?
10BDB0 7508;                      JNZ SHORT MoP.0050BDBA - да
10BDB2 C6803BF8A30201;           MOV BYTE PTR DS:[EAX+2A3F83B],1 - использовать, не запрещать строить второй раз на этом ходу
10BDB9 C3;                         RETN
10BDBA C6460201;                 MOV BYTE PTR DS:[ESI+2],1 если использовалась - запретить строить второй раз на этом ходу
10BDBE C3;                         RETN
;*******************************************************************
igrik
Цитата(Richter @ 07 Jul 2019, 21:22) *
Подскажите есть возможность(триггер, хук, лом железный)) поймать AI на постройке здания в городе? Например (!?)AI построил здание, далее (!!) ресивер.

Код
!!SN:Ex1/1/6025702/(AI_Building);

!?FU(AI_Building)&-1000;
!!SN:X?y1;
; получаем номер города
!!VRy2:Sy1 +24;
!!UN:Cy2/4/?y3;
!!UN:Cy3/1/?y5;  y5 - номер города
; получаем номер строения
!!VRy2:Sy1 +8;
!!UN:Cy2/4/?y3;
!!VRy4:Sy3 +8;
!!UN:Cy4/4/?y6;  y6 - номер здания
!!IF:M^AI строит здание: {%Y6}
В городе: {%Y5}^;
Richter


Igrik, спасибо. Работает как и.... великолепно!!!
Richter
Очередной вопрос. Как вычислить значение (зеленый прямоугольник на скриншоте) зная откуда безусловный переход и куда.
Необходимо для работы с !!UN:C и !!SN:M.
Пример для использования: Выделяю массив числовой с помощью !!SN:M, необходимо написать на ERM JMP из одного места в этот массив.
Поскольку в !!SN:M0/?y2/0; адрес всегда разный, то и необходимо вычислить что на скриншоте. Если непонятно написал , поправьте пожалуйста.
hippocamus
Цитата(Richter @ 11 Jul 2019, 21:15) *
Очередной вопрос. Как вычислить значение (зеленый прямоугольник на скриншоте) зная откуда безусловный переход и куда.
Необходимо для работы с !!UN:C и !!SN:M.
Из регистров CS:IP взять текущую точку выполнения и отнять нужный адрес, чтобы получить смещение? Всё-таки не совсем понял, что нужно.
Цитата
Пример для использования: Выделяю массив числовой с помощью !!SN:M, необходимо написать на ERM JMP из одного места в этот массив.
Прыжок в сегмент с данными... А в любом ли случае тебе позволит это операционка? А главное - антивирусы...
Richter
Пробую описать подробно:
Код
!?FU(binary)
!!SN:M3/800/0/1; Создание нового числового массива.
!!SN:M3/?y1/0;    Узнать адрес первого элемента слота.
!!VRy2:Sy1 -1;
!!UN:Cy2/1/233;
!!UN:Cy1/5/?"G"  - Попытка воткнуть команду JMP 4787854 (адрес для примера) в начало (в данном случае) массива,  для этого и нужно правильно вычислить число (скрин ниже)

!?PI;
!!FU(binary):P;



MasterOfPuppets
Занести адрес массива в какую-нибудь глобальную переменную, а прыжок исправить на jmp [переменная].
Или не?
Вообще, вроде в ЭРЕ давно есть способы вставки хука, а тебе он и нужен, как я понял.
tolich
Цитата(Richter @ 12 Jul 2019, 12:02) *
Пробую описать подробно:

Цитата(hippocamus @ 12 Jul 2019, 00:58) *
Из регистров CS:IP взять текущую точку выполнения и отнять нужный адрес, чтобы получить смещение.

0777A02D - 777A0013 = 8FFDA01A
(байты в команде в обратном порядке, потому что intel)
igrik
Цитата(Richter @ 11 Jul 2019, 21:15) *
Очередной вопрос. Как вычислить значение (зеленый прямоугольник на скриншоте) зная откуда безусловный переход и куда.
Необходимо для работы с !!UN:C и !!SN:M.
Пример для использования: Выделяю массив числовой с помощью !!SN:M, необходимо написать на ERM JMP из одного места в этот массив.
Поскольку в !!SN:M0/?y2/0; адрес всегда разный, то и необходимо вычислить что на скриншоте. Если непонятно написал , поправьте пожалуйста.
Это не самая большая проблема.
Насущный вопрос: как вернуться таким способом назад, в исходное место?
Эровский числовой массив состоит из интов, а чтобы записать команду JMP нужен байт. Можно конечно запилить сначала 3 нопа, а потом JMP и адрес прыжка назад (который тоже еще нужно высчитать!), но как по мне всё это еще тот гемор. Это нужно вычислить адрес переменной массива, которая будет указывать на обратный адрес, потом через UN:C по этому адресу записать нопы и опткод джампа, в следующей перменной массива нужно указать высчитанное смещение назад и правильно его записать обратно в массив, смещение к тому же будет зависеть от длинны массива. В во всём этом винигрете нужно еще не запороть регистры. Ахтунг, одним словом...

И что это за такая интересная команда?!
Код
!!UN:Cy1/5/?"G"

Во первых: UN:C поддерживает только 1, 2 или 4 байта для патчинга.
Во вторых: ?"G" - WTF?!

И еще: не забываем про точки с запятой...
feanor
Не джампьте в память, пацаны, вы матерям еще нужны

а если все-таки ннадо, то делайте примерно так


если свободных регистров нет, а их обычно нет, то можно в стек засунуть, а в конце своего кода высунуть



А вообще именно на этом месте надо все-таки осваивать плагины
Berserker
А почему на этом месте не освоить Erm Hooker 2.0?
XEPOMAHT
Цитата(Richter @ 12 Jul 2019, 12:02) *
!!UN:Cy1/5/?"G" - Попытка воткнуть команду JMP 4787854 (адрес для примера) в начало (в данном случае) массива, для этого и нужно правильно вычислить число (скрин ниже)


Пихать куда-то байткод через ERM - очень неудачное решение для применения ERM. Намного более разумным шагом будет создание собственной dll средствами бесплатного FASM например.

Либо использовать статичное адресное пространство (если нужны дозы БДСМ-байткодинга, пусть и на ERM), которое всегда можно найти, было бы желание:

1. Можно патчить код, выделяющий и очищающий память под основные игровые массивы данных. Через ERM всегда можно прочитать базовый адрес и что-то записать и прочитать за игровыми данными, под которые будет выделена память "сверх нормы". Патчить, естественно, в exe, через dll или bin. Ну а читать и записывать можно через ERM.
2. Можно записывать код в огромное количество NOPS, располагающихся между функциями (если мало, то можно оптимизировать окончания функций - многие имеют повторяющиеся элементы - для кода ставятся прыжки с повторов на один единый участок, для данных кейсов - изменяются их адреса в самих функциях) (если и этого мало, то можно двигать сами функции, расширяя таким образом NOPS, но это уже совсем для каких-то маняков).
3. Можно оптимизировать сами геройские функции, освобождая пространство - вынос повторяющихся линейных участков функций в отдельные функции с установкой их вызовов (будет работать немного медленнее, но зато освободится куча пространства), снижение размера самого кода - использование более коротких, но более затратных для ЦП, команд, например, хорошие результаты даёт добавление прямой команды умножения вместо оптимизационной колбасы из имитации умножения (так же будет работать немного медленнее, но зато освободится куча пространства), а воговский код в exe достаточно топорно собран и без особых проблем ужимается раза вчетверть где-то.

Но.... есть одно но: все эти "процессы" отнимут огромное количество времени - Richter, твой мод выйдет намного намного намного намного быстрее, если всё делать по-человечески через DLL, а не через ж.пу.
hippocamus
Цитата(XEPOMAHT @ 13 Jul 2019, 00:26) *
Пихать куда-то байткод через ERM - очень неудачное решение для применения ERM. Намного более разумным шагом будет создание собственной dll средствами бесплатного FASM например.
Смотря какой код. Если нужно тупо что-то занопить, чтобы не мешало - самое оно. Или что-то поправить в самой инициализации игры. А вот функции, разумеется, лучше использовать нативные, либо писать свои.
Richter
Цитата(MasterOfPuppets @ 12 Jul 2019, 14:30) *
Занести адрес массива в какую-нибудь глобальную переменную, а прыжок исправить на jmp [переменная].
Или не?
Вообще, вроде в ЭРЕ давно есть способы вставки хука, а тебе он и нужен, как я понял.

Неплохая идея. Правда не до конца представляю как это сделать, что бы работало. Спасибо.

Цитата(tolich @ 12 Jul 2019, 16:49) *
0777A02D - 777A0013 = 8FFDA01A
(байты в команде в обратном порядке, потому что intel)

Точно! Блин как я забыл это в расчет взять. А то какие то триллионные значения получались. Спасибо.

Цитата(igrik @ 12 Jul 2019, 17:37) *
Это не самая большая проблема.
Насущный вопрос: как вернуться таким способом назад, в исходное место?
Эровский числовой массив состоит из интов, а чтобы записать команду JMP нужен байт. Можно конечно запилить сначала 3 нопа, а потом JMP и адрес прыжка назад (который тоже еще нужно высчитать!), но как по мне всё это еще тот гемор. Это нужно вычислить адрес переменной массива, которая будет указывать на обратный адрес, потом через UN:C по этому адресу записать нопы и опткод джампа, в следующей перменной массива нужно указать высчитанное смещение назад и правильно его записать обратно в массив, смещение к тому же будет зависеть от длинны массива. В во всём этом винигрете нужно еще не запороть регистры. Ахтунг, одним словом...

И что это за такая интересная команда?!
Код
!!UN:Cy1/5/?"G"

Во первых: UN:C поддерживает только 1, 2 или 4 байта для патчинга.
Во вторых: ?"G" - WTF?!

И еще: не забываем про точки с запятой...

Хорошо и правильно объяснили. Пытался пробовать. Это просто капец. Вообщем пришёл к выводу, что сделать даже часть задуманного через !!SN:M, нужны железобетонные нервы.
Команды !!UN:Cy1/5/?"G" не существует, это эмоциональная составляющая). А точки с запятой, это, да. Спасибо.

Цитата(feanor @ 12 Jul 2019, 21:58) *
Не джампьте в память, пацаны, вы матерям еще нужны

а если все-таки ннадо, то делайте примерно так...

если свободных регистров нет, а их обычно нет, то можно в стек засунуть, а в конце своего кода высунуть

А вообще именно на этом месте надо все-таки осваивать плагины

Про регистры не понял, знаний нет. А плагины потихоньку стараюсь. Спасибо.

Цитата(Berserker @ 13 Jul 2019, 00:04) *
А почему на этом месте не освоить Erm Hooker 2.0?

Это дело. Erm Hooker это просто класс, отдельная бладарность тому кто это сделал, уже использую его правда методом тыка, однако получается. Спасибо. И отдельное Спасибо Вам за создание платформы ERA!

Цитата(XEPOMAHT @ 13 Jul 2019, 02:26) *
Пихать куда-то байткод через ERM - очень неудачное решение для применения ERM. Намного более разумным шагом будет создание собственной dll средствами бесплатного FASM например.

Либо использовать статичное адресное пространство (если нужны дозы БДСМ-байткодинга, пусть и на ERM), которое всегда можно найти, было бы желание:

1. Можно патчить код, выделяющий и очищающий память под основные игровые массивы данных. Через ERM всегда можно прочитать базовый адрес и что-то записать и прочитать за игровыми данными, под которые будет выделена память "сверх нормы". Патчить, естественно, в exe, через dll или bin. Ну а читать и записывать можно через ERM.
2. Можно записывать код в огромное количество NOPS, располагающихся между функциями (если мало, то можно оптимизировать окончания функций - многие имеют повторяющиеся элементы - для кода ставятся прыжки с повторов на один единый участок, для данных кейсов - изменяются их адреса в самих функциях) (если и этого мало, то можно двигать сами функции, расширяя таким образом NOPS, но это уже совсем для каких-то маняков).
3. Можно оптимизировать сами геройские функции, освобождая пространство - вынос повторяющихся линейных участков функций в отдельные функции с установкой их вызовов (будет работать немного медленнее, но зато освободится куча пространства), снижение размера самого кода - использование более коротких, но более затратных для ЦП, команд, например, хорошие результаты даёт добавление прямой команды умножения вместо оптимизационной колбасы из имитации умножения (так же будет работать немного медленнее, но зато освободится куча пространства), а воговский код в exe достаточно топорно собран и без особых проблем ужимается раза вчетверть где-то.

Но.... есть одно но: все эти "процессы" отнимут огромное количество времени - Richter, твой мод выйдет намного намного намного намного быстрее, если всё делать по-человечески через DLL, а не через ж.пу.

А вот так на данный момент и действую, вроде получается, времени требует много, чтобы не порушить код.
Динамические библиотеки вообще не знаю с чего начать. Искал видео на ютубе, непонятно нифига. Вообщем как не умел, так и не умею. Как бы то нибыло мод будет закончен. Было бы здоровье как говорится.
Спасибо.
Может кто нибудь сможет написать пустую DLL со статическими адресами для использования?
tolich
Цитата(feanor @ 12 Jul 2019, 19:58) *
если свободных регистров нет, а их обычно нет

Код
push 71231312h
ret
Berserker
push/ret портит предсказание процессора по переходам, mov reg32, value, jmp reg32 лучше.
tolich
Не понимаю, чему тут портиться: если пренебречь ситуациями вроде переполнения стека, переход предсказуем, как чаепитие в Англии в 17:00.
И, да: jmp value чемпион.
Etoprostoya
Да и в большинстве случаев производительность не нужна.
Ещё можно сохранять регистры в регистрах с плавающей запятой FPU. Насчёт регистров SSE не уверен, но вроде MoP с ними работал.
MasterOfPuppets
Цитата(Berserker @ 13 Jul 2019, 14:52) *
push/ret портит предсказание процессора по переходам, mov reg32, value, jmp reg32 лучше.

В каком случае это критично?
А то в WERD вся библиотека игровых функций на пуш-ретах.
Цитата
Насчёт регистров SSE не уверен, но вроде MoP с ними работал.

Использовал для вычислений с плавающей запятой и для хранения и копирования 8- и 16-байтных массивов. Сохранять в них регистры процессора? Не, только push и pushad, да и то по допустимому минимуму.
XEPOMAHT
Цитата(Richter @ 13 Jul 2019, 10:34) *
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
Berserker
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 его нарушают, что определённо влияет на производительность в худшую сторону. Но с учётом всего навороченного в игре и требований это может быть абсолютно незаметно.
tolich
Цитата(Berserker @ 14 Jul 2019, 22:01) *
Формат файлов кампаний:
Heroes 3 Campaign (h3c) format after unpacking (gz).

h3c - gzip - архив, состоящий из нескольких частей, каждая со своим gzip-заголовком.
Каждая карта находится в отдельной части. Заголовок и список зон — в первой части.
При распаковке все части распаковываются в один непрерывный файл. Не надо так.
Berserker
С целью парсинга и извлечения можно распаковывать в один. Запаковывать обратно нужно в указанном тобой виде, согласен.
Richter
Решился заняться созданием dll

Как ни смешно, дальше двинуться не получается
Может у кого нибудь есть желание обсудить эту тему)

Как дальше на FASM создать dll, скажем начать выполнение с адреса 4E3287h
далее код....... потом чтобы программа дальше продолжала работать.
Может немного не грамотно обрисовал. Надеюсь понятно)
UnSchtalch
Цитата(Richter @ 30 Jul 2019, 21:47) *
Решился заняться созданием dl
.....
Как дальше на FASM создать dll, скажем начать выполнение с адреса 4E3287h
далее код....... потом чтобы программа дальше продолжала работать.
Может немного не грамотно обрисовал. Надеюсь понятно)


Философский вопрос -- тулчейн того же mingw по каким-то внешним причинам нельзя?

Сгенерировать из .asm .o а их уже линковать через ld.exe?
Richter
Цитата(UnSchtalch @ 30 Jul 2019, 23:56) *
Философский вопрос -- тулчейн того же mingw по каким-то внешним причинам нельзя?
Сгенерировать из .asm .o а их уже линковать через ld.exe?

Благодарю за ответ на мой пост, но то что вы написали. Непонятно мне вообще)
igrik
Цитата(Richter @ 30 Jul 2019, 19:47) *
Решился заняться созданием 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);
UnSchtalch
Цитата(Richter @ 31 Jul 2019, 02:39) *
Цитата(UnSchtalch @ 30 Jul 2019, 23:56) *
Философский вопрос -- тулчейн того же mingw по каким-то внешним причинам нельзя?
Сгенерировать из .asm .o а их уже линковать через ld.exe?

Благодарю за ответ на мой пост, но то что вы написали. Непонятно мне вообще)



Перевожу на русский:
В fasm можно сделать format binary . Получить так называемый объектный файл.

Есть набор утилит MinGW, который включает в себя в том числе линковщик, который позволяет собрать из объектников в том числе и dll.
Документация есть тут . Помимо этого может пригодиться вот этот раздел . Там описана специфика под винду.

P.S.
А все же, зачем на голом asm? Компиляторы того же С давно дают сравнимый и превосходящий по скорости код. А возни на порядок меньше
MasterOfPuppets
В fasm можно сделать и dll, и exe, и ещё кучу форматов без сторонних компоновщиков.
Как делать? Читайте документацию, изучайте примеры.
Небольшая популяризация фасма в геройском моддинге связана, видимо, с моими в нём скромными успехами. Но я просто выбрал инструмент, который мне нравится, а не лучший для всех.
tolich
В fasm не сделать батник.
MasterOfPuppets
И avi, да.
Richter
Цитата(igrik @ 31 Jul 2019, 09:53) *
А С++ не?
По С++ вот тема (link), вот тема (link)


Херомант посоветовал в одном из постов выше. Думаю, дай попробую. С радостью и C++ поизучал. Пока с С знаком меньше чем с ассемблером. Пытался в фасме прерывание поставить про которое вы мне написали Igrik, что то он не понимает. Может это для Visual Studio. Вообщем нужно учиться.

Цитата(UnSchtalch @ 31 Jul 2019, 11:46) *
Перевожу на русский:
В fasm можно сделать format binary . Получить так называемый объектный файл.
Есть набор утилит MinGW, который включает в себя в том числе линковщик, который позволяет собрать из объектников в том числе и dll.
Документация есть тут . Помимо этого может пригодиться вот этот раздел . Там описана специфика под винду.
P.S.
А все же, зачем на голом asm? Компиляторы того же С давно дают сравнимый и превосходящий по скорости код. А возни на порядок меньше


Да вы чего, может это и не трудно...лучше я пойду другим путем.Спасибо.

Цитата(MasterOfPuppets @ 31 Jul 2019, 14:43) *
В fasm можно сделать и dll, и exe, и ещё кучу форматов без сторонних компоновщиков.
Как делать? Читайте документацию, изучайте примеры.
Небольшая популяризация фасма в геройском моддинге связана, видимо, с моими в нём скромными успехами. Но я просто выбрал инструмент, который мне нравится, а не лучший для всех.

Успехи отличные. Как интерес поднялся к героям 3! Сколько видео со стримами и обзорами и везде десятки тысяч просмотров.
А про документацию надо было сразу заняться как посоветовали однажды. Постараюсь на днях полностью обрисовать свои мод. Спасибо.
XEPOMAHT
Цитата(Raistlin @ 27 Aug 2021, 00:51) *
Советы и пожелания с удовольствием выслушаю.

Скачать базу


Чем открыть?



Пишите уже версию IDA Pro, под которую база сохранена (в идеале конечно 6.5 и ниже, с которыми обычно не бывает проблем, а вот если выше - беда, ничем не открыть hanged.gif ), чтобы не скачивать впустую.
Raistlin
К сожалению, я работал в седьмой... А каких-то способов конвертации нет?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.