我试着看看这个文件里面有什么(用L写的)给我玩的游戏,这样我就可以学习和看到它是如何完成的。但是在开始的时候,它定义了一些函数,使得所有的东西都不可读--代码就在文件中。
而且,随着代码的继续,您可以使用###进行更多的“美化”编码。有人能告诉我如何使它再次可读性吗?
发布于 2013-08-23 21:39:11
您的文件包含[===[和]===]之间的压缩代码块。压缩只是一个字典编码器,其中关键字映射到单个字节值。解压是通过prettify完成的(见Lorenzo的文章)。
通过prettify运行压缩代码将为您提供这段代码 (压缩比~46%),这恰好是另一个解压缩例程!实际上,它似乎是这段代码的最小化版本。
然后,该"ungzip“例程用于处理文件中包含的另一个~150 of字符串,该字符串扩展为675 of的文本。
信不信由你,该文本也通过与ungzip代码相同的方案进行压缩,并包含自己的prettify副本。通过它的prettify运行该文本,我们将得到最终的963 is的Lua,然后执行它。
这是最终、解压缩代码,发布到我发现的第一个允许963 to上传的站点。格式就像从prettify中得到的一样。
发布于 2013-08-23 22:14:27
我是用于创建该文件的实用工具压扁的作者。
斯奎什的一些过滤器是可逆的,有些不是。以下是尽可能容易地逆转的技巧:
在文件的顶部,粘贴以下代码片段:
local _ls = loadstring;
function loadstring(...)
local f = assert(io.open("unsquished.lua", "w+"));
f:write((...));
f:close();
return _ls(...)
end然后用Lua运行文件。它将在当前目录中生成一个新文件unsquished.lua。这个文件现在是100%纯Lua。
但是,您不会发现阅读起来特别容易,因为所有不必要的空白都将被删除,一些变量名将被简短的替代方案所取代。您可以查看午餐会来重新格式化代码,但是原始变量名是不可检索的。
此外,该文件包含多个模块合并为一个。你会看到这些看起来像:
package.preload['modulename']=(function(...)
--code here--
end)如果你愿意的话,你可以将这些文件分割成不同的文件,以帮助提高可读性。
希望这能有所帮助!
编辑:在您不信任的文件上使用此技术时要小心,因为在运行它时,它实际上会执行它们。如果你还不知道他们在做什么,那可不是个好主意!
发布于 2013-08-23 13:30:58
由于发布的代码不完整,而且可能是一团糟,所以我的猜测只是有根据的猜测。
似乎整个代码在变量ungz中存储了对“匿名函数”的调用的结果:(function ()片段可能是关闭的,如下所示:
ungz = (function() -- "anonymous function"
-- ...
-- definition of `prettify` + helper data
-- ...
return assert( loadstring(
prettify [===[
...obfuscated code in this long string...
]===]
) ) -- end of `loadstring` and of `assert` calls
end)() --<<-- note the () to call the "anonymous function"在这个函数中,您可能会看到函数prettify的定义及其辅助数据,为了更好地理解这些数据,可以对这些数据进行重新格式化:
local base_char,keywords=128, {
"and","break","do","else","elseif","end","false","for",
"function","if","in","local","nil","not","or","repeat","return",
"then","true","until","while","read","nbits","nbits_left_in_byte",
"wnd_pos","output","val","input",};
function prettify(code)
return code:gsub(
"["..string.char(base_char).."-"..string.char(base_char+#keywords).."]",
function (c)
return keywords[c:byte()-base_char];
end
)
end当应用于字符串时,函数prettify将返回相同的字符串,在该字符串中,在base_char-base_char+#keywords范围内有数字代码的任何字符都将替换为keyword列表的一个关键字。
这用于使用assert(loadstring(prettify[===[xxxx]===]))“解模糊”“混淆”代码,其中我将模糊代码指定为xxxx。
增编:注意到,将prettify应用于片段[===[xxxx]===]并不会返回有意义的代码( 202的base_char值会带来更好的结果,尽管并不完美)。此外,还必须合并该长字符串中的所有行,并将其替换为普通字符串,即将其转换为"yyyy",其中yyyy是xxxx,删除了所有硬换行符。
可能所有的代码都是以某种方式进行预处理的。
https://stackoverflow.com/questions/18400346
复制相似问题