需要帮助理解如何使用gsub和tonumber对Lua源代码进行编码?

我刚接触LUA,但已经弄清楚gsub是全局替换函数,而tonumber是转换函数。但我不明白这两个函数如何一起使用来生成编码字符串。

我已经尝试阅读了《Lua程序设计》和参考手册的部分,但是仍然有点困惑。

local L0_0, L1_1
function L0_0(A0_2)
  return (A0_2:gsub("..", function(A0_3)
    return string.char((tonumber(A0_3, 16) + 256 - 13 + 255999744) % 256)
  end))
end
encodes = L0_0
L0_0 = gg
L0_0 = L0_0.toast
L1_1 = "__loading__\226\128\166"
L0_0(L1_1)
L0_0 = encodes
L1_1 = --"The Encoded String"
L0_0 = L0_0(L1_1)
L1_1 = load
L1_1 = L1_1(L0_0)
pcall(L1_1)

我已经在评论中删除了编码的字符串,因为它太长了。如果需要,我可以上传编码的字符串。

点赞
用户7396148
用户7396148

gsub 函数用于获取 A0_2 的两位数部分。这意味着字符串 A0_3 是一个两位数的十六进制数,但它不是一个数字格式,因此我们无法对该值执行数学运算。可以根据 tonubmer 的使用方式推断出 A0_3 是一个十六进制数字。

tonumber 来自 Lua 5.1 参考手册

尝试将其参数转换为数字。如果参数已经是数字或可转换为数字的字符串,则 tonumber 返回该数字;否则,返回 nil。

可选参数指定解释数字的基数。基数可以是介于 2 和 36 之间(包括两端)的任何整数。在大于 10 的基数中,字母 'A'(大写或小写)表示 10,'B' 表示 11 等等,'Z' 表示 35。在十进制基数(默认情况下),数字可以有小数部分,以及可选的指数部分(请参见 §2.1)。在其他基数中,只接受无符号整数。

因此,tonumber(A0_3,16) 表示我们期望 A0_3 是一个基数为 16 的数字(十六进制数)。一旦我们获得了 A0_3 的数字值,我们执行一些数学操作,最后将其转换为一个字符。

function L0_0(A0_2)
  return (A0_2:gsub("..", function(A0_3)
        return string.char((tonumber(A0_3, 16) + 256 - 13 + 255999744) % 256)
      end))
end

该代码块将一个十六进制数的字符串转换为字符。tonumber 用于允许对值进行操作。

以下是在 Hello World 中使用的示例:

local str = "Hello World"
local hex_str = ''

for i = 1, #str do
    hex_string = hex_string .. string.format("%x", str:byte(i,i))
end

function L0_0(A0_2)
  return (A0_2:gsub("..", function(A0_3)
    return string.char((tonumber(A0_3, 16) + 256 - 13 + 255999744) % 256)
  end))
end

local encoded = L0_0(hex_str)
print(encoded)

输出:

;X__bJbe_W

将其还原为原始字符串:

function decode(A0_2)
  return (A0_2:gsub("..", function(A0_3)
    return string.char((tonumber(A0_3, 16) + 13) % 256)
  end))
end

hex_string = ''
for i = 1, #encoded do
    hex_string = hex_string .. string.format("%x", encoded:byte(i,i))
end

print(decode(hex_string))
2019-05-17 19:50:10