Можно ли изменить значение внутри байт-кода Lua? Как? Любая идея?

У меня есть скрипт, который больше не поддерживается, и я ищу способ изменить значение переменной в нем... Скрипт зашифрован (loadstring/bytecode/ как то так) например: loadstring('\27\76\117\97\81\0\1\4\4\4\8\0\')

Я могу найти то, что хочу изменить (через блокнот после компиляции скрипта), но если я попытаюсь изменить значение, скрипт не будет работать, если я изменю и попробую перекомпилировать, он все равно не будет работать: "luac: Testing09.lua: unexpected end in precompiled chunk" ...

Есть идеи? Я сделал что-то подобное с программой, использующей ollydbg, но я не могу использовать ее со сценариями lua... Я немного заблудился, занимаясь поиском в Google в течение долгого времени, не мог найти способ... Любой идеи?

1 ответ

Решение

В байт-коде Lua легко изменить строку. Вам просто нужно отрегулировать длину строки после ее изменения. Длина идет перед строкой. Вероятно, он занимает четыре или восемь байтов непосредственно перед строкой, в зависимости от того, у вас 32-битная или 64-битная платформа. Длина сохраняется в порядке байтов машины, где был сгенерирован байт-код. Обратите внимание, что строки включают в себя завершающий символ '\0', и это считается по длине.

Возможно, проще просто скопировать несколько байтов напрямую. Написать этот файл

return "this is the new string you want" 

Сгенерировать из него байт-код luac и посмотрите на свалку luac.out и найдите строку и ее длину. Скопируйте эти байты в исходный файл.

Я не знаю, обрабатывает ли блокнот двоичные данные. если этого не произойдет, вам понадобится шестнадцатеричный редактор, чтобы сделать это.

Другим решением является написание программы на Lua, которая читает байт-код в виде строк, генерирует байт-код для return "this is the new string you want"выполните изменение исходного байт-кода, используя строковые операции, и запишите его обратно в файл.

Вы также можете попробовать мою библиотеку инспекторов байт-кода lbci, которая позволяет изменять константы в функциях. Вы загружаете байт-код (но не выполняете его) и используете setconstant после нахождения константы, которая содержит строку, которую вы хотите изменить.

В общем, здесь можно повеселиться...

Другие вопросы по тегам