Изменить двоичный файл, чтобы расширить размер массива - PullRequest
0 голосов
/ 28 октября 2018

У меня есть бинарный файл, который мне нужно немного откорректировать, чтобы увеличить размер массива с длины 32 до длины 64. Цель этого состоит в том, что я пытаюсь запустить игру, используя очень специфическое оборудование, котороеигра изначально не поддерживает из-за ограничения числа кнопок на джойстике, установленного на 32, в то время как мое оборудование регистрируется как джойстик с 48 кнопками.Когда я запускаю игру, я получаю переполнение стека и игра вылетает.

Я хочу быть очень ясным, что это не имеет никакого отношения к обману.Я пытаюсь играть в ритмическую игру для одного игрока, используя танцевальную сцену аркадного кабинета вместо, скажем, контроллера Xinput.Эта игра изначально поддерживает режим «танца», но не мое точное оборудование.

У меня нет доступа к реальному коду проекта, так как я не являюсь сотрудником компании, которая разработала или опубликовала игру, но я делаюзнать, как выглядит код проблемы (см. пример C ++ ниже).Я запустил игру через gdb и разобрал проблемную функцию (см. Ниже asm code).Я отметил несколько интересных моментов в ассемблере, но я ни в коем случае не эксперт или, честно говоря, даже новичок в сборке, поэтому я был бы очень признателен всем, кто мог бы помочь мне настроить этот двоичный файл.

На данный момент я пытался настроить +9 и +448 с 0x5c на 0x7c, а затем настроить cmp на +240 с 0x20 на 0x40.Это привело меня к нарушению доступа к памяти;не желаемый эффект ~

В заключение хотелось бы отметить, что это задание было выполнено в прошлом на более старой версии игры, но файл bspatch, похоже, потерян во времени.Оригинальный бинарный редактор отметил, что он «просто отрегулировал длину массива», но не дал больше подробностей, чем это.Я предполагаю, что эта единственная функция нуждается в настройке, но, возможно, кто-то более знающий, чем я, сможет прочитать сборку и сказать, нужно ли мне больше копаться.

C ++ Код

Код ASM

Редактировать: Решение найдено!

@ geza заметил, что в стеке есть резерв 16 неиспользуемых байтов и что у моего джойстика на 16 кнопок больше, чеммассив в C ++ составляет.Таким образом, мы изменили cmp в цикле кнопок с 0x20 на 0x30 на +240 и отключили защиту от переполнения стека, nop выдав jne на +442.Немного грязно, но игра работает нормально.:)

Обновлен ASM

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...