Current time: 24.03.2024, 01:45 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Вопросы по моддингу
» (обсуждаем моддинг здесь)
Author Message
XEPOMAHT Offline
Moderators

Posts: 2265
Post: #1726

(10.02.2021 17:00)Raistlin Wrote:  Я пользуюсь готовым API, где, по идее, все потенциальные проблемы уже решены.

Лично я им не доверяю и пользуюсь старыми и проверенными дедовскими методами. Т.к. в готовом API хук ставит программа по своим шаблонам и там совершенно не известно, что при этом, например, происходит с затёртым кодом, куда уезжает при этом стек и где и как произойдёт возврат в оригинальный код. А поддержки нестандартных соглашений и хуков хуков там вообще нет.

(10.02.2021 17:00)Raistlin Wrote:  Если Вы знаете, куда нужно ставить хук (хотя-бы примерно, я разберусь), то я очень прошу Вас поделиться со мной этой информацией.

На сам вызов функции, чтобы целиком заменить её собственной. На 4A82B7h.

(10.02.2021 17:00)Raistlin Wrote:  почему до выполнения кода функции, работающей со стеком, нужно записывать туда какие-то данные, например, из какого-то регистра?

Необходимо сохранять позицию стека в начале функции, чтобы потом возвратиться к нему в конце перед выходом из функции. Как в поговорке: "намусорил в стеке - прибери за собой".
(This post was last modified: 10.02.2021 17:30 by XEPOMAHT.)
10.02.2021 17:22
Find all posts by this user Quote this message in a reply
igrik Offline
Administrators

Posts: 2807
Post: #1727

(10.02.2021 16:15)XEPOMAHT Wrote:  Вообще, установка хуков прямо на начало функций - удел либо профессиональных программистов, либо бессовестных лентяев. Т.к. при этом можно очень легко испортить стек и словить утечки памяти и разнообразные нарушения работы родительских функций.
Конкретно в этом случае установлен HiHook (метод SPLICE_), который и может быть установлен только на начало функции. По другому ставиться он не может, потому что он заточен только на установку на начало функции. Метод CALL_ в HiHook заточен только на установку на вызов геройской функции.
Ты не разбирался в API patcher_x86, но рассказываешь это так, словно твои слова истина в последней инстанции. А больше половины хуков в HD являются HiHook'ами. Я стараюсь использовать именно их в своих плагинах, потому что они предоставляют максимально читаемый и хорошо понимаемый код.
Для сохранения регистров хуки в патчере стаятся через пыжок (JMP), чтобы их можно было наиболее безопасно сохранить, а потом восстановить.

(10.02.2021 17:22)XEPOMAHT Wrote:  Лично я им не доверяю и пользуюсь старыми и проверенными дедовскими методами. Т.к. в готовом API хук ставит программа по своим шаблонам и там совершенно не известно, что при этом, например, происходит с затёртым кодом...
С таким подходом каждый тогда должен изобрести свой велосипед, и вот тогда это будет полное мясо...

В функции посещения Арены последний аргумент это не пакованные координаты, а булева переменная человек или ИИ
Code:
char __thiscall AdvMng_4_Arena(_AdvMgr_ *AvdMgr, _Hero_ *hero, _MapItem_ *object, _bool8_ isHuman)


game bug fixes extended.dll || My Plugins || My GitHub
10.02.2021 18:08
Visit this user's website Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #1728

(10.02.2021 17:22)XEPOMAHT Wrote:  Необходимо сохранять позицию стека в начале функции, чтобы потом возвратиться к нему в конце перед выходом из функции. Как в поговорке: "намусорил в стеке - прибери за собой".
Хорошая поговорка, говорит сама за себя. 132

Quote:Лично я им не доверяю и пользуюсь старыми и проверенными дедовскими методами. Т.к. в готовом API хук ставит программа по своим шаблонам и там совершенно не известно, что при этом, например, происходит с затёртым кодом, куда уезжает при этом стек и где и как произойдёт возврат в оригинальный код. А поддержки нестандартных соглашений и хуков хуков там вообще нет.
Да, Вы правы - за удобство приходится платить контролем и надежностью, но я ведь не единственный, кто это использует, и, вроде как, у всех все работает, а потому в той или иной степени положиться на готовый функционал все-таки можно.

Quote:На сам вызов функции, чтобы целиком заменить её собственной. На 4A82B7h.
Ох, как-то не пошло у меня... Все способы перепробовал: и через API, и напрямую - патчами, но все одно - вылет. Буду думать дальше, вероятнее всего, я просто не знаком с каким-то элементом синаксиса.


Создал новый глобальный мод: WoG Ultra Edition
10.02.2021 18:13
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #1729

igrik, я знаю, что обращались Вы не ко мне, но на всякий случай мне хочется пояснить, что, когда я пробовал переставлять хук, я его переделывал/переоформлял так, чтобы он работал в новом контексте. То есть, я не ставил сплайс в середину функции или еще чего-нибудь в том же духе 148


Создал новый глобальный мод: WoG Ultra Edition
10.02.2021 18:18
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2265
Post: #1730

(10.02.2021 18:08)igrik Wrote:  Ты не разбирался в API patcher_x86, но рассказываешь это так, словно твои слова истина в последней инстанции.

Да, чтобы разобраться в патчере - это как книгу на 100 страниц прочитать, особенно если посмотреть пачтер в отладчике - там суровая жесть, если работу патчей ещё можно без проблем разобрать, то работа хуков патчера - какая-то чёрная магия с кучей разных таблиц и переменных, по которым связать адрес хука с фактическим кодом самого хука вручную выдержит не каждый (т.е. даже наверное антивирусу не подкопаться, что происходит какой-то взлом программы). Теперь знаю что такое SPLICE_, спасибо что объяснили.

(10.02.2021 18:08)igrik Wrote:  А больше половины хуков в HD являются HiHook'ами. Я стараюсь использовать именно их в своих плагинах, потому что они предоставляют максимально читаемый и хорошо понимаемый код.

Не спорю, что удобно, спорю, что непонятно. Особенно мне, когда привык ставить перехват двумя строчками ассемблерного кода, например такого:

Code:
mov [адрес_хука], E8h (или E9h)
mov [адрес_хука+1], адрес_функции

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

(10.02.2021 18:08)igrik Wrote:  С таким подходом каждый тогда должен изобрести свой велосипед, и вот тогда это будет полное мясо...

Да, увы, универсальной dll, которая устраивала бы всех, не существует. Под сугубо личные нужды приходится использовать то, что знаешь/умеешь. Когда я начинал моддить Третьих Героев, первое, что попалось - исходники MoP-а, с которыми было легко втянуться в Ассемблер и начать изменять игру как угодно. На СИ в то время не было в свободном доступе НИЧЕГО, кроме исходников WoG 3.59 (которые ничем не компилировались и были выложены как есть без документации и какой-либо сопроводиловки). Те же слитые структуры вместе со слитыми исходниками феаноровских плагинов появились гораздо позже. В то время уже был патчер, но... я в нём тогда вообще ничего не понял, и сейчас плохо понимаю. Поэтому по-прежнему остаюсь верен тому изобретённому велосипеду, с которого я и начинал этот путь. Пусть сейчас Игрик и другие уважаемые моддеры смотрят на меня как на закоренелого колхозника, не желающего использовать возможности патчера, но я не могу прыгнуть выше головы, увы. Правильное использование вызовов патчера в низкоуровневом коде в каком-нибудь Тифоне - недостижимо для моего низкого уровня. 105
10.02.2021 19:34
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16449
Post: #1731

igrik всё верно говорит. Стоит по возможности использовать высокоуровневые перехватчики, которые умеют выполнять затёртый код, а также переписывать смещения в прыжках и вызовах. В Эре это функция Splice, которая к тому же быстрее патчеровской и потокобезопасная.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
10.02.2021 20:39
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #1732

Довел функцию до ума, но работать она все равно не начала... https://pastebin.com/8nGGeUqG

Berserker, может мне и вправду на Вашу функцию перейти? Только вот мне непонятно, что делать с последними двумя параметрами, не могли бы Вы подсказать мне, как правильно их задать?


Создал новый глобальный мод: WoG Ultra Edition
10.02.2021 22:03
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16449
Post: #1733

Я записал себе в TODO добавить в ближайшее время новое событие OnLocalEvent. Если не трудно, переключись пока на другую задачу.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
10.02.2021 22:30
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #1734

Berserker, да, конечно. Если вдруг я случайно создал впечатление, что функция арены как-то связана с новой механикой, для которой нужен новый "триггер", то прошу прощения, это не так. Сейчас я отложу оба дела и пойду по пути наименьшего сопростивления, у меня в планах есть много чего еще.
Кстати, название OnLocalEvent уже занято стандартным триггером LE, а потому назвать желательно как-то иначе. Может быть, OnMapPointEnter?


Создал новый глобальный мод: WoG Ultra Edition
10.02.2021 23:21
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16449
Post: #1735

Raistlin, не занято. Генерируется OnLocalEvent x/y/z событие, а не просто OnLocalEvent.
Тебе нужно и для ЕРМ и для плагинов, так?


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
11.02.2021 02:24
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #1736

Благодарю за содействие! Если честно, лично для меня это не имеет значения - я уже умею и так, и так. Тем не менее, если это не сложно реализовать, то я, конечно же, был бы очень рад иметь обе возможности.


Создал новый глобальный мод: WoG Ultra Edition
11.02.2021 03:48
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #1737
Сердце 
Привет, помогите пожалуйста с еще одной задачкой: я убрал из Крепости верфь, но в то же время вытащил спец. строение 23, которое по умолчанию неактивно. Что нужно сделать, чтобы задать ему название и описание? В BLDGSPEC.TXT теперь есть неиспользуемая строчка, можно ли сделать так, чтобы данные брались из нее? Заранее спасибо!


Создал новый глобальный мод: WoG Ultra Edition
16.02.2021 22:45
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2265
Post: #1738

(16.02.2021 22:45)Raistlin Wrote:  Что нужно сделать, чтобы задать ему название и описание?

Адрес строки с названием - в таблицу Town_BuildingsNames.
Адрес строки с описанием - в таблицу Town_BuildingsDescriptions.
16.02.2021 23:11
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1348
Post: #1739

Спасибо, но это, в принципе, мне и так ясно. То, что нужны именно эти таблицы, понятно из функции Load_Bldgspec_TXT (5B9850), весь вопрос в том, как правильно записать туда что-то свое. Вы случайно не знаете, в каком порядке там идут данные?


Создал новый глобальный мод: WoG Ultra Edition
16.02.2021 23:39
Find all posts by this user Quote this message in a reply
XEPOMAHT Offline
Moderators

Posts: 2265
Post: #1740

(16.02.2021 23:39)Raistlin Wrote:  Вы случайно не знаете, в каком порядке там идут данные?

В порядке возрастания от первой спецпостройки до последней. Из памяти игры в отладчике эта таблица прекрасно читается, если что.
16.02.2021 23:57
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group