签名的字节码加载
2016-11-2 4:56:45
收藏:0
阅读:127
评论:1
因此,我正在研究如何为 Lua 的“load”函数加载字节码进行安全处理。目前,我的代码如下:
local nativeload = load
load = function(chunk, chunkname, mode, ...)
if mode == nil then
mode = "bt"
elseif not (mode == "b" or mode == "t" or mode == "bt") then
error("无效模式")
end
local targetenv = [[snip]]
if select('#', ...) > 0 then targetenv = ... end
if mode == "t" then
return nativeload(chunk, chunkname, mode, targetenv)
elseif type(chunk) == "string" then
if chunk:sub(1,4) == "\27Lua" then
local code = chunk:sub(1,-33)
if HMAC_SHA256(code, getkey()) == chunk:sub(-32) then
return nativeload(code, chunkname, mode, targetenv)
else
error("无效签名")
end
else
return nativeload(chunk, chunkname, mode, targetenv)
end
elseif type(chunk) == "function" then
-- 我该怎么做?!
end
end
虽然处理文本模式和字符串块相当简单,但我不知道如何处理函数块。
我应该如何将所有内容收集到字符串中,然后进行 HMAC 处理并用此字符串调用“nativeload”?但是,这样做就不能加载大文件(例如 2GB 的文件),否则程序会崩溃(使用函数编译文件时,每次以 8KB 的增量编译文件,并且当文件大部分是空行时,这意味着在编译过程中只需要几 KB 的空间 - 而将整个文件加载到一个字符串中显然会使用 2GB 的 RAM)。
我该怎么做?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

local function extract_code(data) local code = data:sub(1,-33) assert(HMAC_SHA256(code, getkey()) == data:sub(-32), "Invalid signature") return code end local nativeload = load load = function(chunk, chunkname, mode, ...) local targetenv = [[snip]] if select('#', ...) ~= 0 then targetenv = ... end local new_chunk if type(chunk) == "string" then new_chunk = chunk:match"^\27Lua" and extract_code(chunk) or chunk elseif type(chunk) == "function" then local buffer = "" repeat local next_part = chunk() or "" buffer = buffer..next_part until next_part == "" or #buffer >= 4 if buffer:match"^\27Lua" then -- Bytecode can't be very large, collect it in a string local t = {buffer} while t[#t] ~= "" do t[#t+1] = chunk() or "" end new_chunk = extract_code(table.concat(t)) else -- Source code can be very large, use a function local function f() f = chunk return buffer end function new_chunk() return f() end end end return nativeload(new_chunk, chunkname, mode, targetenv) end这段代码实现了 Lua 脚本的加载和运行,支持对加密脚本的解密和验证签名。
其中
extract_code函数用于提取加密的脚本内容,并验证签名的有效性。如果签名无效则会触发错误。load函数是对loadin函数的扩展,在加载脚本前对其进行处理,如果是加密的脚本则先进行解密,否则直接加载。同时支持加载字节码和源代码,如果是字节码则会将其转化为字符串进行解密,如果是源代码则会用一个函数来加载。这段代码的作用是保护 Lua 脚本的安全性,防止源码泄漏以及篡改。