这里我有一个loadstring,但攻击者可以钩住它,像咆哮一样窃取它的内容。我想做一个防钩,这样就可以防止它了。
-- Save copies of orignal functions
local o_load = _G["load"]
local o_loadstring = _G["loadstring"]
local o_unpack = _G["unpack"]
local o_pairs = _G["pairs"]
local o_writefile = _G["writefile"]
local o_print = _G["print"]
local o_tostring = _G["tostring"]
-- Dynamic function names
local load_name = tostring(_G["load"])
local loadstring_name = tostring(_G["loadstring"])
local tostring_name = tostring(_G["tostring"])
-- For multiple instances of loadstring or load being used
local files_loadstring = 1
local files_load = 1
-- Hide function names
_G["tostring"] = function(...)
local args = {...}
local arg = o_unpack(args)
if arg == _G["tostring"] then
return tostring_name
end
if arg == _G["loadstring"] then
return loadstring_name
end
if arg == _G["load"] then
return load_name
end
local ret = { o_tostring(o_unpack(args)) }
local value = o_unpack(ret)
return value
end
-- Hook loadstring
_G["loadstring"] = function(...)
local args = {...}
o_print("loadstring called")
local str = ""
for k, v in o_pairs(args) do
str = str .. o_tostring(v) .. " "
end
o_writefile("hook_loadstring"..o_tostring(files_loadstring)..".lua", str)
o_print("file written to hook_loadstring"..o_tostring(files_loadstring)..".lua")
files_loadstring = files_loadstring +1
local ret = { o_loadstring(o_unpack(args)) }
str = ""
for k, v in o_pairs(ret) do
str = str .. o_tostring(v) .. " "
end
return o_unpack(ret)
end
-- Hook load
_G["load"] = function(...)
local args = {...}
o_print("load called")
local str = ""
for k, v in o_pairs(args) do
str = str .. o_tostring(v) .. " "
end
o_writefile("hook_load"..o_tostring(files_load)..".lua", str)
o_print("file written to hook_load"..o_tostring(files_load)..".lua")
files_load = files_load +1
local ret = { o_load(o_unpack(args)) }
str = ""
for k, v in o_pairs(ret) do
str = str .. o_tostring(v) .. " "
end
return o_unpack(ret)
end
-- bellow is the loadstring function with a lua and all it's content is getting hooked and writen in a file
loadstring("local a = 1;")()`
我尝试使用tostring(loadstring)
来比较函数名称,以检查它是真的还是假的,但攻击者也可以钩tostring
并给出原始函数名称,所以我的反钩子根本不起作用。我也不能做writefile = nil
或print = nil
,所以攻击者不能打印或写入文件,因为他在文件上保存了这些函数的副本,所以他的代码将始终工作。我怎样才能防止我的loadstring
像这样上瘾呢?请帮助。
我只是希望我的loadstring
里面的内容不被窃取。
loadstring
被钩住意味着攻击者的代码运行在您的代码之前,并且在相同的环境中。这意味着全局环境的所有函数都可以从loadstring
挂接到tostring
,包括debug
库。因此,您唯一可以依赖的东西(甚至这也是不确定的,取决于哪个软件解释您的Lua)是"硬连接"的。(例如语法)Lua语言特性。您可以查看Lua的完整语法。注意,这些都是基本的构念,根本帮不上忙;Lua中所有高级的东西都使用函数调用和全局环境,它们可能会被钩住。
无论加载这些脚本的是什么,都需要打补丁以:(1)在一个单独的、干净的环境中加载所有内容(2)保护全局环境或至少几个选定的函数,但即使这样,"加载器"也会被加载。可以修改以删除这些"保护"。
总之,你不能可靠地阻止或检测loadstring
被钩住. 如果你向某人提供代码让他们运行,那么代码不可避免地要在某个时候运行,而在那个时候,他们将能够"窃取"。它。"best"你能做的就是混淆你的代码,这样窃取代码就没有什么好处了。
底线:只要你的软件运行在"本地"(在他们的机器上)而不是"作为一种服务"。(在你的机器上),他们总是能够窃取和分析你的代码;你所能做的就是让它变得更难,例如通过混淆或检查(但是可以绕过)。