Как расшифровать luac файл

Как открыть LUAC файлы? 4 простых метода решения таких проблем

Когда вы сталкиваетесь с проблемой с неизвестным файлом LUAC и не знаете, как открыть такой файл, первый шаг, который вы должны сделать, это определить причину данной проблемы. Мы покажем вам, как решить наиболее распространенные проблемы с файлами LUAC и как их решить, в 4 простых шага.

LUAC расширение файла

Что такое LUAC файл?

В формате LUAC есть файлы, задачей которых является хранение исходного кода для языка программирования, называемого Lua. Эти файлы создаются языковым компилятором LUAC. Эта программа также может генерировать формат LUA.

Как открыть файл LUAC?

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

Шаг 1 – Убедитесь, что файл правильно связан с выбранным программным обеспечением

Первое, что пользователь должен сделать, это связать приложение с файлами LUAC. Может случиться так, что даже если в системе установлено приложение, поддерживающее файлы LUAC, оно не будет правильно связано с этим форматом файла. Это можно легко исправить, связав программу с файлами LUAC. Чтобы связать такие файлы с данным приложением, пользователь должен открыть меню файлов (щелкнув правой кнопкой мыши по файлу) и выбрав «Открыть с помощью». Список предлагаемых приложений будет отображаться в верхней части меню. Затем выберите приложение и подтвердите свой выбор, установив флажок «Всегда использовать выбранное приложение для открытия файлов такого типа». Подтвердите свой выбор, нажав ОК.

Чтобы открыть LUAC файл, сфокусируйтесь на шагах 1 и 2

В большинстве случаев для открытия файлов с расширением LUAC должно быть достаточно следующих инструкций на шаге 1 и 2. Прежде чем предпринимать следующие шаги, протестируйте все программы, перечисленные ниже.

Шаг 2 – Установите программу, которая поддерживает LUAC файлы

Если случится так, что раздел с предлагаемыми программами будет пустым, наиболее вероятно, что в системе не будет установлена программа, поддерживающая файлы LUAC. Выберите программу из следующего списка и установите ее:

Источник

Поводом для написания статьи стала эта тема Чем открыть 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.
Используем следующую команду для дизассемблирования:

Источник

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

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

предисловие

При тестировании игры игра загружает скрипт luac:

Справочник статей

анализ формата luac51

Луак формат файла

Файл Luac содержит две части: заголовок файла и тело функции.

Формат заголовка файла

version Поле указывает версию формата файла Luac, а его значение соответствует скомпилированной версии Lua. Для файла Luac, созданного в версии 5.2 Lua, его значение равно 0x52.

** format ** Поле является идентификатором формата файла. Значение 0 представляет официальный формат, указывая, что это официально определенный формат файла. Значение этого поля не равно 0, что указывает на то, что это измененный формат файла Luac и может не загружаться обычной официальной виртуальной машиной Lua.

** endian ** Указывает порядок байтов, используемый Луаком. В настоящее время порядок байтов в основных компьютерах в основном включает LittleEndian и BigEndian. Если значение этого поля равно 1, это означает LittleEndian, а если оно равно 0, используется BigEndian.

** size_int Поле ** указывает размер байтов, занятых типом int. Поле size_size_t указывает размер байтов, занятых типом size_t. Существование этих двух полей должно быть совместимо с процессорами различных ПК и мобильных устройств, а также с их 32-разрядными и 64-разрядными версиями, поскольку на конкретном процессоре размер байтов, занимаемый этими двумя типами данных Отличается.

** size_Instruction Поле ** указывает размер одной инструкции в блоке кода байтового кода Luac. В настоящее время размер, занимаемый инструкцией инструкции, составляет фиксированные 4 байта, что означает, что Luac использует тот же формат инструкции длины, что, очевидно, обеспечивает удобство для хранения и декомпиляции команд Luac.

** size_lua_Number ** Поле идентифицирует размер данных типа lua_Number. lua_Number представляет тип числа в Lua, который может хранить целочисленные типы и типы с плавающей запятой. В коде Lua он использует LUA_NUMBER, его размер зависит от типа и размера данных с плавающей запятой, используемых в Lua, для плавающей запятой одинарной точности, LUA_NUMBER определяется как float, то есть 32-битный размер, для двойного Для точности с плавающей запятой она определяется как double, что означает длину 64 бита. В настоящее время Lua, скомпилированный на macOS, имеет размер 64 бита.

** lua_num_valid ** Поле обычно 0, используется для определения того, может ли тип lua_Number работать нормально.

** luac_tail ** Поля используются для сбора данных для ошибок преобразования. В Lua он использует LUAC_TAIL, который является фиксированной строкой содержимого: «\ x19 \ x93 \ r \ n \ x1a \ n».

После заголовка файла следует тело функции. В файле Luac вверху находится тело функции верхнего уровня. Тело функции может содержать несколько подфункций. Подфункции могут быть вложенными функциями или замыканиями. Они состоят из констант, инструкций кода, значений Upvalue и номеров строк. Локальные переменные и другая информация.

Тело функции

** ProtoHeader ** глава Прото. Его определение таково:

** code ** код операции lua vm
constants Оператор lua фактически удаляет логотип, соответствующий ключевому слову

Это оператор lua, поэтому его можно увидеть в файле luac, и можно предположить, что примерный оператор lua

** protos ** Следующее тело функции хранится в цепочке
** lines ** Сколько строк выражения lua существует в этой функции
** loc_vars ** Количество локальных переменных внутри функции
** names ** Имя локальной переменной внутри функции

Luac.exe хранится анализ процесса luac

Тело функции luac разделено на основную функцию и общую функцию в luac.exe.
1. Сохраните заголовок основной функции, код и строку оператора lua для хранения
2. Храните обычные функции
2.1, хранить тело обычной функции
2.2. Просматривать связанный список обычных функций до конца
3. Сохраните количество строк основных функций, параметров и имен параметров

Lua исходный код luac.c, DumpHeader Формат заголовка luac сохраняется и в ** DumpFunction ** Тело функции сохраняется.

** DumpHeader ** Формат заголовка байта LUAC_HEADERSIZE (12) сохраняется.

Процесс рекурсивного обхода тела хранимой функции.

Луак декомпиляция

Получить lua51 VM

функция lua_execute

В lua vm luac объясняет, что функцией для выполнения кода операции luac является luaV_execute, но некоторые скрывают имя функции lua_execute. Ниже приведена функция execute, найденная с помощью lua_resume.

Вызовите функцию luaD_rawrunprotected в lua_resume, передайте указатель функции resum в качестве параметра

Вызовите luaV_execute в функции resum

В luaV_execute есть 38 случаев переключения, а затем в lua vm игры также находится функция исполнения, что также составляет 38 случаев переключения. Анализируется таблица сравнения кодов операций:

Скомпилировать нелиак

Переписать проанализированную таблицу сравнения в unluac OpcodeMap.java и скомпилировать ее для генерации unluac.jar.

Note: Информационная справка:

Источник

5 – Вспомогательная библиотека

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

Все функции и виды из дополнительной библиотеки определены в заголовочном файле lauxlib.h и имеют префикс luaL_.

Все функции дополнительной библиотеки выстроены поверх основного API и, поэтому не дают ничего, что нельзя было сделать с помощью этого API. Тем не менее, использование вспомогательной библиотеки обеспечит вашему коду большую насыщенность.

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

Некоторые функции вспомогательной библиотеки используются для проверки аргументов функций на С. Поскольку сообщение об ошибке форматируются для аргументов (например, «bad argument #1«), не используйте эти функции для других значений стека.

Если условия проверки не выполняются, функции с названиями luaL_check* всегда вызывают ошибку.

5.1 – Функции и типы

luaL_addchar

luaL_addlstring

luaL_addsize

luaL_addstring

luaL_addvalue

[-1, +?, e] Добавляет значение с верхушки стека в буфер B (смотрите luaL_Buffer). Значение, при этом, извлекается из стека.

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

luaL_argcheck

luaL_argerror

luaL_Buffer

Тип для строкового буфера (string buffer).

luaL_buffinit

luaL_buffinitsize

luaL_callmeta

[-0, +(0|1), e] Вызывает метаметод.

Если у объекта с индексом obj имеется метатаблица и в этой метатаблице есть поле e, эта функция вызывает это поле передавая объект в качестве своего единственного аргумента. В данном случае эта функция возвратит значение true и помещает в стек значение, возвращенное вызовом. Если метатаблицы или метаметода не существует, эта функция возвращает значение false (без помещения какого-либо значения в стек).

luaL_checkany

luaL_checkinteger

luaL_checklstring

[-0, +0, v] Проверяет, является ли аргумент arg функции строкой и возвращает эту строку; если l не является NULL заполняет *l длиной строки.

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

luaL_checknumber

luaL_checkoption

[-0, +0, v] Проверяет, является ли аргумент arg функции строкой и разыскивает эту строку в массиве lst (которая должна оканчиваться на NULL). Возвращает индекс элемента массива в котором была найдена строка. Вызывает ошибку, если аргумент не является строкой или данная строка не была найдена.

Если указатель def не является NULL, функция использует def как значение по умолчанию, когда нет аргумента arg или он является nil.

Это полезная функция для отображения строк в C перечислениях. (В Lua библиотеках обычным соглашением является использование строк вместо чисел для выбора опций.)

luaL_checkstack

luaL_checkstring

[-0, +0, v] Проверяет, является ли аргумент arg функции строкой и возвращает эту строку.

Данная функция для получения своего результата использует lua_tolstring, так что все преобразования и предостережения относительно этой функции применимы и здесь.

luaL_checktype

luaL_checkudata

luaL_checkversion

luaL_dofile

luaL_dostring

luaL_error

[-0, +0, v] Вызывает ошибку. Формат сообщения об ошибке задается fmt плюс любые дополнительные аргументы, следующие тем же правилам что и lua_pushfstring. Также она добавляет в начале сообщения (если эта информация доступна) имя файла и номер строки, где произошла ошибка.

Данная функция ничего и никогда не возвращает, но она является идиомой для использования в C функциях как return luaL_error(args).

luaL_execresult

luaL_fileresult

luaL_getmetafield

luaL_getmetatable

luaL_getsubtable

luaL_gsub

luaL_len

luaL_loadbuffer

luaL_loadbufferx

[-0, +1, –] Загружает буфер как блок (chunk) Lua. Эта функция использует lua_load для загрузки блока в буфер, с указателем buff с размером sz.

luaL_loadfile

luaL_loadfilex

[-0, +1, e] Загружает файл как блок (chunk) Lua. Данная функция использует lua_load для загрузки блока в файле по имени filename. Если значением аргумента filename является NULL, то функция загружает из стандартного ввода. Первая строка в файле игнорируется, если начинается с символа #.

Строковый аргумент mode работает как в функции lua_load.

Эта функция возвращает те же результаты, что и lua_load, но имеет дополнительный код ошибки LUA_ERRFILE, на случай, если она не может открыть/считать файл или файл имеет неправильный режим.

Как и lua_load, данная функция только загружает блок, но не запускает его.

luaL_loadstring

[-0, +1, –] Запускает строку как блок (chunk) Lua. Эта функция использует lua_load для загрузки блока в строке s, заканчивающейся символом нуля.

Эта функция возвращает те же результаты, что и lua_load.

Также как lua_load, данная функция только загружает блок, но не запускает его.

luaL_newlib

[-0, +1, e] Функция создает новую таблицу и регистрирует там функции в списке l.

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

luaL_newlibtable

[-0, +1, e] Функция создает новую таблицу с размером, оптимизированным под хранение всех записей массива l (но на самом деле не хранит их). Она предназначена для совместной работы с функцией luaL_setfuncs (смотрите luaL_newlib).

Функция реализована как макрос. Массив l должен быть на самом деле архивом, а не указателем на него.

luaL_newmetatable

[-0, +1, e] Если в реестре уже имеется ключ tname, возвращается 0. В противном случае, создает новую таблицу, которая будет использоваться как метатаблица для userdata, добавляет в эту новую таблицу пару __name = tname, дополняет реестр парой [tname] = new table и возвращает 1. (Запись __name используется некоторыми функциями, сообщающими об ошибках.)

В обоих случаях в стек помещается конечное значение, связанное в реестре с tname.

luaL_newstate

[-0, +0, –] Функция создает новое Lua состояние. Она вызывает lua_newstate с функцией выделения памяти на основе стандартной функции C realloc и затем устанавливает «тревожную» (panic) функцию (смотрите §4.6), которая печатает сообщение об ошибке к стандартному выводу ошибки в случае фатальных (неустранимых) ошибок.

Возвращает новое состояние или значение NULL, если есть ошибка выделения памяти.

luaL_openlibs

luaL_optinteger

luaL_optlstring

[-0, +0, v] Если аргумент arg функции является строкой, возвращается эта строка. Если данный аргумент отсутствует или является nil, возвращается аргумент d. В других случаях вызывает ошибку.

Если аргумент l не является NULL, заполняет позицию указанную *l, длиной получившейся строки.

luaL_optnumber

luaL_optstring

luaL_prepbuffer

luaL_prepbuffsize

luaL_pushresult

luaL_pushresultsize

luaL_ref

[-1, +0, e] Создает и возвращает ссылку, на элемент таблицы с индексом t, для объекта на вершине стека (и выталкивает объект из стека).

Ссылкой является уникальный целочисленный ключ. До тех пор, пока в таблицу t не добавлять вручную целочисленные ключи, luaL_ref гарантирует уникальность ключа, им возвращаемого. Получить объект, связанный со ссылкой r можно вызовом lua_rawgeti(L, t, r). Функция luaL_unref высвобождает ссылку и связанный с ней объект.

Если объект на вершине стека является nil, luaL_ref возвращает константу LUA_REFNIL. Константа LUA_NOREF гарантированно будет отличаться от каких-либо ссылок, возвращаемых luaL_ref.

luaL_Reg

luaL_requiref

[-0, +1, e] Если modname уже не представлена в package.loaded, то данная функция вызывает функцию openf со строкой modname в качестве аргумента и устанавливает результат вызова в package.loaded[modname], как если бы эта функция была вызвана через require.

Если glb истинно, модуль также сохраняется в глобальной modname.

Оставляет копию модуля в стеке.

luaL_setfuncs

[-nup, +0, e] Регистрирует все функции в массиве l (смотрите luaL_Reg) в таблице на вершине стека (ниже дополнительных нелокальных переменных (upvalues), смотрите далее).

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

luaL_setmetatable

luaL_Stream

Стандартное представление для дескрипторов (handle) файла, которые используются стандартной библиотекой ввода/вывода (I/O).

Эти userdata должны начинаться со структуры luaL_Stream; они могут содержать другие данные после этой начальной структуры. Поле f указывает на соответствующий C поток (или он может быть равен NULL, чтобы показать на не полностью созданный дескриптор). Поле closef указывает на функцию Lua, которая будет вызываться для завершения потока, когда дескриптор будет закрыт или собран (сборщиком мусора); эта функция принимает дескриптор файла в качестве своего единственного аргумента и должна возвратить либо true (в случае успешного выполнения) либо nil плюс сообщение об ошибке (в случае ошибки). После того, как Lua вызовет это поле, значение поля изменяется на NULL чтобы сигнализировать о закрытии дескриптора.

luaL_testudata

luaL_tolstring

[-0, +1, e] Конвертирует любое Lua значение по заданному индексу в C строку в подходящем формате. Получившаяся строка помещается в стек, а также возвращается функцией. Если аргумент len не является NULL, функция также устанавливает *len с длиной строки.

Если значение имеет метатаблицу с полем "__tostring", то функция luaL_tolstring вызывает соответствующий метаметод со значением в качестве аргумента и использует результат вызова как свой результат.

luaL_traceback

luaL_typename

luaL_unref

[-0, +0, –] Функция высвобождает ссылку ref на объект таблицы по индексу t (смотрите luaL_ref). Запись удаляется из таблицы, так что объект, на который была ссылка, может буть собран сборщиком мусора. Ссылка ref также освобождается для последующего использования.

luaL_where

Данная функция используется для построения префикса сообщений об ошибках.

Источник

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

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