fil*_*nt͡ 6 java obfuscation deobfuscation
今天我遇到了一个混淆的类(在jar中很多混淆的类),我不知道如何进行这种混淆.
一个例子:
protected void a(ChannelHandlerContext ?, ByteBuf ?, ByteBuf ?)
throws Exception
{
int ? = ?.readableBytes();
if (? < this.c)
{
?.b(0);
?.writeBytes(?);
}
else
{
byte[] ? = new byte[?];
?.readBytes(?);
?.b(?.length);
this.b.setInput(?, 0, ?);
this.b.finish();
while (!this.b.finished())
{
int ? = this.b.deflate(this.a);
?.writeBytes(this.a, 0, ?);
}
this.b.reset();
}
}
}
Run Code Online (Sandbox Code Playgroud)
如上所示,所有参数变量都是雪人.怎么能撤消?它首先是如何完成的; JVM如何能够"处理"这些并执行代码而没有任何问题?
为了澄清,我不会使用此代码,它仅用于教育目的.我正在学校学习计算机科学课程,因为我们正在学习Java并讨论诸如解压缩之类的限制.我有兴趣了解更多,所以我决定研究更大的项目,特别是服务器.这段代码从Minecraft(一款游戏)的Spigot服务器中取出,这是一款应该是开源的Minecraft Bukkit服务器的分支.
use*_*948 10
首先,您应该注意,它是具有此unicode的参数,而不是方法.为什么这很重要?参数不需要指定名称,因为它们主要由数字引用索引.但是它可以指定,我假设大多数java运行时实际上不检查此名称,因为它不需要执行.相反,需要类名,方法名和字段名.
关于你提到的Spigot,Spigot确实是开源的.但是你最有可能反编译一个最初来自原始Mojang Minecraft服务器的类,它不是开源的,而且确实是混淆的.
编辑:如果你想调查这些类,我最近发现了一个名为Bytecode Viewer的工具,可以在https://github.com/Konloch/bytecode-viewer上找到. 这个工具有多个反编译器以及一些查看选项更像字节码的类文件版本.我找到的函数示例包含以下字节码数据:
<localVar:index=1 , name=? , desc=D, sig=null, start=L1, end=L2>
<localVar:index=3 , name=? , desc=D, sig=null, start=L1, end=L2>
<localVar:index=5 , name=? , desc=D, sig=null, start=L1, end=L2>
Run Code Online (Sandbox Code Playgroud)
实际上,可见,unicode名称设置相同,但无关紧要,因为最后索引(1,3,5)用于引用这些变量.
归档时间: |
|
查看次数: |
614 次 |
最近记录: |