需要帮助来了解如何使用gsub和tonumber编码lua源代码吗?

时间:2019-05-17 19:22:01

标签: encryption encoding lua

我是LUA的新手,但发现gsub是全局替换函数,而tonumber是转换函数。我不明白的是这两个函数如何一起使用来产生编码的字符串。

我已经尝试阅读PIL(在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)

我删除了放置注释的编码字符串,因为注释持续了多长时间。如果需要,我也可以上传编码后的字符串。

1 个答案:

答案 0 :(得分:1)

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

tonumber来自Lua 5.1 Reference Manual

  

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

     

可选参数指定用于解释数字的基数。基数可以是2到36之间(包括2和36)的任何整数。在10以上的基数中,字母“ A”(大写或小写)代表10,“ B”代表11,以此类推,“ Z”代表35。在基数10(默认值)中,数字可以具有小数部分以及可选的指数部分(请参见第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

此代码块使用十六进制数字字符串并将其转换为char。 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))