как расшифровать скрипт луа

Поводом для написания статьи стала эта тема Чем открыть Lua-файл.

Lua — интерпретируемый язык программирования, разработанный подразделением Tecgraf Католического университета Рио-де-Жанейро (Computer Graphics Technology Group of Pontifical Catholic University of Rio de Janeiro in Brazil). Разработанный интерпретатор является свободно распространяемым, с открытыми исходными текстами на языке Си.

По возможностям, идеологии и реализации язык ближе всего к JavaScript, однако Lua отличается более мощными и гораздо более гибкими конструкциями. Хотя Lua не содержит понятия класса и объекта в явном виде, механизмы объектно-ориентированного программирования, включая множественное наследование, легко реализуются с использованием метатаблиц, которые также отвечают за перегрузку операций и т. п. Реализуемая модель объектно-ориентированного программирования — прототипная (как и в JavaScript).

Язык широко используется для создания тиражируемого программного обеспечения — в частности, на нём написан графический интерфейс пакета Adobe Lightroom. Также получил известность как язык программирования уровней и расширений во многих играх (например, World of Warcraft) из-за удобства встраивания, скорости исполнения кода и лёгкости обучения.

Для написания Lua-скриптов можно воспользоваться любым текстовым редактором и интерпретатором (LuaBinaries), либо воспользоваться сервисами ideone, codepad и т.д.

Напишем тестовый скрипт (назовем файл 1.lua):

Также Lua имеет возможность компиляции скриптов.

Процесс дизассемблирования
Для процесса дизассемблирования воспользуемся дизассемблером luadec.exe.
Используем следующую команду для дизассемблирования:

Источник

Русские Блоги

О расшифровке скрипта LUA

Написал статью на форуме Кансюэ в прошлом году.«Анализ шифрования и расшифровки скрипта Lua для мобильной игры Android»Суть статьи: в этом году я написал дополнительную статью, интегрировав часть содержимого декомпиляции и конфронтации Lua, и используя 3 примера в качестве объяснения (включая соревнование Tencent 2018 года и дополнения, связанные с фэнтезийной мобильной игрой Westward Journey), в начале статьи также добавлено Связанная работа, удобная для всех при изучении Lua reverse. Эта статья состоит из 3 статей в 1, так что содержания слишком много.Друзья, которым интересно, должны набраться терпения, конечно, вы также можете прыгать и смотреть. Наконец, дайте мне ваш совет. Наконец, если у вас есть какие-либо вопросы, оставьте сообщение, обменяйтесь и узнайте вместе.

Связанных с работой

Чтобы некоторые студенты могли лучше изучить обратный инжиниринг Lua, я объединил некоторые из собранных материалов в часть работы по шифрованию и дешифрованию Lua для вашей справки. Прежде чем читать этот раздел, вам все еще необходимы базовые знания Lua. Вот «Благодарность за источник Lua» [19] Юньфэна Далу, и его рекомендуется изучать в сочетании с поисковыми системами.

Статья состоит из 2 частей: первая часть знакомит с соответствующими статьями о шифровании и дешифровании lua, а вторая часть знакомит с соответствующими инструментами lua.

Введение в статью

В этом разделе представлены различные статьи, связанные с Lua в Интернете, включая шифрование и дешифрование Lua, такие как анализ формата файлов, игры и соревнования на основе Lua, технология перехвата Lua и т. Д.

1. Начало работы с шифрованием и дешифрованием Lua:

Не-Bug 1 написал 4 статьи о формате и байт-коде файлов luac и luajit, а также о 010Editor с открытым исходным кодом, разбирающем код шаблона luac и luajit. Одноклассник Ганлв [7] написал 7 серий руководств по шифрованию и расшифровке Lua в My Love Cracking. Tencent gslab [9] написал вводное введение в реверс-инжиниринг игр на Lua, которое представляет собой более раннюю статью о расшифровке игр на Lua. Одноклассник INightElf [10] написал статью о введении декомпиляции lua-скриптов.

2. Мобильные игры на основе Lua:

Lua можно использовать не только для конечных игр, но и для мобильных игр, и из-за популярности мобильных игр он стал стимулом для обмена статьями по обратному анализу lua. Одноклассник wmsuper [11] расшифровал lua-скрипт игры Happy Xiaoxiaole от Tencent на платформе Android, а затем модифицировал lua-скрипт с целью обмана. Студенты Unity [8] расшифровали и изменили поток мобильной игры Lua «Place Jianghu» с помощью метода перехвата для достижения цели изменения игрового вознаграждения. Одноклассник LittleNA [12] расшифровал сценарии lua 3 мобильных игр 3 способами и исправил порядок кодов операций lua в мобильных играх в стиле фэнтези.

3. Соревнование на основе Lua:

Введение в инструмент

У игр lua и luajit с обратным дешифрованием есть связанные инструменты. В этом разделе представлены некоторые основные инструменты.

luadec [16]: Это декомпилятор Lua с открытым исходным кодом, написанный на языке C в сочетании с исходным кодом движка Lua. Он анализирует весь файл байт-кода Lua и восстанавливает его до исходного кода в максимально возможной степени. Конечно, поскольку восстановление является языком высокого уровня, совместимость является общей. Когда вы декомпилируете большое количество файлов, вы обязательно столкнетесь с ошибками. В это время вам нужно вручную исправить ошибки самостоятельно; и это легко сделать так, чтобы декомпиляция не удалась. В настоящее время поддерживаются версии lua5.1, 5.2 и 5.3.

chunkspy: очень полезный инструмент анализа lua, написанный на самом языке lua. Он анализирует весь байтовый файл lua, и, поскольку его вывод представляет собой сборочную форму lua, совместимость очень высока, а также вызывает определенные трудности с чтением. Chunkspy может не только анализировать файлы luac, но и включает интерактивную команду, которая может преобразовывать входной сценарий lua в форму сборки байт-кода lua, что очень полезно для изучения байт-кода lua. Этот скрипт интегрирован в инструмент luadec, и в настоящее время поддерживаются версии также lua5.1, 5.2 и 5.3.

unluac: это также декомпилятор lua с открытым исходным кодом, написанный на языке java и имеющий более низкую совместимость, чем инструменты luadec. Как правило, он используется редко и поддерживает только lua5.1. Вы можете попробовать его, когда вышеперечисленные инструменты не работают.

2. Связанные с Luajit:

luajit-decomp [17]: Инструмент декомпиляции luajit с открытым исходным кодом на github, написанный на языке au3. Сначала преобразуйте файл байт-кода luajit в сборку через собственный exe-файл luajit, а затем инструмент преобразует сборку luajit в язык lua. Поскольку в дизассемблированном байт-коде luajit отсутствует много информации, такой как имена переменных, имена функций и т. Д., Результат декомпиляции читается нечетко, подобно F5 в IDA. Но совместимость очень хороша, поскольку его можно разобрать, его можно декомпилировать, поэтому вам нужно заменить соответствующую версию движка luajit при его использовании (для удовлетворения потребностей разборки). В настоящее время поддерживаются все версии luajit.

ljd [18]: это также инструмент декомпиляции luajit с открытым исходным кодом на github. Он написан на python. Он отличается от того, как luajit-decomp декомпилирует сборку luajit. Он анализирует весь файл luajit с самого начала и может получить дополнительную информацию и степень восстановления. Выше, но из-за большей точности совместимость будет слабее. Проверьте вилку этого проекта, чтобы получить больше совместимых версий. В настоящее время поддерживаются версии luajit2.0, luajit2.1 и т. Д.

Конфронтация декомпиляции

Используйте отладчик для отладки, почему инструмент декомпиляции анализирует ошибку и устраняет причину.

Используйте отладчик для отладки того, как исходный механизм анализирует файл.

Используйте инструмент анализа формата файла, чтобы проанализировать файл, чтобы увидеть, в какой точке анализ не удался.

Следующие три примера будут использованы для борьбы и исправления декомпиляции Lua.

Пример 1: простой вопрос

Это пример проблемы, замеченной на форуме Xuexue. Проблема в том, что игра (возможно, мобильная игра в дороге) изменила длину строки lua int32 на int64, что вызвало пример сбоя декомпиляции. Содержимое относительно простое. См. Способ восстановления. Мой ответ в посте, адрес: https://bbs.pediy.com/thread-217033.htm

Пример 2: Конкурс Tencent Game Security 2018

Проблема с кодом операции и ее решение

Цель исправления кода операции состоит в том, что при вводе файла luac субъекта инструмент дизассемблирования Chunkspy и инструмент декомпиляции luadec могут выводить правильные результаты.

Сначала мы анализируем файл tmgs.dll движка lua в ida, а затем находим функцию luaV_execute (ищем строку «предел для ‘должен быть числом») и обнаруживаем, что параметр case под переключателем (код операции lua) не работает Да, здесь мы можем подтвердить, что код операции виртуальной машины lua для этого вопроса был изменен.

Функция luaV_execute обычного движка luaФункция luaV_execute расширенного движка lua
как расшифровать скрипт луа. a16893fb41f3b705257c52ec32dc82e7. как расшифровать скрипт луа фото. как расшифровать скрипт луа-a16893fb41f3b705257c52ec32dc82e7. картинка как расшифровать скрипт луа. картинка a16893fb41f3b705257c52ec32dc82e7. Lua — интерпретируемый язык программирования, разработанный подразделением Tecgraf Католического университета Рио-де-Жанейро (Computer Graphics Technology Group of Pontifical Catholic University of Rio de Janeiro in Brazil). Разработанный интерпретатор является свободно распространяемым, с открытыми исходными текстами на языке Си.как расшифровать скрипт луа. 37976e0644c8bfb751b6b06f709dd2e8. как расшифровать скрипт луа фото. как расшифровать скрипт луа-37976e0644c8bfb751b6b06f709dd2e8. картинка как расшифровать скрипт луа. картинка 37976e0644c8bfb751b6b06f709dd2e8. Lua — интерпретируемый язык программирования, разработанный подразделением Tecgraf Католического университета Рио-де-Жанейро (Computer Graphics Technology Group of Pontifical Catholic University of Rio de Janeiro in Brazil). Разработанный интерпретатор является свободно распространяемым, с открытыми исходными текстами на языке Си.

Экспорт текста 2 версий luaV_execute через ida

Извлеките таблицу восстановления кода операции через скрипт Python

После того, как инструменты (Chunkspy и luadec) инициализируют файл lua, замените код операции таблицей восстановления

Тестовый запуск, исправление других ошибок

Наконец, замените полученную таблицу восстановления в инструмент. Точка восстановления Chunspy находится в функции DecodeInst. Измененный результат будет следующим:

Тест обнаружил ошибку, результат ошибки:

как расшифровать скрипт луа. 6003a467e03cc638dbfae2b078517b38. как расшифровать скрипт луа фото. как расшифровать скрипт луа-6003a467e03cc638dbfae2b078517b38. картинка как расшифровать скрипт луа. картинка 6003a467e03cc638dbfae2b078517b38. Lua — интерпретируемый язык программирования, разработанный подразделением Tecgraf Католического университета Рио-де-Жанейро (Computer Graphics Technology Group of Pontifical Catholic University of Rio de Janeiro in Brazil). Разработанный интерпретатор является свободно распространяемым, с открытыми исходными текстами на языке Си.

Из результата ошибки видно, что номер версии файла luac неверен. Версия lua 11 не может быть распознана здесь, на самом деле проблема, специально разработанная для того, чтобы инструмент распознал ошибку. Мы изменили 4-й байт (номер версии lua) 11 файла на 53 в порядке. Правильный результат:

как расшифровать скрипт луа. f2f99a9397eddf8389d1aa54c6c2aa2b. как расшифровать скрипт луа фото. как расшифровать скрипт луа-f2f99a9397eddf8389d1aa54c6c2aa2b. картинка как расшифровать скрипт луа. картинка f2f99a9397eddf8389d1aa54c6c2aa2b. Lua — интерпретируемый язык программирования, разработанный подразделением Tecgraf Католического университета Рио-де-Жанейро (Computer Graphics Technology Group of Pontifical Catholic University of Rio de Janeiro in Brazil). Разработанный интерпретатор является свободно распространяемым, с открытыми исходными текстами на языке Си.

Точка восстановления Luadec находится в функции f_parser файла ldo.c, и добавьте функцию RepairOpcode, восстановление будет следующим:

Запустите его, найдите ошибку и оставайтесь в функции StringBuffer_add, где str указывает на неправильное место, вызывая ошибки чтения строки:

как расшифровать скрипт луа. afd6b57b0813faaf9d393c86e4dc07c9. как расшифровать скрипт луа фото. как расшифровать скрипт луа-afd6b57b0813faaf9d393c86e4dc07c9. картинка как расшифровать скрипт луа. картинка afd6b57b0813faaf9d393c86e4dc07c9. Lua — интерпретируемый язык программирования, разработанный подразделением Tecgraf Католического университета Рио-де-Жанейро (Computer Graphics Technology Group of Pontifical Catholic University of Rio de Janeiro in Brazil). Разработанный интерпретатор является свободно распространяемым, с открытыми исходными текстами на языке Си.

Здесь мы исправили код операции, и Chunkspy успешно разобрался, но с декомпиляцией luadec все еще есть проблемы, которые мы проанализируем в следующем разделе.

Проблема декомпиляции и ее устранение

Я просмотрел записи нескольких крупных парней и обнаружил, что ни один из них не устранил эту проблему.В процессе решения проблемы непосредственно анализировался ассемблерный код Lua. Давайте посмотрим на причину ошибки и посмотрим на стек вызовов vs:

как расшифровать скрипт луа. 32f711ffa3bb09fa53e982d2a17f4651. как расшифровать скрипт луа фото. как расшифровать скрипт луа-32f711ffa3bb09fa53e982d2a17f4651. картинка как расшифровать скрипт луа. картинка 32f711ffa3bb09fa53e982d2a17f4651. Lua — интерпретируемый язык программирования, разработанный подразделением Tecgraf Католического университета Рио-де-Жанейро (Computer Graphics Technology Group of Pontifical Catholic University of Rio de Janeiro in Brazil). Разработанный интерпретатор является свободно распространяемым, с открытыми исходными текстами на языке Си.

Наконец, luadec работает отлично, и декомпиляция прошла успешно.

Пример 3: Мобильная игра Fantasy Westward Journey

В этом разделе рассказывается о некоторых проблемах, обнаруженных при обучении взламывать код Lua мобильной игры Fantasy Westward Journey в прошлом году. Они организованы и распространены сегодня, поэтому могут не подходить для текущей версии мобильной игры в стиле фэнтези. Мы все еще используем его для справки.

На тот момент при декомпиляции мобильной игры Fantasy Westward Journey возникло около 12 проблем. После модификации исходный код Lua можно было полностью воспроизвести. Здесь использовалась версия luadec5.1.

Исправить один

Вопрос 1: Поскольку код операции Lua мобильной игры мечты был изменен, предыдущее решение заключалось в том, чтобы найти код операции мечты, заменить исходный код операции инструмента декомпиляции и изменить режим операции перед декомпиляцией. Проблема в том, что результаты некоторых тестов в порядке, но когда байт-код luac всей мобильной игры будет декомпилирован, появятся различные ошибки. Причина в том, что luadec5.1 по умолчанию использует порядок кодов операций во многих местах и ​​делает специальные Обработка, поэтому вам нужно найти эти специальные места обработки и изменить их одно за другим. Но это очень проблематично, поэтому я думаю о другом способе, вместо изменения исходного кода операции и режима операции, но когда luadec анализирует байт-код, восстанавливает код операции до исходного кода операции.

Исправить два

Исправить три

Решение 3. Анализ показал, что параметр c OP_NEWTABLE здесь представляет размер ключа в хэш-таблице, а параметр c был неправильно преобразован в декомпилированном коде, что привело к ошибке синтаксического анализа. Измененный код выглядит следующим образом:

Исправить четыре

Вопрос 4: Ошибка инструмента декомпиляции и выход.

Решение 4. Отслеживание обнаружило, что в функции AddToTable PrintTable вызывается, когда ключ равен 0, а PrintTable освобождает таблицу, и при следующем вызове таблицы происходит сбой доступа к памяти. Измените код следующим образом:

Исправить пять

Вопрос 5: Когда функция возвращает результат с несколькими значениями и назначается нескольким переменным, ошибка декомпиляции выглядит следующим образом (дизассемблирование lua):

Когда приведенный выше код анализируется до строки 27, выдается сообщение об ошибке при извлечении R3 из регистра. Причина в том, что, когда предыдущий вызов возвращает несколько значений, он только помечается в F-> Rcall и не отмечается в регистре. Скомпилированный результат должен быть :

Решение 5. Если reg пуст, а Rcall не пуст, добавьте отметку return more и измените 2 функции:

Исправить шесть

Вопрос 6: Ошибка декомпиляции возникает, когда функция имеет только один оборот.

Исправить семь

Вопрос 7: Произойдут некоторые ошибки инициализации таблицы.

Исправить восемь

Вопрос 8: Произошла ошибка при разборе части переменных параметров, но инструмент не сообщает об ошибке при декомпиляции.

Решение 8. Когда is_vararg равно 7, F-> freeLocal добавляет еще раз:

Исправить девять

Вопрос 9: Инструмент декомпиляции выводит на китайском языке символы типа url (аналогично «\ 230 \ 176 \ 148 \ 231 \ 150 \ 151 \ 230 \ 156 \ 175»), а не китайские.

Решение 9. В функции DecompileString в файле proto.c закомментируйте строковую функцию преобразования по умолчанию:

Затем добавьте условия ограничения для оценки в следующих 3 местах, потому что байт char является отрицательным числом для китайских символов, поэтому функции isalpha и isalnum будут работать неправильно, поэтому добавьте условия ограничения, меньшие или равные 127:

Исправить десять

Вопрос 10: Не удалось разобрать. Поскольку некоторые файлы содержат очень длинные строки, вызов функции sprintf не выполняется.

Решение 10. Увеличьте размер кеша:

Исправить одиннадцать

Вопрос 11: Когда op_setlist opcode b == 0, декомпиляция не выполняется.

Решение 11. При обнаружении оператора lua, подобного следующему, инструмент декомпиляции завершится ошибкой. Ситуация находится в файле @ lib_ui.lua:

Во-вторых, существует проблема с сетлистом. Когда b == 0, это фактически означает, что значения от регистра a + 1 до вершины стека (вершины) все присвоены таблице, и декомпилятор не оценивает b == 0, плюс Вот и все. Так что измените его следующим образом:

Цикл for, добавленный StartTable, указывает, что если выполняется newtable (r 0 0), а последующая неинициализированная табличная операция перезаписывает регистр r (покрывает таблицу), это указывает, что новая таблица пуста, и в таблице нет последующей таблицы. Присвоение; если регистр r инициализируется позже, это доказывает, что новая таблица не пуста, а является таблицей переменных параметров.

Исправить двенадцать

Первая строка local a, b, c не будет декомпилирована, что приведет к различным ошибкам в следующем коде.

Когда startpc переменной равен текущему pc, количество переменных равно 0, а текущий pc равен 0, это означает, что переменная объявлена ​​в первой строке, а добавленное else if должно разрешить эту ситуацию (это оказывается прямой ошибкой без разрешения).

подводить итоги

Вышеупомянутое сначала суммирует статьи, связанные с обратным проектированием Lua, и связанные инструменты, которые были опубликованы в последние годы, а затем объясняет противостояние между дизассемблированием и декомпиляцией Lua и использует 3 примера в качестве иллюстраций. Первый пример иллюстрирует восстановление мобильной игры Zhengtu. Второй пример восстанавливает код операции виртуальной машины lua и успешно декомпилирует lua-скрипт. Третий пример отлично исправляет большое количество ошибок при декомпиляции lua-скрипта мобильной игры мечты.

Технология шифрования и дешифрования Lua будет продолжать развиваться, но на этом статья заканчивается. Затем я могу написать подробный отчет об анализе конкурса Tencent Game Security Competition 2018 (с подробным описанием каждого байта), включая, помимо прочего, обратный инжиниринг STL, анализ алгоритма AES, анализ сценария Blueprint и т. Д. Следите за обновлениями.

Справочная статья

[1] Фей Чонг «Анализ формата файла Luac для обратного проектирования Lua» https://www.anquanke.com/post/id/87006

[2] Летающие насекомые «Байт-код Luac и дизассемблирование реверса программы Lua» https://www.anquanke.com/post/id/87262

[3] Летающие насекомые «Формат файла Luajit для обратного проектирования Lua» https://www.anquanke.com/post/id/87281

[5] Nick Cano 《Hooking LuaJIT》 https://nickcano.com/hooking-luajit

[6] Желудок вызван интересом «Посмотрите, как я атакую ​​LuaJIT через хук» https://www.anquanke.com/post/id/86958

[7] Расшифровка lua-скрипта Ganlv 1: строка загрузки https://www.52pojie.cn/thread-694364-1-1.html

[8] unity «[Место Цзянху] Мобильная игра LUA на основе процесса модификации расшифровки HOOK» https://www.52pojie.cn/thread-682778-1-1.html

[9] Лаборатория безопасности игр «Введение в методы реверсирования и взлома игр на Lua» http://gslab.qq.com/portal.php?mod=view&aid=173

[10] INightElf «[Оригинал] Введение в первую декомпиляцию скрипта Lua» https://bbs.pediy.com/thread-186530.htm

[11] wmsuper «Счастливая расшифровка скрипта Xiaoxiaole Lua» https://www.52pojie.cn/thread-611248-1-1.html

[12] littleNA «Анализ шифрования и расшифровки Lua-скрипта мобильных игр Android» https://litna.top/2018/07/07/Analysis of the encryption and Decryption of Android Mobile Games Lua Script /

[13] «Kanxue 2016CrackMe, вопрос 2» https://ctf.pediy.com/game-fight-3.htm

[14] «Kanxue 2017CrackMe, вопрос 15» https://ctf.pediy.com/game-fight-45.htm

[15] «Конкурс технологий Tencent Game Security» https://www.52pojie.cn/forum-77-1.html

[16] luadec https://github.com/viruscamp/luadec

[17] ljd https://github.com/NightNord/ljd

[18] luajit-decomp https://github.com/bobsayshilol/luajit-decomp

(Полный текст окончен, спасибо, что прочитали)

Интеллектуальная рекомендация

как расшифровать скрипт луа. e5853058bab81b200850249fd0e3a70b. как расшифровать скрипт луа фото. как расшифровать скрипт луа-e5853058bab81b200850249fd0e3a70b. картинка как расшифровать скрипт луа. картинка e5853058bab81b200850249fd0e3a70b. Lua — интерпретируемый язык программирования, разработанный подразделением Tecgraf Католического университета Рио-де-Жанейро (Computer Graphics Technology Group of Pontifical Catholic University of Rio de Janeiro in Brazil). Разработанный интерпретатор является свободно распространяемым, с открытыми исходными текстами на языке Си.

Учебник по началу работы с ASP.NET Core 9, Промежуточное ПО ASP.NET Core (промежуточное ПО) Начало работы

как расшифровать скрипт луа. 8deb0c75af56b935bf7ce00b0a9b6329. как расшифровать скрипт луа фото. как расшифровать скрипт луа-8deb0c75af56b935bf7ce00b0a9b6329. картинка как расшифровать скрипт луа. картинка 8deb0c75af56b935bf7ce00b0a9b6329. Lua — интерпретируемый язык программирования, разработанный подразделением Tecgraf Католического университета Рио-де-Жанейро (Computer Graphics Technology Group of Pontifical Catholic University of Rio de Janeiro in Brazil). Разработанный интерпретатор является свободно распространяемым, с открытыми исходными текстами на языке Си.

Elasticsearch Psychology Query

как расшифровать скрипт луа. d3dac80e855aac75cfd952c18efaf43f. как расшифровать скрипт луа фото. как расшифровать скрипт луа-d3dac80e855aac75cfd952c18efaf43f. картинка как расшифровать скрипт луа. картинка d3dac80e855aac75cfd952c18efaf43f. Lua — интерпретируемый язык программирования, разработанный подразделением Tecgraf Католического университета Рио-де-Жанейро (Computer Graphics Technology Group of Pontifical Catholic University of Rio de Janeiro in Brazil). Разработанный интерпретатор является свободно распространяемым, с открытыми исходными текстами на языке Си.

vscode настройки китайского языка

1. После установки vscode перейдите вИнтерфейс запуска наCtrl + Shift + P Появится окно команд, показанное ниже, и введите «display», Введите; как показано ниже 2. Удалите содержимое перед д.

как расшифровать скрипт луа. 8b64c0eee6f975d4fc7948187d044630. как расшифровать скрипт луа фото. как расшифровать скрипт луа-8b64c0eee6f975d4fc7948187d044630. картинка как расшифровать скрипт луа. картинка 8b64c0eee6f975d4fc7948187d044630. Lua — интерпретируемый язык программирования, разработанный подразделением Tecgraf Католического университета Рио-де-Жанейро (Computer Graphics Technology Group of Pontifical Catholic University of Rio de Janeiro in Brazil). Разработанный интерпретатор является свободно распространяемым, с открытыми исходными текстами на языке Си.

Идея установки Tomcat, сервер Jetty

Веб-сервер установки IDEA часто встречает установку и неудачи, запустить сбой. В сочетании с IDEA используется, расчесывание процесс установки веб-сервера, рекомендуется для загрузки серверов Tomcat и.

как расшифровать скрипт луа. 008b02c09e2bc0cfcca28e67af965f6e. как расшифровать скрипт луа фото. как расшифровать скрипт луа-008b02c09e2bc0cfcca28e67af965f6e. картинка как расшифровать скрипт луа. картинка 008b02c09e2bc0cfcca28e67af965f6e. Lua — интерпретируемый язык программирования, разработанный подразделением Tecgraf Католического университета Рио-де-Жанейро (Computer Graphics Technology Group of Pontifical Catholic University of Rio de Janeiro in Brazil). Разработанный интерпретатор является свободно распространяемым, с открытыми исходными текстами на языке Си.

Отслеживание кода приложения камеры Android9.0

Доброе утро всем, на этот раз я предлагаю вам прочитать код приложения камеры Android9.0, которое не только для рабочих нужд, но и для личных заметок, чтобы помочь вам учиться. Местоположение исходног.

Источник

Очень подробно разжёвано для чайников по LUA часть1!

как расшифровать скрипт луа. download. как расшифровать скрипт луа фото. как расшифровать скрипт луа-download. картинка как расшифровать скрипт луа. картинка download. Lua — интерпретируемый язык программирования, разработанный подразделением Tecgraf Католического университета Рио-де-Жанейро (Computer Graphics Technology Group of Pontifical Catholic University of Rio de Janeiro in Brazil). Разработанный интерпретатор является свободно распространяемым, с открытыми исходными текстами на языке Си.

Скрипты на языке Lua

Написанный на Lua скрипт не имеет какой-либо специальной функции, с которой начиналось бы его выполнение. Скрипт можно рассматривать просто как набор команд (инструкций), который выполняется, начиная с первой инструкции.

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

Работа с переменными в Lua

Переменные используются для хранения значений в процессе выполнения скрипта.

Имена переменных в Lua

Именами (идентификаторами) переменных в Lua могут быть любые последовательности из букв, цифр и символа подчеркивания, начинающиеся не с цифры.

Язык Lua различает регистр символов, поэтому abc, Abc, ABC являются различными именами.

В таблице ниже приведены слова, которые зарезервированы языком Lua и не могут использоваться в именах переменных:

and break do else elseif

end false for function if

in local nil not or

repeat return then true until

Кроме того, все имена, начинающиеся с символа подчеркивания, за которым идут заглавные буквы (например, _VERSION) также являются зарезервированными.

Какие переменные бывают в Lua?

Переменные в Lua могут быть глобальными и локальными. Если переменная не объявлена явно как локальная, она считается глобальной.

Глобальные переменные Lua

Глобальная переменная появляется в момент присваивания ей первого значения. До присваивания первого значения обращение к глобальной переменной даёт nil.

Глобальная переменная существует до тех пор, пока существует среда исполнения скрипта и доступна любому Lua-коду, выполняемому в этой среде.

При необходимости удалить глобальную переменную можно явным образом, просто присвоив ей значение nil.

g = 1 — создаем глобальную переменную g со значением 1

g = nil — удаляем глобальную переменную g

Все глобальные переменные являются полями обычной таблицы, называемой глобальным окружением. Эта таблица доступна через глобальную переменную _G. Поскольку полями глобального окружения являются все глобальные переменные (включая саму _G), то _G._G == _G.

Локальные переменные Lua

Любые локальные переменные должны быть объявлены явно с использованием ключевого слова local. Объявить локальную переменную можно в любом месте скрипта. Объявление может включать в себя присваивание переменной начального значения. Если значение не присвоено, переменная содержит nil.

local a — объявляем локальную переменную a

local b = 1 — объявляем локальную переменную b, присваиваем ей значение 1

local c, d = 2, 3 — объявляем локальные переменные c и d, присваиваем им значения 2 и 3

Область видимости локальной переменной начинается после объявления и продолжается до конца блока.

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

Под блоком понимается:

тело управляющей конструкции (if-then, else, for, while, repeat);

фрагмент кода, заключённый в ключевые слова do. end.

Если локальная переменная определена вне какого-либо блока, её область видимости распространяется до конца скрипта.

a = 5 — глобальная переменная a

local i = 1 — переменная i локальна в пределах скрипта

while i 1, 4, 9, 16, 25

local a — переменная а локальна внутри then

local a = 20 — переменная а локальна внутри do-end

Когда возможно, рекомендуется использовать локальные переменные вместо глобальных. Это позволит избежать «засорения» глобального пространства имён и обеспечит лучшую производительность (поскольку доступ к локальным переменным в Lua выполняется несколько быстрее, чем к глобальным).

Типы данных Lua

Какие типы данных поддерживает язык Lua?

Lua поддерживает следующие типы данных:

1. Nil (ничего). Соответствует отсутствию у переменной значения. Этот тип представлен единственным значением — nil.

2. Boolean (логический). К данному типу относятся значения false (ложь) и true (истина).

При выполнении логических операций значение nil рассматривается как false. Все остальные значения, включая число 0 и пустую строку, рассматриваются как true.

3. Number (числовой). Служит для представления числовых значений.

В числовых константах можно указывать необязательную дробную часть и необязательный десятичный порядок, задаваемый символами «e» или «E». Целочисленные числовые константы можно задавать в шестнадцатеричной системе, используя префикс 0x.

Примеры допустимых числовых констант: 3, 3.0, 3.1415926, 314.16e-2, 0xff.

4. String (строковый). Служит для представления строк.

Строковые значения задаются в виде последовательности символов, заключённой в одинарные или двойные кавычки:

b = ‘это вторая строка’

Строки, заключённые в двойные кавычки, могут интерпретировать C-подобные управляющие последовательности (escape-последовательности), начинающиеся с символа «\» (обратный слэш):

\t (горизонтальная табуляция),

Символ в строке также может быть представлен своим кодом с помощью escape-последовательности:

где ddd — последовательность из не более чем трёх цифр.

Кроме кавычек для определения строки могут также использоваться двойные квадратные скобки:

local a = [[Компания «Кронос»]]

Определение строки с помощью двойных квадратных скобок позволяет игнорировать все escape-последовательности, т. е. строка создаётся полностью так, как описана:

При определении строки с помощью двойных квадратных скобок учитываются символы табуляции и переноса.

Двойные скобки могут быть вложенными. Для того чтобы их не перепутать, между скобками вставляется символ«равно» (=):

local a = [=[определение строки [[string]] в Lua]=]

— будет срока: «определение строки [[string]] в Lua»

5. Function (функция). Функции в Lua могут быть записаны в переменные, переданы как параметры в другие функции ивозвращены как результат выполнения функций.

6. Table (таблица). Таблица представляет собой набор пар «ключ» — «значение», которые называют полями илиэлементами таблицы. Как ключи, так и значения полей таблицы могут иметь любой тип, за исключением nil. Таблицы не имеют фиксированного размера: в любой момент времени в них можно добавить произвольное число элементов.

Подробнее — в статье «Создание таблиц в Lua»

7. Userdata (пользовательские данные). Является особым типом данных. Значения этого типа не могут быть созданы или изменены непосредственно в Lua-скрипте.

Userdata используется для представления новых типов, созданных в вызывающей скрипт программе или в библиотеках, написанных на языке С. Например, библиотеки расширений Lua для «CronosPRO» используют этот тип для представления таких объектов, как:

банки данных (класс Bank);

базы данных (класс Base);

записи (класс Record) и т. п.

8. Thread (поток). Соответствует потоку выполнения. Эти потоки никаким образом не связаны с операционной системой и поддерживаются исключительно средствами самого Lua.

Как в Lua задать тип переменной?

Lua не предусматривает явного задания типа переменной. Тип переменной устанавливается в момент присвоения переменной значения. Любой переменной может быть присвоено значение любого типа (вне зависимости от того, значение какого типа она содержала ранее).

a = 123 — переменная a имеет тип number

a = «123» — теперь переменная a имеет тип string

a = true — теперь переменная a имеет тип boolean

a = <> — теперь переменная a имеет тип table

Переменные типа table, function, thread и userdata не содержат самих данных, а хранят ссылки на соответствующие объекты. При присваивании, передачи в функцию в качестве аргумента и возвращении из функции в качестве результата копирования объектов не происходит, копируются только ссылки на них.

a = <> — создаем таблицу. В переменную a помещается ссылка на таблицу

b = a — переменная b ссылается на ту же таблицу, что и a

a[1] = 10 — элементу таблицы с индексом 1 присвоено значение 10

Остальные данные являются непосредственными значениями.

Как в Lua получить тип переменной?

Тип значения, сохранённого в переменной, можно выяснить при помощи стандартной функции type. Эта функция возвращает строку, содержащую название типа («nil», «number», «string», «boolean», «table», «function», «thread», «userdata»).

t = type («это строка») — t равно «string»

t = type (123) — t равно «number»

t = type (type) — t равно «function»

t = type (true) — t равно «boolean»

t = type (nil) — t равно «nil»

t = type (CroApp.GetBank()) — t равно «userdata»

Как в Lua преобразовать тип переменной?

Lua при необходимости автоматически преобразует числа в строки и наоборот. Например, если строковое значение является операндом в арифметической операции, оно преобразуется в число. Аналогично числовое значение, встретившееся в том месте, где ожидается строковое, будет преобразовано в строку.

a = «10» + 2 — a равно 12

a = «10» + 2 — a равно «10 + 2»

a = «строка» + 2 — Ошибка! Невозможно преобразовать «строка» в число

Значение любого типа можно явным образом преобразовать в строку с помощью стандартной функции tostring.

a = tostring (10) — a равно «10»

a = tostring (true) — a равно «true»

a = tostring (nil) — a равно «nil»

a = tostring (<[1] = «это поле 1»>) — a равно «table: 06DB1058»

Из предыдущего примера видно, что содержимое таблиц функцией tostring не преобразуется. Выполнить такое преобразование можно с помощью функции render.

a = render (10) — a равно «10»

a = render (true) — a равно «true»

a = render (nil) — a равно «nil»

Для явного преобразования значения в число можно использовать стандартную функцию tonumber. Если значение является строкой, которую можно преобразовать в число (или уже является числом), функция возвращает результат преобразования, в противном случае возвращает nil.

a = tonumber («10») — a равно «10»

a = tonumber («10»..».5″) — a равно 10.5

a = tonumber (true) — a равно «nil»

a = tonumber (nil) — a равно «nil»

Расстановка комментариев в Lua

Комментарий в Lua начинается двумя знаками «минус» (—) и продолжается до конца строки.

local a = 1 — однострочный комментарий

Если непосредственно после символов «—» идут две открывающие квадратные скобки ([[), комментарий являетсямногострочным и продолжается до двух закрывающих квадратных скобок (]]).

local a = 1 — [[ многострочный

Двойные скобки в комментариях могут быть вложенными. Для того чтобы их не перепутать, между скобками вставляется знак равенства (=):

local a = [[Компания «Кронос»]] — [=[

local a = [[Компания «Кронос»]]

Количество символов «=» определяет вложенность:

local a = [=[определение некоторой строки [[string]] в языке Lua]=]

Операции, применяемые в Lua

В выражениях, написанных на Lua, могут применяться следующие виды операций:

1. Арифметические операции.

Lua поддерживает следующие арифметические операции:

^ (возведение в степень);

% (остаток от деления).

Арифметические операции применимы как к числам, так и к строкам, которые в этом случае преобразуются в числа.

2. Операции сравнения.

В Lua допустимы следующие операции сравнения величин:

Операции сравнения всегда возвращают логическое значение true или false.

Правила преобразования чисел в строки (и наоборот) при сравнениях не работают, т. е. выражение «0» == 0 даёт в результате false.

3. Логические операции.

К логическим операциям относятся:

Операция and возвращает свой первый операнд, если он имеет значение false или nil. В противном случае, операция возвращает второй операнд (причём этот операнд может быть произвольного типа).

a = (nil and 5) — a равно nil

a == (false and 5) — a равно false

a == (4 and 5) — a равно 5

Операция or возвращает первый операнд, если он не false и не nil, иначе он возвращает второй операнд.

a == (4 or 5) — a равно 4

a == (false or 5) — a равно 5

Логические операции and и or могут возвращать значения любых типов.

Логические операции and и or вычисляют значение второго операнда только в том случае, если его нужно вернуть. Если этого не требуется, второй операнд не вычисляется. Например:

a == (4 or f()) — вызова функции f() не произойдет

Операция not всегда возвращает true или false.

4. Операция конкатенации.

Для конкатенации (объединения) строк служит операция… (две точки).

a = «Кронос»..»-«..«Информ» — переменная a получит значение «Кронос-Информ»

Если один или оба операнда являются числами, выполняется их преобразование в строки.

a = 0..1 — переменная a получит значение «01»

5. Операция получения длины.

В Lua определена операция длины #, которую можно использовать для получения длины строки.

len = #a — len равно 6

len = #«ещё строка» — len равно 10

Приоритет операций в Lua

В языке Lua выполнение операций осуществляется в соответствии со следующим приоритетом (в порядке убывания):

Вызов скриптов из форм

С каждой формой (включая вложенные формы) связан отдельный скрипт, который обычно содержит функции, выполняющие обработку событий формы и её элементов.

Когда форма запускается, её скрипт загружается в глобальное окружение. При возникновении события формы или её элемента система вызывает сопоставленную этому событию функцию-обработчик.

Необходимо отметить, что скрипт формы, хотя и не содержит вызова функции module, фактически является модулем. Это означает, что переменные, объявленные в скрипте формы без ключевого слова local, не выносятся в глобальное окружение и доступны только внутри этого скрипта. Если необходимо сделать какое-либо значение доступным для скриптов других форм, его следует явным образом определить в глобальной таблице _G:

Другой скрипт форм сможет прочитать это значение следующим образом:

Блоки операторов (инструкций)

К основным операторам Lua относятся:

операторы для организации циклов.

Группа операторов может быть объединена в блок (составной оператор) при помощи конструкции do… end.

Блок открывает новую область видимости, в которой можно определять локальные переменные.

a = 5 — глобальная переменная a

local a = 20 — внутри do-end определяется локальная переменная а

Оператор присваивания в Lua

Присваивание изменяет значение переменной или поля таблицы. В простейшем виде присваивание может выглядеть так:

a = 1 — переменной a присвоено значение 1

a = b + c — переменной a присвоена сумма значений переменных b и с

a = f(x) — переменной a присвоено значение, возвращённое функцией f(x)

В Lua допускается так называемое множественное присваивание, когда несколько переменных, находящихся слева от оператора присваивания, получают значения нескольких выражений, записанных справа от оператора присваивания:

a, b = 1, 5*c — a равно 1; b равно 5*c

Если переменных больше чем значений, «лишним» переменным присваивается nil.

a, b, c = 1, 2 — a равно 1; b равно 2; c равно nil

Если значений больше чем переменных, «лишние» значения игнорируются.

a, b = 1, 2, 3 — a равно 1; b равно 2; значение 3 не использовано

Множественное присваивание можно использовать для обмена значениями между переменными:

a = 10; b = 20 — a равно 10, b равно 20

a, b = b, a — теперь a равно 20, b равно 10

Условный оператор (if) в Lua

Оператор if проверяет истинность заданного условия. Если условие является истинным, выполняется часть кода, следующая за ключевым словом then (секция then). В противном случае, выполняется код, следующий за ключевым словом else (секция else).

return a — если a больше b, вернуть a

return b — в противном случае — вернуть b

Секция else является необязательной.

Перед каждой итерацией цикла проверяется условие :

если условие ложно, цикл завершается и управление передаётся первому оператору, следующему за оператором while;

если условие истинно, выполняется тело цикла, после чего все действия повторяются.

while i > 0 do — цикл от 10 до 1

Для выхода из цикла до его завершения можно использовать оператор break.

while i > 0 do — ищем в массиве отрицательное значение

MsgBox («Индекс отрицательного значения: »..i)

MsgBox («Массив не содержит отрицательных значений»)

Подробнее об особенностях использования оператора break — в статье «Операторы break и return»

Цикл с постусловием (repeat) в Lua

Оператор repeat предназначен для организации циклов с постусловием и имеет следующий вид:

Тело цикла выполняется до тех пор, пока условие не станет истинным. Проверка условия осуществляется после выполнения тела цикла, поэтому в любом случае тело цикла выполнится хотя бы один раз.

— суммируем значения массива a, пока сумма не превысит 10

MsgBox («Сложено »..i..» элементов. Сумма равна «..sum)

Для выхода из цикла до его завершения можно использовать оператор break.

Подробнее об особенностях использования оператора break — в статье «Операторы break и return»

Циклы с оператором for в Lua

Оператор for предназначен для организации циклов и допускает две формы записи:

простую (числовой for);

расширенную (универсальный for).

Простая форма оператора for

Простая форма оператора for имеет следующий вид:

for var = exp1, exp2, exp3 do

Тело цикла выполняется для каждого значения переменной цикла (счётчика) var в интервале от exp1 до exp2, с шагом exp3.

Шаг может не задаваться. В этом случае он принимается равным 1.

for i = 1, 10 do — цикл от 1 до 10 с шагом 1

Выражения exp1, exp2 и exp3 вычисляются всего один раз, перед началом цикла. Так, в примере ниже, функция f(x) будет вызвана для вычисления верхнего предела цикла только один раз:

for i = 1, f(x) do — цикл от 1 до значения, возвращенного функцией f()

Переменная цикла является локальной для оператора цикла и по его окончании не определена.

for i = 1, 10 do — цикл от 1 до значения, возвращенного функцией f()

MsgBox («После выхода из цикла i равно »..i) — Неверно! i равно nil

Значение переменной цикла нельзя изменять внутри цикла: последствия такого изменения непредсказуемы.

Для выхода из цикла до его завершения используется оператор break.

for i = 1,#a do — ищем в массиве отрицательное значение

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *