Как повторно скомпилировать листинг скомпилированных байт-кодов для VM / компилятора Lua? - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь изменить код старой мобильной игры под названием Fun Run 2 как уникальный исследовательский проект для моего курса по разработке программного обеспечения в колледже.

Приложение создано с использованием Corona SDK и, следовательно, запрограммировано на Lua.Итак, когда я взял APK и распаковал его, мне нужно было распаковать файл resource.car (Corona ARchive), чтобы получить доступ к файлам Lua.Я так и сделал, и все файлы в этом архиве - это предварительно скомпилированные файлы .lu.

Первое, что я попытался изменить код Lua, это использовать unluac / luadec для декомпиляции файлов .lu вчитаемый, изменяемый исходный код, который можно скомпилировать.Я смог успешно декомпилировать, модифицировать и перекомпилировать их, однако, когда он фактически выполнял измененный файл .lu в игре, он зависал из-за попытки индексировать нулевое значение.Я обнаружил, что причиной этого был тот факт, что существует нечто, называемое повышением, которое при извлечении отладочной информации из скомпилированного файла Lua невозможно получить, и поэтому попытка декомпилировать и перекомпилировать файлы .lu не собираласьна работу.

Поэтому мой следующий подход состоял в том, чтобы использовать подход luac -l, который создает список скомпилированного байт-кода для виртуальной машины Lua.

Результаты luac -l lua.gameLogic.powerUpChance.lu были такими же, как

...
main <?:0,0> (11 instructions, 44 bytes at 025D7D80)
0+ params, 3 slots, 0 upvalues, 0 locals, 4 constants, 2 functions
    1   [-] NEWTABLE    0 0 0
    2   [-] GETGLOBAL   1 -1    ; require
    3   [-] LOADK       2 -2    ; "composer"
    4   [-] CALL        1 2 2
    5   [-] CLOSURE     2 0 ; 025D8280
    6   [-] MOVE        0 1
    7   [-] SETTABLE    0 -3 2  ; "selectRandomPowerUp" -
...

Учитывая этот список инструкций, я знал, что мне нужно было изменить и где его изменить, и я сделал это.Что приводит меня к моему вопросу - как мне взять измененный список байт-кода и скомпилировать его обратно в скомпилированный файл .lu?Это вообще возможно?Является ли такой подход к изменению скомпилированных файлов Lua пустой тратой моего времени?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Похоже, что используемый вами декомпилятор не может правильно декомпилировать циклы for.
Следующий фрагмент:

if A1_3 == #A3_5 and A2_4 > 2 then
   for _FORV_9_ = 1, #A3_5 do
   end
   if _FOR_ then
      L5_7 = 11
   end
end

должен выглядеть следующим образом:

if A1_3 == # A3_5 and A2_4 > 2 then
   local R6 = true
   for k = 1, #A3_5 do
      if not A3_5[k].mainPlayer then
         if A3_5[k].x < A0_2.x + 1200 then
            R6 = false
         end
      end
   end
   if R6 then
      L5_7 = 11
   end
end
0 голосов
/ 07 февраля 2019

Нет инструмента (по крайней мере, я не знаю) для компиляции строкового представления байтового кода обратно в надлежащий байт-код Lua;главным образом потому, что это не предназначено для редактирования, но как способ проверить, к чему компилируется ваш код Lua и, возможно, оптимизировать его.

Лучшим решением было бы использование инструмента, который декомпилирует байт-код в код Lua.Какой инструмент использовать для этого, во многом зависит от того, какую версию Lua вы используете, но для чего-то от 5.1 до 5.3 есть LuaDec , который я лично не пробовал, но должен выполнить свою работу.После того, как вы декомпилировали исходный код, внесите все необходимые изменения и снова скомпилируйте его с помощью luac, как вы это сделали бы с любым файлом Lua.

Надеюсь, это поможет:)

...