首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LuaJ Lua字节码混淆

LuaJ Lua字节码混淆
EN

Stack Overflow用户
提问于 2014-06-01 10:36:55
回答 1查看 759关注 0票数 2

我在解析使用luaJ生成的lua字节码时遇到了问题。在指令计数常量计数之间,有些地方出错了。好像少了一个字节。我使用的是LuaJ 2.0.3。

这是一个显示我的意思的六合点:

字节码是使用

代码语言:javascript
复制
string.dump(function() return "athin" end)

常量计数显示250个常量,但应该只有一个。如果在常量计数和指令列表之间多出一个字节,它将完美地工作:

常量计数为1,第一个常量4(字符串)的类型,字符串的长度为6,结尾处为null。

为什么不起作用?为什么缺少一个字节?我该怎么做才能解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2014-06-07 12:23:08

备注:我首先在CC论坛这里上发布了这篇文章。

实际上,您丢失了一个0x00字节。作为“指令”,您有00 00 00 01 01 00 00 1E 00 00 1E 00

看看Lua5.1VM指令的不夸张介绍,这意味着:

代码语言:javascript
复制
LOADK 0 0 -- Load constant at index 0 into register number 0.
RETURN 0 2 -- Return 1 value, starting at register number 0.
MOVE 120 0 -- Copy the value of register number 120 into register number 0.

最后一个没有任何意义。为什么字节码生成器会插入如此荒谬的指令,永远不会被执行?

如果在最后一条指令中添加一个0x00字节,它将读取as,00 00 00 01 01 00 00 1E 00 00 00 1E

这意味着:

代码语言:javascript
复制
LOADK 0 0 -- Load constant at index 0 into register number 0.
RETURN 0 2 -- Return 1 value, starting at register number 0.
RETURN 0 0 -- Return all values from register number 0 to the top of the stack.

如果您阅读PDF,您会发现字节码生成器总是在字节码的末尾添加一个返回语句,即使Lua源中已经有一个显式的返回语句。因此,这种拆卸是有意义的。

不管怎么说,如果你在那里多加了一个0x00字节,它就会把其余的字节移到上面,所以就像你说的那样,这是有意义的。只是缺失的0x00字节不在“指令”和“常量数”之间,而是指令的一部分。

现在,我不知道这对您有什么用处,因为输出直接来自CC (或LuaJ),但这就是问题所在。

备注:在修改ChunkSpy以接受大端块之后,当您发布字节码时,它在字节码上出错了,但是如果按您建议的方式修改或者我建议的话,它可以很好地处理字节码。

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

https://stackoverflow.com/questions/23978982

复制
相关文章

相似问题

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