导航:首页 > 源码编译 > luac库编译选项

luac库编译选项

发布时间:2023-04-17 21:22:28

A. 如何把lua编译成luac

不是在lua解释器里用的……
命令行下luac 文件名
你这样等于是试图解释lua语句luac.exe asd.lua,同时提供两个table的键值,自然非法

B. 如何用 qt Creator 5.0.2 编译 lua 生产 lua.dll

在win下消让编译dll需要做这些事情:
lua的源代兆含码有三个重要部分:luac.c lua.c 其他c文件
动态链接库。 新建一个 dll 工程。 把除了 luac.c lua.c 的所有c文件加进工程拿猜局。
在 luaconf.h开始加上 #define LUA_BUILD_AS_DLL
然后编译。

C. 如何在windows下安装FLANN函数库

如何搭建
1.生成Lua静态库
(1)下载lua src。
最新版本是5.2.3。 下载地址。
(2)新建VS Win32控制台应用程序,取名为Lua。在应用程序设置中选择应用程序类型为静态库,附加选项中取消预编译头的勾选。

(3)在Lua的VS项目文件夹中新建LuaSrc目录,用于存放Lua源码解压下载的lua src,拷贝src目录下所有 * .c和 * .h文件到LuaSrc。
(4)在Lua的VS项目文件夹中新建bin目录,用于存放Lua.lib。
(5)在VS环境中,右键点击Lua项目好运,选择添加->现有项,导入LuaSrc目录下所有的文件。
(6)右键点击Lua项目,选择属性,在顶部选择所有配置,然后修改配置属性->常规->输出目录为
$(SolutionDir)bin

(7)为了禁止一些安全警告(Windows程序员知道为什么),需要再修改配置属性->C/C++–>预处理器->预处理器定义,在锋腔末尾添加
;_CRT_SECURE_NO_DEPRECATE;_SCL_SECURE_NO_DEPRECATE

(8)选择release模式,点击项目,生成Lua.lib即可。Lua.lib生成在bin目录下。
2.调用Lua静态库
(1)在Lua解决方案下新建名字为HelloLua的Win32控制台程序,采用默认选项,不做修改。
(2)右键点击HelloLua项目,选择属性,修改配置属性->C/C++–>附加包含目录,新增
..\LuaSrc

(3)在修改配置属性->链接器->输入->附加依赖项,新增
..\bin\Lua.lib

或者使用代码链接lua库,即在HeloLua.cpp中添加如下代码,
#pragma comment (lib,"../bin/Lua.lib")

(4)设置HelloLua项目为默认启动项,点击生成项目即可。
(5)因为此时main函数并没有执行任何代码,所以控制台一闪而过。右键HelloLua项目的源文件,添加新建项,取名hellolua.lua。
(6)一个简单的调用示例:

*hellolua.lua*

print("Hello, Lua")

*HelloLua.cpp*

#include "stdafx.h"
#pragma comment (lib,"Lua.lib")

#include "lua.hpp"

int _tmain(int argc, _TCHAR* argv[])
{
lua_State* lua_state = luaL_newstate();
luaL_openlibs(lua_state);
luaL_dofile(lua_state,"hellolua.lua");
lua_close(lua_state);
getchar();
return 0;
}

效果

3.生成Lua.exe和Luac.exe
由于下载的lua源码中包含lua.c和luac.c,这两个文件都有main入口,同时编译的话会出错,所以只要删除其中一个,另一个就可以正常编译。
(1)新建VS空项目,取名为Lua。
(2)在Lua的VS项友基梁目文件夹中新建LuaSrc目录,用于存放Lua源码。解压下载的lua src,拷贝src目录下是所有 * .c和 * .h文件。
(3)在VS环境中,右键点击Lua项目,选择添加->现有项,导入LuaSrc目录下所有的文件。
(4)右键点击Lua项目,选择属性,在顶部选择所有配置,然后修改配置属性->C/C++–>预处理器->预处理器定义,在末尾添加
;_CRT_SECURE_NO_DEPRECATE;_SCL_SECURE_NO_DEPRECATE

(5)在Lua项目的源文件,找到luac.c,右键移除。
(6)选择release模式,点击项目生成lua.exe即可。
(7)同理在同个解决方案下创建LuaC空项目,按以上步骤生成luac.exe。只是第五步要改为“找到lua.c,右键移除”。
(8)lua.exe和luac.exe生成在Lua项目目录下的release目录。

D. luac文件怎么进行反编译

lua源文件--obfuscate-->lua源文件(混淆后)--compile-->luac文件(带调试用的变量名和行号)--strip-->luac文件(不带调试信息)

lua/luac--加密/打包-->数据文件


数据文件--解包/解密-->lua/luac-->lua虚拟机


1. 跟踪,脱壳,解包,解密,获得 luac


追 luaL_loadbuffer luaL_loadfile lua_load 应该可以找到 解密函数。

hook 这3个函数,导出解密后的数据,直接就是 luac 文件。如果没编译甚至是 lua源文件。


hook luaV_execute 可以拿到 Proto* ,想办法用 luaU_mp 导出。luaD_precall 应该没必要搞。


2. 非标准 luac 处理


我们有两种方案来处理得到的 luac


1. 得到一个能够执行上述非标 luac 的 lua 版本

搞清楚编译方式,改 lua 源文件,编译出一个,这样做什么都可以,还能编译出对应的 luadec 。

如果能找到 lua51.dll 之类的就直接调用吧。但是,只能用于导出 luac 对比文件格式,或者执行找到的几个关键函数。

2. 将非标 luac 转换成标准格式 luac,正所谓:山不来就我,我便去就山

非标准 luac 是怎么做的:


1. bad header 改文件头

#define LUA_SIGNATURE "33Lua" // lua.h

2. bad header 改数据类型

// luaconf.h

#define LUA_NUMBER_DOUBLE

#define LUA_NUMBER double

LUA_NUMBER to float

LUA_NUMBER_SCAN to "%f"

LUA_NUMBER_FMT to "%.7g"

l_mathop(x) to (x##f)

lua_str2number to use strtof


3. bad code OpCode 重定义

// 改有 "ORDER OP" 的地方

/* grep "ORDER OP" if you change these enums */

enum OpCode; // lopcodes.h

const lu_byte luaP_opmodes[]; // lopcodes.c

const char *const luaP_opnames[]; // lopcodes.c


生成一个被破解程序可以执行的 luac 文件用于对比,分析格式

想办法执行下面的代码,编译 allopcodes.lua 并导出, 与标准 lua 编译相同源文件生成的进行对比。


1. 在 C 内导出

lua_State* L = luaL_newstate();

luaL_loadbuffer or luaL_loadstring or luaL_loadfile

Closure* c=(Closure*)lua_topointer(L, -1);

Proto* f = c->l.p;//Closure如果改了偏移会不同

luaU_mp(L, f, writer, D, 0);//非导出函数

lua_close(L);


2. 用 lua 导出到文件或者string

lua_State* L = luaL_newstate();

luaopen_string(L);

luaopen_io(L);

luaL_dostring or luaL_dofile

char* str = lua_tostring(L, -1);

lua_close(L);

-- luaopen_string 此库必须打开

allopcodes() allopcodes.lua文件内容 end

chunk = string.mp(allopcodes)

if luaopen_io then --如果 io 可用,则可以直接写文件

file:write(chunk)

else

output(chunk,to_any_where) --想办法把 chunk 搞出来

return chunk

end

E. lua脚本怎么编译成二进制

luac的参数提供完整路径,或者在lua文件所在目录打开命令行
另外请确认已正确设置环境变量(如在cmd下直接luac可以运行,即提示no input files give即可)

比如lua文件在E:\f1\f2\f3\a.lua的话
cmd ->
luac e:\f1\f2\f3\a.lua
或者
在资源管理器中浏览到f2,然后shift+右键f3,在此打开命令行 (仅win7,xp貌似没这选项),然后luac a.lua
又或者
cmd ->
e: --打开E盘
cd f1\f2\f3 --cd命令进入f3
luac a.lua

F. lua脚本被luac编译之后,如何反编译或者反汇

标准的lua4.01 有“CFLuaDC”工具可以反编译。
标准的lua5 有 “DisLua”、“luadec” 两个工具可供选用。
--------以上三个工具在网上可搜索下载。
luajit 编译的luac 文件 尚无反编译工具。

G. lua 怎么反编译

1.Lua的虚拟机指令,5.2 的有40条

Lua的指令使用一个32bit的unsigned integer表示。所有指令的定义都在lopcodes.h文件中(可以从Lua 官方网站下
载),使用一个enum OpCode代表指令类型。在lua5.2中,总共有40种指令(id从0到39)。根据指令参数的不同,可以将所有指令分为4
类:

typedef enum {
/*----------------------------------------------------------------------
name args description

------------------------------------------------------------------------*/
OP_MOVE,/* A B R(A) := R(B) */
OP_LOADK,/* A Bx R(A) := Kst(Bx) */
OP_LOADKX,/* A R(A) := Kst(extra arg) */
OP_LOADBOOL,/* A B C R(A) := (Bool)B; if (C) pc++ */
OP_LOADNIL,/* A B R(A), R(A+1), ..., R(A+B) := nil */
OP_GETUPVAL,/* A B R(A) := UpValue[B] */

OP_GETTABUP,/* A B C R(A) := UpValue[B][RK(C)] */
OP_GETTABLE,/* A B C R(A) := R(B)[RK(C)] */

OP_SETTABUP,/* A B C UpValue[A][RK(B)] := RK(C) */
OP_SETUPVAL,/* A B UpValue[B] := R(A) */
OP_SETTABLE,/* A B C R(A)[RK(B)] := RK(C) */

OP_NEWTABLE,/* A B C R(A) := {} (size = B,C) */

OP_SELF,/* A B C R(A+1) := R(B); R(A) := R(B)[RK(C)] */

OP_ADD,/* A B C R(A) := RK(B) + RK(C) */
OP_SUB,/* A B C R(A) := RK(B) - RK(C) */
OP_MUL,/* A B C R(A) := RK(B) * RK(C) */
OP_DIV,/* A B C R(A) := RK(B) / RK(C) */
OP_MOD,/* A B C R(A) := RK(B) % RK(C) */
OP_POW,/* A B C R(A) := RK(B) ^ RK(C) */
OP_UNM,/* A B R(A) := -R(B) */
OP_NOT,/* A B R(A) := not R(B) */
OP_LEN,/* A B R(A) := length of R(B) */

OP_CONCAT,/* A B C R(A) := R(B).. ... ..R(C) */

OP_JMP,/* A sBx pc+=sBx; if (A) close all upvalues >= R(A) + 1 */
OP_EQ,/* A B C if ((RK(B) == RK(C)) ~= A) then pc++ */
OP_LT,/* A B C if ((RK(B) < RK(C)) ~= A) then pc++ */
OP_LE,/* A B C if ((RK(B) <= RK(C)) ~= A) then pc++ */

OP_TEST,/* A C if not (R(A) <=> C) then pc++ */
OP_TESTSET,/* A B C if (R(B) <=> C) then R(A) := R(B) else pc++ */

OP_CALL,/* A B C R(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1)) */
OP_TAILCALL,/* A B C return R(A)(R(A+1), ... ,R(A+B-1)) */
OP_RETURN,/* A B return R(A), ... ,R(A+B-2) (see note) */

OP_FORLOOP,/* A sBx R(A)+=R(A+2);
if R(A) <?= R(A+1) then { pc+=sBx; R(A+3)=R(A) }*/
OP_FORPREP,/* A sBx R(A)-=R(A+2); pc+=sBx */

OP_TFORCALL,/* A C R(A+3), ... ,R(A+2+C) := R(A)(R(A+1), R(A+2)); */
OP_TFORLOOP,/* A sBx if R(A+1) ~= nil then { R(A)=R(A+1); pc += sBx }*/

OP_SETLIST,/* A B C R(A)[(C-1)*FPF+i] := R(A+i), 1 <= i <= B */

OP_CLOSURE,/* A Bx R(A) := closure(KPROTO[Bx]) */

OP_VARARG,/* A B R(A), R(A+1), ..., R(A+B-2) = vararg */

OP_EXTRAARG/* Ax extra (larger) argument for previous opcode */
} OpCode;

**********************************************************
虚拟机指令(2) MOVE & LOAD

OP_MOVE A B
OP_MOVE用来将寄存器B中的值拷贝到寄存器A中,由于Lua是基于寄存器虚拟机,大部分的指令都是直接对寄存器进行操作,而不需要对数据进行压栈和弹栈。OP_MOVE 指令的作用 是将一个Local变量复制给另一个local变量.
例子:
local a = 10;
local b = a;
编译出来的结果
1 [1] LOAD 0 1;1代表的是常量表的项,这里代表的是10
2 [2] MOVE 1 0
所代表的二进制为
B A OP_Code
Load 0 1 = 100000000 000000000 00000000 000001 = 0x80000001 ,
也就是说, 0x80000001 的二进制所代表的指令为 Load 0 1,这里B中的最高位为1,表示的B为常量表的序号,而不是寄存器

MOVE 1 0 = 000000000 000000000 00000001 000000 = 0x40

*****************华丽分割线***********************************************
1.lua 的二进制格式,官方的luac.exe 编译出来的格式

原始的lua 脚本为
local a = 10
local b = a
print(b)

下面介绍格式文件,介绍每个字段的意思.当然啦,这种格式是官方的,各个游戏公司可能会做一些改动,但是万变不离其宗。个个字段已经用颜色标明了
在lua 的源文件中,前面四个字节 1b 4c 75 61 也就是 \033Lua , 标识的是lua文件的特有的标示符数据格式,代表是lua
#define LUA_SIGNATURE "\033Lua" 033时八进制 = 0x1b ,很多那些反编译工具判断这四个字节的值,来判断是否能反编译,很多公司都会偷偷的去掉或者用其他的值来替换,以迷惑菜鸟。呵呵

52 第五个字节,表示的是,当前lua 的目标版本,这里指的是5.2 版本。
感觉编辑的好痛苦,我还是直接贴我的比较图算了,看起来比较舒服

函数的头描述
linedefined = 00 00 00 00 ;函数定义开始处的行号
linedefined = 00 00 00 00 ; 函数定义结束处的行号 ;顶级函数开始和结束行号都是为00
numparams = 00 ;固定参数的数目 number of fixed parameters
is_vararg = 01 ;可变参数标识符
• 1=VARARG_HASARG
• 2=VARARG_ISVARARG
• 4=VARARG_NEEDSARG
maxstacksize = 03 ;调用函数所需要的堆栈空间指令段
sizecode = 06 00 00 00 ; 函数中 指令的数目,缓存区的大小 = sizecode * sizeof(Instruction),每四个字节为一条指令
code = 02 00 00 00 41 00 00 00 87 40 40 00 c1 00 80 00 a0 40 00 01 1e 00 80 00

常量列表 保存着函数中引用的常量的列表 (常量池)
Constant.sizek = 02 00 00 00 ;常量列表的大小 ,缓存区的大小 = Constant.sizek * sizeof(TValue) = 2 * 8 = 16,每项为8个字节,
TValue * = 03 00 00 .
00 00 00 00 24 40 04 06 00 00 00 70 72 69 6e 74 [email protected]
Constant list 数据结构 保存着函数中引用的常量的列表 (常量池)
Integer 常量列表的大小 (sizek)
[
1 byte 常量类型 (value in parentheses): • 0=LUA_TNIL, 1=LUA_TBOOLEAN,• 3=LUA_TNUMBER, 4=LUA_TSTRING
Const 常量本身: 如果常量类型是0这个域不存在;如果类型是1,这个是0或1;如果类型是3这个域是 Number;如果类型是4 这个域是String。
]
这里的String 是包含"0"为结束的字符串

为什么上传图片以后,图片都变小了,而且不清晰呢?

***********************给大家发一点福利,矫正虚拟机指令的函数**************************************
//矫正虚拟机指令
DWORD Rectify(DWORD Source);
{
DWORD Instruction = Source;
BYTE Source_OpCode = Instruction & 0x3F;
switch(Source_OpCode)
{
case OP_MOVE:
Source_OpCode = Target_OpCode;
break;
...
}
Instruction = ((Instruction & 0xFFFFFFC0) | Source_OpCode);
return Instruction
}

H. lua脚本怎么编译成luac

luac xxx.lua

luac产生单个输出文件,它包含所有给定的源代码文件的字节码。缺省时,输出文件命名为luac.out,但你能通过选项-o改变。

I. lua编译为luac后失效,就是一个游戏的MOD是用lua写的,未编译为luac可以正常执行,

你那个 luac4.exe 可能损坏,从官网上重新下载试试。

J. ygopro的卡片脚本编译问题(lua)

楼上的有点技术好不好= =
楼主指的是luac编译成字节弯纤码之后的文件。

如果要反编译也不是不行,但是必须要是lua5.1的luac编译出的文件才能反编译;其次,如果是愤怒的小鸟免谈,它自己编译了lua和历燃luac的规则,基本反肢闹虚编译很难。

如果符合要求的话去下载luadec工具吧。

阅读全文

与luac库编译选项相关的资料

热点内容
电脑编程属于it吗 浏览:353
如何分辨文件夹 浏览:714
哪里能学懂通达信每个源码的含义 浏览:833
命令式过去式形式 浏览:450
车铣复合铣六角编程实例 浏览:743
android通知的呼吸灯 浏览:907
单片机排针的功能 浏览:849
华为的服务器现在被什么公司收购 浏览:285
服务器粘包怎么处理 浏览:726
怎么进创意工坊的服务器 浏览:786
空调压缩机加变频器 浏览:968
加密货币有哪些可以玩 浏览:993
腾讯云服务器如何生成备案授权码 浏览:950
计算机学算法好还是人工智能 浏览:500
java命令运行eclipse 浏览:979
u盘加密其他办法 浏览:808
zm螺纹算法 浏览:778
excel与数据分析pdf 浏览:153
特斯拉的智能算法 浏览:204
单片机开发费用 浏览:937