223 lines
7.3 KiB
C
223 lines
7.3 KiB
C
// SPDX-License-Identifier: LGPL-3.0-only
|
|
// SPDX-FileCopyrightText: 2021 Heersin <teablearcher@gmail.com>
|
|
|
|
// put common definition of luac
|
|
|
|
#ifndef BUILD_LUAC_COMMON_H
|
|
#define BUILD_LUAC_COMMON_H
|
|
|
|
#include <rz_bin.h>
|
|
#include <rz_lib.h>
|
|
#include <rz_list.h>
|
|
|
|
typedef ut32 LUA_INSTRUCTION;
|
|
|
|
/* Macros About Luac Format */
|
|
#define LUAC_MAGIC_OFFSET 0x00
|
|
#define LUAC_MAGIC_SIZE 4
|
|
#define LUAC_VERSION_OFFSET 0x04
|
|
#define LUAC_VERSION_SIZE 1
|
|
|
|
#define LUAC_MAGIC "\x1b\x4c\x75\x61"
|
|
|
|
/* Lua Constant Tag */
|
|
#define makevariant(t, v) ((t) | ((v) << 4))
|
|
|
|
#define LUA_TNIL 0
|
|
#define LUA_TBOOLEAN 1
|
|
#define LUA_TNUMBER 3
|
|
#define LUA_TSTRING 4
|
|
|
|
#define LUA_VNIL makevariant(LUA_TNIL, 0)
|
|
#define LUA_VFALSE makevariant(LUA_TBOOLEAN, 0)
|
|
#define LUA_VTRUE makevariant(LUA_TBOOLEAN, 1)
|
|
#define LUA_VNUMINT makevariant(LUA_TNUMBER, 0) /* integer numbers */
|
|
#define LUA_VNUMFLT makevariant(LUA_TNUMBER, 1) /* float numbers */
|
|
#define LUA_VSHRSTR makevariant(LUA_TSTRING, 0) /* short strings */
|
|
#define LUA_VLNGSTR makevariant(LUA_TSTRING, 1) /* long strings */
|
|
|
|
/**
|
|
* \struct lua_proto_ex
|
|
* \brief Store valuable info when parsing. Treat luac file body as a main function.
|
|
*/
|
|
typedef struct lua_proto_ex {
|
|
ut64 offset; ///< proto offset in bytes
|
|
ut64 size; ///< current proto size
|
|
|
|
ut8 *proto_name; ///< current proto name
|
|
int name_size; ///< size of proto name
|
|
|
|
ut64 line_defined; ///< line number of function start
|
|
ut64 lastline_defined; ///< line number of function end
|
|
|
|
ut8 num_params; ///< number of parameters of this proto
|
|
ut8 is_vararg; ///< is variable arg?
|
|
ut8 max_stack_size; ///< max stack size
|
|
|
|
/* Code of this proto */
|
|
ut64 code_offset; ///< code section offset
|
|
ut64 code_size; ///< code section size
|
|
ut64 code_skipped; ///< opcode data offset to code_offset.
|
|
|
|
/* store constant entries */
|
|
RzList /*<LuaConstEntry *>*/ *const_entries; ///< A list to store constant entries
|
|
ut64 const_offset; ///< const section offset
|
|
ut64 const_size; ///< const section size
|
|
|
|
/* store upvalue entries */
|
|
RzList /*<LuaUpvalueEntry *>*/ *upvalue_entries; ///< A list to store upvalue entries
|
|
ut64 upvalue_offset; ///< upvalue section offset
|
|
ut64 upvalue_size; ///< upvalue section size
|
|
|
|
/* store protos defined in this proto */
|
|
RzList /*<LuaProto *>*/ *proto_entries; ///< A list to store sub proto entries
|
|
ut64 inner_proto_offset; ///< sub proto section offset
|
|
ut64 inner_proto_size; ///< sub proto section size
|
|
|
|
/* store Debug info */
|
|
ut64 debug_offset; ///< debug section offset
|
|
ut64 debug_size; ///< debug section size
|
|
RzList /*<LuaLineinfoEntry *>*/ *line_info_entries; ///< A list to store line info entries
|
|
RzList /*<LuaAbsLineinfoEntry *>*/ *abs_line_info_entries; ///< A list to store absolutely line info entries
|
|
RzList /*<LuaLocalVarEntry *>*/ *local_var_info_entries; ///< A list to store local var entries
|
|
RzList /*<LuaLocalVarEntry *>*/ *dbg_upvalue_entries; ///< A list to store upvalue names
|
|
|
|
} LuaProtoHeavy;
|
|
|
|
typedef LuaProtoHeavy LuaProto;
|
|
|
|
/**
|
|
* \struct lua_constant_entry
|
|
* \brief Store constant type, data, and offset of this constant in luac file
|
|
*/
|
|
typedef struct lua_constant_entry {
|
|
ut8 tag; ///< type of this constant, see LUA_V* macros in luac_common.h
|
|
void *data; ///< can be Number/Integer/String
|
|
int data_len; ///< len of data
|
|
ut64 offset; ///< addr of this constant
|
|
} LuaConstEntry;
|
|
|
|
/**
|
|
* \struct lua_upvalue_entry
|
|
* \brief Store upvalue attributes
|
|
*/
|
|
typedef struct lua_upvalue_entry {
|
|
/* attributes of upvalue */
|
|
ut8 instack; ///< is in stack
|
|
ut8 idx; ///< index
|
|
ut8 kind; ///< kind
|
|
ut64 offset; ///< offset of this upvalue
|
|
} LuaUpvalueEntry;
|
|
|
|
typedef struct LuaProto LuaProtoEntry;
|
|
|
|
/**
|
|
* \struct lua_lineinfo_entry
|
|
* \brief Store line info attributes
|
|
*/
|
|
typedef struct lua_lineinfo_entry {
|
|
ut32 info_data;
|
|
ut64 offset;
|
|
} LuaLineinfoEntry;
|
|
|
|
/**
|
|
* \struct lua_abs_lineinfo_entry
|
|
* \brief Store line info attributes
|
|
*/
|
|
typedef struct lua_abs_lineinfo_entry {
|
|
int pc; ///< pc value of lua
|
|
int line; ///< line number in source file
|
|
ut64 offset;
|
|
} LuaAbsLineinfoEntry;
|
|
|
|
/**
|
|
* \struct lua_local_var_entry
|
|
* \brief Store local var names and other info
|
|
*/
|
|
typedef struct lua_local_var_entry {
|
|
ut8 *varname; ///< name of this variable
|
|
int varname_len; ///< length of name
|
|
int start_pc; ///< first active position
|
|
int end_pc; ///< first deactive position
|
|
ut64 offset; ///< offset of this entry
|
|
} LuaLocalVarEntry;
|
|
|
|
/**
|
|
* \struct lua_dbg_upvalue_entry
|
|
* \brief Store upvalue's debug info
|
|
*/
|
|
typedef struct lua_dbg_upvalue_entry {
|
|
ut8 *upvalue_name; ///< upvalue name
|
|
int name_len; ///< length of name
|
|
ut64 offset;
|
|
} LuaDbgUpvalueEntry;
|
|
|
|
/**
|
|
* \struct lua_bin_info
|
|
* \brief A context info structure for luac plugin.
|
|
*/
|
|
typedef struct luac_bin_info {
|
|
st32 major; ///< major version
|
|
st32 minor; ///< minor version
|
|
RzPVector /*<RzBinSection *>*/ *section_vec; ///< list of sections
|
|
RzList /*<RzBinSymbol *>*/ *symbol_list; ///< list of symbols
|
|
RzList /*<RzBinAddr *>*/ *entry_list; ///< list of entries
|
|
RzList /*<RzBinString *>*/ *string_list; ///< list of strings
|
|
RzBinInfo *general_info; ///< general binary info from luac header
|
|
} LuacBinInfo;
|
|
|
|
/* ========================================================
|
|
* Common Operation to Lua structures
|
|
* Implemented in 'bin/format/luac/luac_common.c'
|
|
* ======================================================== */
|
|
LuaDbgUpvalueEntry *lua_new_dbg_upvalue_entry();
|
|
LuaLocalVarEntry *lua_new_local_var_entry();
|
|
LuaAbsLineinfoEntry *lua_new_abs_lineinfo_entry();
|
|
LuaLineinfoEntry *lua_new_lineinfo_entry();
|
|
LuaUpvalueEntry *lua_new_upvalue_entry();
|
|
LuaConstEntry *lua_new_const_entry();
|
|
LuaProto *lua_new_proto_entry();
|
|
|
|
void lua_free_dbg_upvalue_entry(LuaDbgUpvalueEntry *);
|
|
void lua_free_local_var_entry(LuaLocalVarEntry *);
|
|
void lua_free_const_entry(LuaConstEntry *);
|
|
void lua_free_proto_entry(LuaProto *);
|
|
|
|
/* ========================================================
|
|
* Common Operation to RzBinInfo
|
|
* Implemented in 'bin/format/luac/luac_bin.c'
|
|
* ======================================================== */
|
|
void luac_add_section(RzPVector /*<RzBinSection *>*/ *section_list, char *name, ut64 offset, ut32 size, bool is_func);
|
|
void luac_add_symbol(RzList /*<RzBinSymbol *>*/ *symbol_list, char *name, ut64 offset, ut64 size, const char *type);
|
|
void luac_add_entry(RzList /*<RzBinAddr *>*/ *entry_list, ut64 offset, int entry_type);
|
|
void luac_add_string(RzList /*<RzBinString *>*/ *string_list, char *string, ut64 offset, ut64 size);
|
|
|
|
LuacBinInfo *luac_build_info(LuaProto *proto);
|
|
void luac_build_info_free(LuacBinInfo *bin_info);
|
|
void _luac_build_info(LuaProto *proto, LuacBinInfo *info);
|
|
|
|
/* ========================================================
|
|
* Export version specified Api to bin_luac.c
|
|
* Implemented in 'bin/format/luac/v[version]/bin_[version]
|
|
* ======================================================== */
|
|
RzBinInfo *lua_parse_header_54(RzBinFile *bf, st32 major, st32 minor);
|
|
LuaProto *lua_parse_body_54(RzBuffer *buffer, ut64 offset, ut64 data_size);
|
|
|
|
RzBinInfo *lua_parse_header_53(RzBinFile *bf, st32 major, st32 minor);
|
|
LuaProto *lua_parse_body_53(RzBuffer *buffer, ut64 offset, ut64 data_size);
|
|
|
|
#define lua_check_error_offset(offset) \
|
|
if ((offset) == 0) { \
|
|
return 0; \
|
|
}
|
|
#define lua_check_error_offset_proto(offset, proto) \
|
|
if ((offset) == 0) { \
|
|
lua_free_proto_entry((proto)); \
|
|
return NULL; \
|
|
}
|
|
#define lua_return_if_null(proto) \
|
|
if ((proto) == NULL) { \
|
|
return 0; \
|
|
}
|
|
|
|
#endif // BUILD_LUAC_COMMON_H
|