如何在Java中进行混淆?

时间:2015-06-22 20:58:27

标签: 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();
    }
  }

}

如上所述,所有参数变量都是雪人。怎么能撤消?它首先是如何完成的; JVM如何能够“处理”这些并执行代码而没有任何问题?

为了澄清,我不打算使用此代码,它仅用于教育目的。我正在学校学习计算机科学课程,因为我们正在学习Java并讨论诸如解压缩之类的限制。我有兴趣了解更多,所以我决定研究更大的项目,特别是服务器。这段代码被从 Spigot服务器中取出,用于Minecraft (一款游戏),它是一个应该是开源的 Bukkit服务器for Minecraft 的分支。

3 个答案:

答案 0 :(得分: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>

确实如此可见,unicode名称设置相同,但无关紧要,因为最后索引(1,3,5)用于引用这些变量。

答案 1 :(得分:1)

protected void a(ChannelHandlerContext ☃, ByteBuf ☃, ByteBuf ☃)

这不是有效的。您不能拥有同名的多个参数。可能是您没有使用正确的文本格式读取unicode文本。

答案 2 :(得分:0)

您的文本编辑器显示unicode字符的值。

我刚刚在eclipse上测试过,并且带有unicode字符的名字是可以接受的。

    public String publicationXmlUrl(int \u9090currentPage) {

但是用值来写不是:

   public String publicationXmlUrl(int ♥currentPage) {