【问题标题】:Is it possible to prevent a string from being printed in lua是否可以防止在lua中打印字符串
【发布时间】:2021-09-28 03:27:52
【问题描述】:

所以我正在开发一个 lua 混淆器,它进展顺利,但我注意到,如果你到脚本的末尾并更改 loadstring 以打印你得到整个脚本,我将如何解决这个问题?

这是一个经过混淆处理的 Hello World 项目:

--Protected by blueSecure(1.2)

getgenv().ProtectedByBlueSecure = true
local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' function dec(data) data = string.gsub(data, '[^'..b..'=]', '') return (data:gsub('.', function(x) if (x == '=') then return '' end local r,f='',(b:find(x)-1) for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)>0 and '1' or '0') end return r; end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x) if (#x ~= 8) then return '' end local c=0 for i=1,8 do c=c+(x:sub(i,i)=='1' and 2^(8-i) or 0) end return string.char(c) end))end
return(function(...)
(({...})[1])[1]=(({...})[2])()[dec('Z2FtZQ=="')]; 

(({...})[1])[1]=dec('aWY=');
(({...})[1])[tonumber(dec('Mg=='))]=(({...})[1])[tonumber(dec('MQ=='))] .. dec('IA==');
(({...})[1])[tonumber(dec('Mw=='))]=(({...})[1])[tonumber(dec('Mg=='))] .. dec('Z2V0Z2Vudg==');
(({...})[1])[tonumber(dec('NA=='))]=(({...})[1])[tonumber(dec('Mw=='))] .. dec('KCku');
(({...})[1])[tonumber(dec('NQ=='))]=(({...})[1])[tonumber(dec('NA=='))] .. dec('UHJvdGVjdGVkQnlCbHVlU2VjdXJl');
(({...})[1])[tonumber(dec('Ng=='))]=(({...})[1])[tonumber(dec('NQ=='))] .. dec('IA==');
(({...})[1])[tonumber(dec('Nw=='))]=(({...})[1])[tonumber(dec('Ng=='))] .. dec('dGhlbg==');
(({...})[1])[tonumber(dec('OA=='))]=(({...})[1])[tonumber(dec('Nw=='))] .. dec('IA==');
(({...})[1])[tonumber(dec('OQ=='))]=(({...})[1])[tonumber(dec('OA=='))] .. dec('cHJpbnQ=');
(({...})[1])[tonumber(dec('MTA='))]=(({...})[1])[tonumber(dec('OQ=='))] .. dec('KCI=');
(({...})[1])[tonumber(dec('MTE='))]=(({...})[1])[tonumber(dec('MTA='))] .. dec('SGVsbG8=');
(({...})[1])[tonumber(dec('MTI='))]=(({...})[1])[tonumber(dec('MTE='))] .. dec('IA==');
(({...})[1])[tonumber(dec('MTM='))]=(({...})[1])[tonumber(dec('MTI='))] .. dec('V29ybGQ=');
(({...})[1])[tonumber(dec('MTQ='))]=(({...})[1])[tonumber(dec('MTM='))] .. dec('ISIpIA==');
(({...})[1])[tonumber(dec('MTU='))]=(({...})[1])[tonumber(dec('MTQ='))] .. dec('ZWxzZQ==');
(({...})[1])[tonumber(dec('MTY='))]=(({...})[1])[tonumber(dec('MTU='))] .. dec('CiAgICA=');
(({...})[1])[tonumber(dec('MTc='))]=(({...})[1])[tonumber(dec('MTY='))] .. dec('Z2FtZQ==');
(({...})[1])[tonumber(dec('MTg='))]=(({...})[1])[tonumber(dec('MTc='))] .. dec('Og==');
(({...})[1])[tonumber(dec('MTk='))]=(({...})[1])[tonumber(dec('MTg='))] .. dec('R2V0U2VydmljZQ==');
(({...})[1])[tonumber(dec('MjA='))]=(({...})[1])[tonumber(dec('MTk='))] .. dec('KCI=');
(({...})[1])[tonumber(dec('MjE='))]=(({...})[1])[tonumber(dec('MjA='))] .. dec('UGxheWVycw==');
(({...})[1])[tonumber(dec('MjI='))]=(({...})[1])[tonumber(dec('MjE='))] .. dec('Iiku');
(({...})[1])[tonumber(dec('MjM='))]=(({...})[1])[tonumber(dec('MjI='))] .. dec('TG9jYWxQbGF5ZXI=');
(({...})[1])[tonumber(dec('MjQ='))]=(({...})[1])[tonumber(dec('MjM='))] .. dec('Og==');
(({...})[1])[tonumber(dec('MjU='))]=(({...})[1])[tonumber(dec('MjQ='))] .. dec('S2ljaw==');
(({...})[1])[tonumber(dec('MjY='))]=(({...})[1])[tonumber(dec('MjU='))] .. dec('KCI=');
(({...})[1])[tonumber(dec('Mjc='))]=(({...})[1])[tonumber(dec('MjY='))] .. dec('U3RvcA==');
(({...})[1])[tonumber(dec('Mjg='))]=(({...})[1])[tonumber(dec('Mjc='))] .. dec('IA==');
(({...})[1])[tonumber(dec('Mjk='))]=(({...})[1])[tonumber(dec('Mjg='))] .. dec('cmVtb3Zpbmc=');
(({...})[1])[tonumber(dec('MzA='))]=(({...})[1])[tonumber(dec('Mjk='))] .. dec('IA==');
(({...})[1])[tonumber(dec('MzE='))]=(({...})[1])[tonumber(dec('MzA='))] .. dec('Y3JlZGl0cw==');
(({...})[1])[tonumber(dec('MzI='))]=(({...})[1])[tonumber(dec('MzE='))] .. dec('IA==');
(({...})[1])[tonumber(dec('MzM='))]=(({...})[1])[tonumber(dec('MzI='))] .. dec('eW91');
(({...})[1])[tonumber(dec('MzQ='))]=(({...})[1])[tonumber(dec('MzM='))] .. dec('IA==');
(({...})[1])[tonumber(dec('MzU='))]=(({...})[1])[tonumber(dec('MzQ='))] .. dec('dGhpZWY=');
(({...})[1])[tonumber(dec('MzY='))]=(({...})[1])[tonumber(dec('MzU='))] .. dec('LCA=');
(({...})[1])[tonumber(dec('Mzc='))]=(({...})[1])[tonumber(dec('MzY='))] .. dec('Ymx1ZVNlY3VyZQ==');
(({...})[1])[tonumber(dec('Mzg='))]=(({...})[1])[tonumber(dec('Mzc='))] .. dec('IikKIA==');
(({...})[1])[tonumber(dec('Mzk='))]=(({...})[1])[tonumber(dec('Mzg='))] .. dec('ZW5k');loadstring((({...})[1])[tonumber(dec('Mzk='))])()end)({},getfenv,table.remove)

请不要指出我使用的是 Base64,一旦我一切正常,就会改变这一点

谢谢

【问题讨论】:

    标签: lua obfuscation


    【解决方案1】:

    是和不是。是的,因为您可以在代码开头删除所有打印功能(例如printio.writeerror)。但是你永远无法使用这些功能。

    不,因为试图阅读您的代码的人可以删除删除函数的代码,然后使用它们。无论您添加什么代码来阻止打印,他们都可以删除它,然后打印。

    您可能会发现将您的程序编译为 Lua 字节码,然后混淆字节码并加载字节码很有用。字节码比源代码更难阅读。您还可以尝试将代码中的所有函数和变量重命名为随机字符串。我没有费心对您的代码进行解码以查看它是否具有随机函数和变量名称,但由于您试图以这种方式对其进行混淆,我猜测您没有。

    顺便说一句,让代码看起来很混乱并不会增加任何东西。 真的很容易function(...) 更改为function(t, getfenv, table_remove),然后将({...})[1] 替换为t。在这种情况下,您不妨从简单的开始编写它,因为这根本不会减慢攻击者的速度。

    【讨论】:

    • 我想评论一下,仅仅为了隐藏你可以使用元表的力量。为此,我想到了__index。有了这种能力,您可以设计一个在检查时表现完全奇怪的表格。例如方法__tostring不仅可以返回一个字符串,它还可以在之前执行os.exit()__metatable 方法是关于元表本身的“假新闻”的好地方。顺便说一句,我必须为哪个 Lua 版本编译:loadstring()
    • @koyaanisqatsi loadstring 在 Lua 5.2 中已弃用。它的功能被合并到load
    • @koyaanisqatsi 没关系。攻击者可以删除你所有花哨的元表代码。
    • if 攻击者删除关联的元表then 存储在__index 中的所有函数/表/任何内容也被销毁(在下一个垃圾收集器周期)
    • @koyaanisqatsi 他们不会删除元表。他们将删除代码。请记住,他们可以看到您所有的混淆代码并对其进行更改。如果您有一段代码无法打印某些字符串,他们可以删除该部分,然后运行其余部分
    猜你喜欢
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 2015-07-22
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    相关资源
    最近更新 更多