導航:首頁 > 源碼編譯 > 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庫編譯選項相關的資料

熱點內容
幻影伺服器怎麼樣 瀏覽:27
具體哪些廣東公司招程序員 瀏覽:867
嵌入式編譯器教程 瀏覽:302
ssl數據加密傳輸 瀏覽:86
51單片機定時器方式2 瀏覽:330
命令行查看開機時間 瀏覽:812
python微博復雜網路分析 瀏覽:550
rf3148編程器 瀏覽:505
浙江標准網路伺服器機櫃雲主機 瀏覽:587
設置網路的伺服器地址 瀏覽:600
java圖形界面設計 瀏覽:751
純前端項目怎麼部署到伺服器 瀏覽:538
瓜子臉程序員 瀏覽:505
如何保證伺服器優質 瀏覽:94
小微信aPP怎麼一下找不到了 瀏覽:299
演算法纂要學術價值 瀏覽:975
程序員你好是什麼意思 瀏覽:802
倩女幽魂老伺服器如何玩 瀏覽:563
電子鍾單片機課程設計實驗報告 瀏覽:1001
看加密頻道 瀏覽:383