首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解读隐藏码

解读隐藏码
EN

Stack Overflow用户
提问于 2013-08-23 10:18:24
回答 3查看 1.1K关注 0票数 2

我试着看看这个文件里面有什么(用L写的)给我玩的游戏,这样我就可以学习和看到它是如何完成的。但是在开始的时候,它定义了一些函数,使得所有的东西都不可读--代码就在文件中。

而且,随着代码的继续,您可以使用###进行更多的“美化”编码。有人能告诉我如何使它再次可读性吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-23 21:39:11

您的文件包含[===[]===]之间的压缩代码块。压缩只是一个字典编码器,其中关键字映射到单个字节值。解压是通过prettify完成的(见Lorenzo的文章)。

通过prettify运行压缩代码将为您提供这段代码 (压缩比~46%),这恰好是另一个解压缩例程!实际上,它似乎是这段代码的最小化版本。

然后,该"ungzip“例程用于处理文件中包含的另一个~150 of字符串,该字符串扩展为675 of的文本。

信不信由你,该文本也通过与ungzip代码相同的方案进行压缩,并包含自己的prettify副本。通过它的prettify运行该文本,我们将得到最终的963 is的Lua,然后执行它。

这是最终、解压缩代码,发布到我发现的第一个允许963 to上传的站点。格式就像从prettify中得到的一样。

票数 5
EN

Stack Overflow用户

发布于 2013-08-23 22:14:27

我是用于创建该文件的实用工具压扁的作者。

斯奎什的一些过滤器是可逆的,有些不是。以下是尽可能容易地逆转的技巧:

在文件的顶部,粘贴以下代码片段:

代码语言:javascript
复制
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。

但是,您不会发现阅读起来特别容易,因为所有不必要的空白都将被删除,一些变量名将被简短的替代方案所取代。您可以查看午餐会来重新格式化代码,但是原始变量名是不可检索的。

此外,该文件包含多个模块合并为一个。你会看到这些看起来像:

代码语言:javascript
复制
package.preload['modulename']=(function(...)
    --code here--
end)

如果你愿意的话,你可以将这些文件分割成不同的文件,以帮助提高可读性。

希望这能有所帮助!

编辑:在您不信任的文件上使用此技术时要小心,因为在运行它时,它实际上会执行它们。如果你还不知道他们在做什么,那可不是个好主意!

票数 3
EN

Stack Overflow用户

发布于 2013-08-23 13:30:58

由于发布的代码不完整,而且可能是一团糟,所以我的猜测只是有根据的猜测。

似乎整个代码在变量ungz中存储了对“匿名函数”的调用的结果:(function ()片段可能是关闭的,如下所示:

代码语言:javascript
复制
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的定义及其辅助数据,为了更好地理解这些数据,可以对这些数据进行重新格式化:

代码语言:javascript
复制
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]===]并不会返回有意义的代码( 202base_char值会带来更好的结果,尽管并不完美)。此外,还必须合并该长字符串中的所有行,并将其替换为普通字符串,即将其转换为"yyyy",其中yyyyxxxx,删除了所有硬换行符。

可能所有的代码都是以某种方式进行预处理的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18400346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档