У меня есть бинарный файл, который мне нужно немного откорректировать, чтобы увеличить размер массива с длины 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