LUA中的LoadString()在LUA中使用的这种不寻常的文本是什么



我有一些LUA代码,这似乎是通过默默无闻保护代码的尝试。我对loadstring()函数的理解是文本字符串由LUA源代码文本组成,然后通过loadstring()方法转换为可执行的LUA代码。

使用以下LUA源,我尝试通过在变量code上调用print来读取变量code的内容;虽然我确实在转换后的字符串中看到了一些有效的源文本,但大多数字符都没有显示(我假设具有低于40及以上的字符代码的字符(。请注意,ASCII中有一些特别高的值,例如231显然是在扩展集中,是商标标志。此外,那里有几个空字符。所有这些使我怀疑它是否确实是ascii。

有人可以告诉我字符串是否有效lua源,以及如何使lua返回字符串作为可打印字符,以便我可以看到此代码的作用?

当我在Windows的Lua控制台中使用print运行我的版本时,我得到了许多空盒子,大概是该控制台只能打印纯ASCII?

请注意,该代码是使用LUA版本5.0.2

执行的。
code='2776117978014446899818291471042312451256512641081179710110910346108117971523816171717171718181920213535264949375959546166241045212012277711110011710810112221241312212297781111001017897109101115469090654849469090654850414122122978410112011690101105108101110412122122978011111510511610511111032406348122122978410112011641420122122976711711411410111011684101120116869710811710149122122978310111611711241012212297831011081019911649122122978210111510111642171433444555545778471151161141169810813164010211111432103101110101114971161111144151112401021111143211511697116101415112118511247981171021021011144114651711312812222128154198583124742918425412751271127128261141827282829293032323232323333333333273528122122977010510810117612210110510810131617771111001171081015451141019710041412212297841011201169010110510810111041212212297801111151051161051111103240631814831281396211531185128125201281482128426631243701911373128124243701911314019113201128126221225112727128371272139393939394040404043464646464646464646464936118971081171012091101111001017897109101202012212297831011081019911610110080111115105116105111110102017771111001171081017481221229784101120116414122122978410112011690101105108101110420122122976711711411410111011684101120116869710811710145679710810845909065484145865991161051189711610178111100101324063214243198190136128132011252424313419013201126221973114128565161471241151614712925129168923271285414195656565656565656565757575757575757575917771111001171081017456797108108413122122977811110010178971091011153240634145865991161051189711610178111100101449710810833641954119819016191119321471281112651389254119819016192119321471281112651389227128233420211012653129495213712511021371281261201631271736412817364129198212813712812911622128137130122621281371281301271127128';
return loadstring(code)();

此字符串是将LUA代码的有效块预先编译到字节码中。头说这是针对LUA 5.0。它不是文本,不需要解码,因此可以直接使用loadstring()

直接运行

提供了比弗拉德(Vlad(的答案更多的详细信息。

LUA loadstring()函数接受LUA源文本或LUA字节码的字符串。看来该功能通过查看字符串的第一个字符来查看它是逃生字符(0x1b还是Decimal 27(来确定文本的类型。

loadstring()功能返回匿名函数,因此在代码示例中:

code='2776117978014446899818291471042312451256512641081179710110910346108117971523816171717171718181920213535264949375959546166241045212012277711110011710810112221241312212297781111001017897109101115469090654849469090654850414122122978410112011690101105108101110412122122978011111510511610511111032406348122122978410112011641420122122976711711411410111011684101120116869710811710149122122978310111611711241012212297831011081019911649122122978210111510111642171433444555545778471151161141169810813164010211111432103101110101114971161111144151112401021111143211511697116101415112118511247981171021021011144114651711312812222128154198583124742918425412751271127128261141827282829293032323232323333333333273528122122977010510810117612210110510810131617771111001171081015451141019710041412212297841011201169010110510810111041212212297801111151051161051111103240631814831281396211531185128125201281482128426631243701911373128124243701911314019113201128126221225112727128371272139393939394040404043464646464646464646464936118971081171012091101111001017897109101202012212297831011081019911610110080111115105116105111110102017771111001171081017481221229784101120116414122122978410112011690101105108101110420122122976711711411410111011684101120116869710811710145679710810845909065484145865991161051189711610178111100101324063214243198190136128132011252424313419013201126221973114128565161471241151614712925129168923271285414195656565656565656565757575757575757575917771111001171081017456797108108413122122977811110010178971091011153240634145865991161051189711610178111100101449710810833641954119819016191119321471281112651389254119819016192119321471281112651389227128233420211012653129495213712511021371281261201631271736412817364129198212813712812911622128137130122621281371281301271127128';
return loadstring(code)();

您有一个文本字符串,其中包含LUA字节码,如 27的领先逃生字符所示,然后呼叫loadstring()来创建一个函数,然后执行该函数。

文本字符串的前几个字符包含预编译的LUA标头(请参见Lua 5.2字节码和虚拟机(。该标头的长度因LUA的版本而异。但是,前几个字符似乎是相当标准的。code='27761179780 ...包含逃生字符(0x1b或Decimal 27(,大写字母L(十进制76(,小写字母U(十进制117(,下部案例字母A(十进制97(和LUA版本(Decimal 80 IS 0x50 IS 0x50指示版本5.0(。

以下示例来自LUA 5.2字节码和虚拟机。

字节码到底是什么?这是Hello.luac的Hexdump (由HD在我的系统上制造(。

00000000  1b 4c 75 61 52 00 01 04  04 04 08 00 19 93 0d 0a  |.LuaR...........|
00000010  1a 0a 00 00 00 00 00 00  00 00 00 01 04 07 00 00  |................|
00000020  00 01 00 00 00 46 40 40  00 80 00 00 00 c1 80 00  |.....F@@........|
00000030  00 96 c0 00 01 5d 40 00  01 1f 00 80 00 03 00 00  |.....]@.........|
00000040  00 04 06 00 00 00 48 65  6c 6c 6f 00 04 06 00 00  |......Hello.....|

该格式未正式记录,需要为 反向工程。必要的材料在LUA源代码中, 当然,在几个地方,主要是ldump.c和lundump.c。我有 也与NFI和LAT进行了交叉检查,但剩余的任何错误是 我的。

代码以18字节文件标头开头,所有标题都相同 官方LUA 5.2字节码在像您这样的机器上编译,无论是 LUAC或LOADFILE。LUA 5.1只有一个12字节的标题,类似 到该字节的前12个字节。

字节数为Origin-1小数(主要显示算术( 和Origin-0 HEX。

1 x00:1b 4c 75 61 lua_signature来自lua.h。

5 x04:52 00 LUA版本的二进制编码十进制52,00要说字节码为 与"官方" PUC-RIO实施兼容。

5 2 x06:01 04 04 04 08 00六个系统参数。在X386机器上,他们的意思是: Little-endian,4字节整数,4字节VM说明,4字节size_t 数字,8字节LUA数字,浮点。这些参数必须全部 匹配字节码文件和LUA解释器,否则 字节码无效。

7 6 x0c:19 93 0d 0a 1a 0a 总之 LUA 5.2从PUC-RIO产生的字节码。在lundump.h中描述为 "捕获转换错误的数据"。可能是由 二进制编码的十进制十进制1993年(全部开始的一年(,Windows系列 终结器,MS-DOS文本文件终结器,UNIX LINE终结器。

这18个字节是在文件中定义的函数。每个功能 从11字节函数标头开始。

13 6 x12:00 00 00 00在源代码中启动的源代码中的行号。 0对于主块。

19 4 x16:00 00 00 00 00 00 00 块停止的代码。0对于主块。

23 4 x1a:00 01 04 参数数量,vararg标志,此使用的寄存器数量 功能(显然不超过255(。本地变量存储在 寄存器;其中可能不超过200个(请参阅lparser.c(。

最新更新