Сейчас на форуме: Magister Yoda, vasilevradislav (+5 невидимых) |
eXeL@B —› Крэки, обсуждения —› Исследование Heroes 3 |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 12 января 2016 13:05 · Личное сообщение · #1 Добрый день. Думаю heroes 3 в представлении не нуждаются. Решил заняться исследованием данной игры, никакой конкретной цели не преследую, просто для себя + подкачать скил ассемблере и руками пощупать, что такое исследование, попробовать поделать небольшие изменения - поиграться) Решил легкие задачки не брать типа изменения кол-во существ, золото over 9000 - не сложно да и artmoney выручит. Потому поставил задачу по-сложнее, как вы знаете в данной игре могут быть только 8 игроков(8 цветов), хотелось бы сделать больше. Потому как мне стоит подойти к решению данной задачи лучше? Пользуюсь ollyDBG и IDA. Собственно сразу столкнулся с проблемой. Количество игроков это не статическая переменная так просто ее не найти. Попробовал поискать тот момент, когда генерируем случайный шаблон для карты(Там думается мне передается кол-во игроков в параметрах) - снова облом. Попробовал найти ту часть где идет прибавление дней/недель/месяцев нашел лишь инициализацию и тот момент когда заносим новый день в стек дальше действий с регистром не нашел - забил. Теперь пробую найти упоминание слов типа player и проч. Может кто-то что-нибудь умной посоветует? Какой-нибудь интересный подход для обнаружения этого числа? |
|
Создано: 12 января 2016 13:14 · Личное сообщение · #2 |
|
Создано: 12 января 2016 13:19 · Поправил: KordDEM · Личное сообщение · #3 |
|
Создано: 12 января 2016 13:42 · Поправил: VodoleY · Личное сообщение · #4 KordDEM когдато менял сейвы героев(добавлял предметы) там все банально.. а вообще не занимайтесь дурью. под герои есть редактор карт .. для создания собственных квестовых. бери лучше редактор и смотрите что он делает. или вы решили движок геороев выдирать? дык это дурь. помница были карты от GREGa вроде так.. оочень лютые карты.. для тех, у кого уровня умения в игре ипасебл ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... |
|
Создано: 12 января 2016 13:43 · Личное сообщение · #5 На этом форуме у вас спросят детали: где искать, что искать(бинарники, адреса), и конечно же спросят что же вы сделали для этого сами. Уже существует минимум 2 проекта, которые занимаются разбором и переписыванием homm3: http://forum.vcmi.eu/portal.php http://forum.df2.ru/showtopic=7188 Во втором случае разработчик скорее всего русскоязычный, и по всей видимости свой проект не только не забросил но и активно ----- все багрепорты - в личные сообщения |
|
Создано: 12 января 2016 13:46 · Личное сообщение · #6 |
|
Создано: 12 января 2016 13:49 · Личное сообщение · #7 |
|
Создано: 12 января 2016 13:56 · Личное сообщение · #8 VodoleY пишет: KordDEM когдато менял сейвы героев(добавлял предметы) там все банально.. а вообще не занимайтесь дурью. под герои есть редактор карт .. для создания собственных квестовых. бери лучше редактор и смотрите что он делает. или вы решили движок геороев выдирать? дык это дурь. помница были карты от GREGa вроде так.. оочень лютые карты.. для тех, у кого уровня умения в игре ипасебл В механике игры больше 8 человек нельзя создавать даже в редакторе карт. Т.к. всего 8 цветов(красный, синий и т.д). Да и не карту мне одну надо, а собственно механику поменять. HandMill пишет: На этом форуме у вас спросят детали: где искать, что искать(бинарники, адреса), и конечно же спросят что же вы сделали для этого сами. Уже существует минимум 2 проекта, которые занимаются разбором и переписыванием homm3: http://forum.vcmi.eu/portal.php http://forum.df2.ru/showtopic=7188 Во втором случае разработчик скорее всего русскоязычный, и по всей видимости свой проект не только не забросил но и активно пилит. Был на втором форуме) Там люди ленятся и либо не понимают некоторый моменты касательно низкоуровневого программирования, либо я чего-то не понимаю. Но в любом случае хочется самому поковырятся) Кое-какие адреса предоставить могу - находил(да и писал вроде где искал), но основная проблемы в том, что я не могу найти момент где описано кол-во игроков. |
|
Создано: 12 января 2016 14:13 · Личное сообщение · #9 KordDEM пишет: Был на втором форуме) Там люди ленятся и либо не понимают некоторый моменты касательно низкоуровневого программирования, либо я чего-то не понимаю. Но в любом случае хочется самому поковырятся) вы начали с того что не выложили бинарник. Разных версий homm3 было помоему не мало, и это не считая всяких аддонов. Во всех них, скорее всего, разные исполнительные файлы, соответственно адреса и данные будут разными. Для выполнения вашей задачи нужно понимать принципы игры, именно поэтому я вам и предложил попробовать связаться с энтузиастами которые занимаются этим направлением. ----- все багрепорты - в личные сообщения |
|
Создано: 12 января 2016 16:31 · Личное сообщение · #10 |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 12 января 2016 17:31 · Личное сообщение · #11 KordDEM пишет: Потому поставил задачу по-сложнее, как вы знаете в данной игре могут быть только 8 игроков(8 цветов), хотелось бы сделать больше. Потому как мне стоит подойти к решению данной задачи лучше К примеру, в dota2 кол-во игроков, судя по всему, задано, через #define и инлайинится везде. Code:
Под каждого игрока выделяется массив данных. В случае с heroes 3, по аналогии, я полагаю, Вам стоит искать цикл обработки движений ботов в игре на общей карте, он должен крутится по итерациями из кол-ва ботов, т.е. после нажатия окончания хода, мы должны попасть в этот цикл. Выцепите эту переменную - потяните за всю цепочку. Ещё наверняка должны быть функции типа AddBot, SetBotDifficulty - смотрите все строки, авось найдете что нужно (у меня с DUNE 2000 так прокатывало) |
|
Создано: 12 января 2016 19:28 · Личное сообщение · #12 |
|
Создано: 12 января 2016 20:14 · Личное сообщение · #13 Для начала, разумно будет найти референсы к ресурсам, и от них плясать (всё равно ведь придётся) вот, например: PRBLUE.PCX PRGREEN.PCX PRORANGE.PCX PRPURPLE.PCX PRRED.PCX PRROSE.PCX PRTAN.PCX PRTEAL.PCX найдёшь массив указателей на эти имена - выйдешь на что-то похожее на цикл инициализации. покопай сначала там Добавлено спустя 2 часа 24 минуты А вообще, задача тянет на отдельный мод, с кучей сопутствующих изменений. Во-первых, самое простое - это расширение массивов с цветами игроков (на один я уже указал, и еще один - непосредственно локализорванные названия цветов) Во-вторых, скорей всего придётся еще править Players.pal на предмет новых цветов (я так понимаю, влияет на цвет флагов у объектов, городов и героев) В-третьих, просмотр кучи циклов на предмет константы 8 В-четвёртых, я могу ошибаться, так как сильно не вникал - но похоже, что присутствие или отсутствие на карте игрока определённого цвета задаётся массивом булей в динамической памяти, и массив этот угадайте какого размера. Вот, например, код: Code:
(Смотрю на HoMM 3 Полное собрание, MD5 exe модуля - 55BE6A65157A1D4F6912817AD96E33C8 ) | Сообщение посчитали полезным: KordDEM |
|
Создано: 13 января 2016 08:37 · Поправил: KordDEM · Личное сообщение · #14 Code:
Скорее всего придется создавать свой аналогичный файлик. Соответственно как собственно сами файлики найти и редактировать в случае Players.pal? Для каждого цвета присутствует подобный код: Code:
|
|
Создано: 13 января 2016 09:34 · Поправил: -=AkaBOSS=- · Личное сообщение · #15 сами изображения лежат в data\h3bitmap.lod чем работать с ними - это уже в гугл call sub_617492 - оператор new, выделение памяти call sub_44FFA0 - конструктор какого-то класса. И аргументы всё-таки - прямоугольник вывода. Вот эти вот цветные рамки и есть эти самые PRRed.pcx и так далее. |
|
Создано: 13 января 2016 22:16 · Поправил: KordDEM · Личное сообщение · #16 Спасибо пнули в верном направлении, начала постепенно понимать, что происходит в коде, как строятся картинки и в каком направлении вообще пытаться плыть) Потому решил начать с начала с генерации случайной карты. Такой вопрос как понять, что за функция вызывается? В привычном ассемблере заносим номер команды в eax и на int 20h например происходит прерывание с этой командой и соответственно параметры - что в какие побочные регистры записано. А то я не особо понимаю, что за команды происходят. Например Code:
Понимаю, что из файла smalfont.fnt берется строка и заливается на картинку. В данном куске и последующий 8 похожих кусках формируется подобная картинка(1) [url= В этом месте формируются часть с флагами, тут придется изменить def файл добавив свой флаг. Code:
В этой части вроде идет подгрузка уже больших флагов тут тоже хотелось бы понять, потому объясните пожалуйста как исполняются команды в этом ассме) Code:
f645_13.01.2016_EXELAB.rU.tgz - 1.png |
|
Создано: 14 января 2016 10:59 · Поправил: -=AkaBOSS=- · Личное сообщение · #17 KordDEM пишет: Нужно из fnt вытащить цифру 9(она там есть) и впихнуть ее то же на картинку Текстуры рисовать надо. Цифры на кнопках не программно заданы, а текстурами RanNum0.def, RanNum1.def и т.д до 8. Плюс если добавить еще одну, интерфейс разъедется - нужно перетасовать другие кнопки (мб размер им уменьшить или типа того). KordDEM пишет: объясните пожалуйста как исполняются команды в этом ассме) вроде ж код из иды, но имена функций от чего-то не распознались Code:
Как видно, в цикле проходит обработка по строке "rbygopts" ("RBYGOPTS"), каждый символ которой подставляется в формат "AOFLGB%c.DEF". Таким образом обрабатываются файлы "AOFLGBR.DEF", "AOFLGBB.DEF", "AOFLGBY.DEF" и так далее. Тоесть, достаточно добавить еще одну букву (например, Z) и тогда будет загружен соответствующий файл "AOFLGBZ.DEF" | Сообщение посчитали полезным: KordDEM |
|
Создано: 14 января 2016 12:23 · Личное сообщение · #18 Code:
Да сегодня чуть, ниже опустился тоже нашел этот момент. Тогда вопрос - зачем нужен файл "smalfont.fnt" и что за строки он подгружает? Нужно ли как-то от него ожидать подлянки? Попробую с текстурами к вечеру разобраться и попробовать что выйдет, отпишусь о результатах чуть позже. |
|
Создано: 14 января 2016 12:40 · Личное сообщение · #19 |
|
Создано: 14 января 2016 14:06 · Личное сообщение · #20 Файлики с текстурами сделал, залил в ресурсы, теперь возник такой вопрос. После того как отобразили RanNum8.def нам нужно переделать jmp не на тот кусок где загрузка RanRand.def идет, а вставить свой кусок кода аналогичный предыдущим с загрузкой RanNum9.def и только после него делать прыжок на загрузку RanRand.def. В WinHex можно вроде бы только редактировать какие-то отдельные участки вставлять какой-то дополнительный код не получится. |
|
Создано: 14 января 2016 14:42 · Поправил: -=AkaBOSS=- · Личное сообщение · #21 KordDEM пишет: В WinHex можно вроде бы только редактировать какие-то отдельные участки вставлять какой-то дополнительный код не получится. Не, просто так винхексом лучше не лезть. Есть такие понятия как PEформат, секции и прочее. Расписывать с нуля утомительно, мб кто-нибудь туторы порекомендует? И к тому же, мало просто скопировать код. Опуская лишние детали, кнопки создаются вот так: Code:
Большую часть аргументов можно понять интуитивно: Первые четыре - это координаты x и y, ширина и высота. Нужно скорректировать координаты и размеры элементов, чтобы новая кнопка не оказалась под/над какой-либо из существующих. Пятый аргумент - уникальный идентификатор, который, вероятней всего, участвует в определении кода, выполняющегося по нажатию кнопки. В конкретном случае, ничего особенно умного происходить не должно - кнопка переключается в состояние "нажата", а все остальные кнопки в ряду переключаются в состояние по умолчанию. Возможно, также переключится какая-то внутренняя переменная, которая будет использована при нажатии кнопки "Начать" - и нужно будет убедиться, что код там готов обработать значение этой переменной. |
|
Создано: 14 января 2016 15:05 · Поправил: KordDEM · Личное сообщение · #22 -=AkaBOSS=- пишет: Есть такие понятия как PE формат, секции и прочее. Знаю, что это такое. Каким образом этим воспользоваться в данном случае?о-о -=AkaBOSS=- пишет: Пятый аргумент - уникальный идентификатор, который, вероятней всего, участвует в определении кода, выполняющегося по нажатию кнопки. Постараюсь за этим проследить. Последние 5 параметров какую роль играют? |
|
Создано: 14 января 2016 15:25 · Личное сообщение · #23 KordDEM пишет: Каким образом этим воспользоваться в данном случае? Так как весь гуй намертво вбит в код, патчей всё равно будет дофигища. В связи с этим, я предлагаю создать новую секцию, и писать код туда. KordDEM пишет: Последние 5 параметров какую роль играют? Без понятия, и разбираться нет особой нужды. Так как у всех кнопок они одинаковы - можно оставить как есть |
|
Создано: 15 января 2016 14:31 · Поправил: KordDEM · Личное сообщение · #24 Вообщем результаты и вопросы.) Поигрался с параметрами, вообщем первые два параметра вы были правы x,y относительно которых загружается картинка. Вторые 2 параметры высота и ширина площади на которую происходит нажатие. Пятый параметр какой-то очень важный попробовал воткнуть на место первой кнопки идентификатор от второй - краш программы. Результат того, что в итоге получилось Теперь вопрос) Секцию в PE файле создал, как мне теперь в эту секцию загрузить свой код? И в каком виде должен быть код? в таком же как я в IDE его вижу? Т.е. что-то типа: Code:
или в другом? Вот тут пример функции в которую передаются все параметры: Code:
|
|
Создано: 15 января 2016 14:39 · Поправил: KordDEM · Личное сообщение · #25 Продолжение Code:
Передаются все параметры вот сюда, что происходит я не понял, но имеет такой вид funct_name(x,y,ширина, важный параметр, высота, 2) Code:
|
|
Создано: 16 января 2016 01:07 · Поправил: -=AkaBOSS=- · Личное сообщение · #26 KordDEM пишет: пример функции в которую передаются все параметры я ведь тоже в модуль смотрю) другая версия, но код я всё-таки вижу как мне теперь в эту секцию загрузить свой код? Ну смотри в заголовок секции - там (должны быть) чётко описаны границы адресного пространства, как файлового, так и виртуального. Пишем в файловое пространство, а адреса считаем по виртуальному. Вроде несложно. И в каком виде должен быть код? в таком же как я в IDE его вижу? Для начала - в предоставленном коде неправильно выделен блок кода, ответственный за создание кнопки. После ветвления есть еще код, сохраняющий полученное значение. Он расположен ПОСЛЕ ветвления и ПЕРЕД следующим вызовом new: Code:
И вот тут начинается САМОЕ интересное) Код-то вписать несложно, а вот заставить его работать - уже проблема. Дело в том, что процедура создающая кнопки - всего лишь метод какого-то класса, и все создаваемые кнопки она сохраняется в переменных своего класса. в начале процедуры можно заметить Code:
таким образом, код создания кнопки выглядит примерно так: Code:
Как видим, самая главная проблема теперь - это как внедрить свою переменную в класс, не развалив его к чертям? Нужно определить, каким образом эти кнопки используются в дальнейшем (ну в деструкторе, это понятное дело - освобождение занятого идентификатора и всё такое). Добавлено спустя 1 час 45 минут Code:
и сразу после кнопки "рандом" начинается цикл Code:
Тело цикла особого интереса не представляет, важен сам факт обработки. На этой точке нужно понимать, что так или иначе, виртуальный размер класса придётся увеличивать. Есть два варианта - либо увеличить его на одну переменную, либо на весь массив. В первом варианте - встраиваем одну переменную (в конец, разумеется), и используем её для сохранения указателя. Тогда, после создания кнопки, нужно еще сделать соответствующий вызов того, что у меня обозначено как sub_4347D0. Во втором варианте - весь массив из десяти (с добавленной) кнопок переносим в конец класса. Это позволит использовать тот же цикл, только на десять итераций. Минус - нужно еще отследить все обращения к полям и поправить их. |
|
Создано: 17 января 2016 04:09 · Поправил: -=AkaBOSS=- · Личное сообщение · #27 покопал еще немного.. я бы сказал, что расширение класса - задача крайне неприятная Во всех местах, где используется этот код, присутствует примерно такое: Code:
Тоесть, нет оператора new и постоянно живущего объекта, он отрабатывает и умирает локально. Для того чтобы изменить размер объекта, понадобится расширить выделяемую область в стэке, переместив наш объект в конец после всех локальных переменных ЗЫ. тю блин, я думал пост подклеится.. видать много времени прошло KordDEM Сложно? А ведь это еще даже до игровой механики (очередность ходов, захват объектов, сетевой протокол) не добрались. А там такой радости будет хоть отбавляй. Игрушка писалась во времена, когда движки оптимизировали намного лучше чем сейчас, в следствие чего нет кучи динамически разбираемых конфигов и XML схем - везде константы и хардкод. Может быть, лучше выбрать другую цель? |
|
Создано: 18 января 2016 09:59 · Личное сообщение · #28 -=AkaBOSS=- пишет: Нужно определить, каким образом эти кнопки используются в дальнейшем (ну в деструкторе, это понятное дело - освобождение занятого идентификатора и всё такое). Добавлено спустя 1 час 45 минут Code: ; так сохраняются кнопки после создания ; как видно, сохраняются в памяти строго последовательно, ; получается массив из 9 указателей на классы кнопок mov [ebx+18C0h], eax ; кнопка 1 mov [ebx+18C4h], eax ; кнопка 2 mov [ebx+18C8h], eax ; кнопка 3 mov [ebx+18CCh], eax ; кнопка 4 mov [ebx+18D0h], eax ; кнопка 5 mov [ebx+18D4h], eax ; кнопка 6 mov [ebx+18D8h], eax ; кнопка 7 mov [ebx+18DCh], eax ; кнопка 8 mov [ebx+18E0h], eax ; кнопка рандом и сразу после кнопки "рандом" начинается цикл Я так понимаю после кнопки рандом у нас следующая строка располагается?(Другой ряд кнопок) Так что пихать придется в после всего. А если опустим просто запилить туда кнопку пока без действия? -=AkaBOSS=- пишет: Сложно? А ведь это еще даже до игровой механики (очередность ходов, захват объектов, сетевой протокол) не добрались. Понимаю, что сложно было бы легко. я б в одного это все делал) Мб стоит тогда и начать с очередности ходов и захвата объектов?) Если так проще будет) Правда, если объекты у нас создаются в этом месте, то исправлять все равно придется) -=AkaBOSS=- пишет: Может быть, лучше выбрать другую цель? Если честно, не знаю, что там можно еще поправить) Добавлено спустя 27 минут -=AkaBOSS=- пишет: Ну смотри в заголовок секции - там (должны быть) чётко описаны границы адресного пространства, как файлового, так и виртуального. Пишем в файловое пространство, а адреса считаем по виртуальному Не про то не много спросил. Как записать в секцию свой код. Это имелось ввиду) |
|
Создано: 18 января 2016 10:35 · Личное сообщение · #29 KordDEM пишет: А если опустим просто запилить туда кнопку пока без действия? А смысл? Тем более, что до действий мы еще и не дошли - всё вышеописанное нужно только для того, чтобы интерфейс корректно создавался и уничтожался. KordDEM пишет: Мб стоит тогда и начать с очередности ходов и захвата объектов?) Если так проще будет) нет, там всё только сложнее будет (скорей всего, не смотрел) KordDEM пишет: Если честно, не знаю, что там можно еще поправить) я имел в виду другую игру) более дружественную для низкоуровневого мододельства. KordDEM пишет: Как записать в секцию свой код. Это имелось ввиду) Берём код и пишем в секцию, любым удобным способом. Пусть даже и винхексом. При желании можно прямо в ольке писать. |
|
Создано: 18 января 2016 13:06 · Личное сообщение · #30 Код тогда мб так выглядит? Code:
Там кст кнопки после цикла(которая после кнопки рандом), надо будет добавлять вызов какой-нибудь своей проверки, что б тоже учитывался. -=AkaBOSS=- пишет: При желании можно прямо в ольке писать. У меня там адреса какие-то не очень отображаются) Не понятно куда писать) |
. 1 . 2 . >> |
eXeL@B —› Крэки, обсуждения —› Исследование Heroes 3 |