我试图在反编译一些 Java .class文件之后对其进行反混淆,我遇到了一些代码,其中使用标签的方式不认为它们可以被使用.我不知道这是否是反编译器误解标签的错误,或者如果代码是以这种方式有意混淆的.换句话说,在Java字节码中可以使用这样的标签?

请注意,标签显示在相关的break语句之后,而不是之前.它几乎似乎被用作一个goto,而不是一个标签被用来走出一个循环.还有没有循环,所以我有点困惑,他们应该如何在这里使用.

这里发生了什么?我在评论中标记了3个标签(###)

if (i != 96)
  {
    if ((i ^ 0xFFFFFFFF) != -98)
    {
      if (i == 98)
        break label417;  // ### Here are the three breaks... The relevant labels appear later in the code
      if (i != 99)
        break label540;
      if (!bool)
        break label461;
    }
  }
  else
  {
    if (localwb == this.localWB5)
    {
      if (this.localWB4 != null) {
          this.localWB4.a((byte)-92,this);
        if (!bool);
      }
      else
      {
          this.localWB6.a((byte)-9,this);
      }
      return true;
    }
    if (localwb == this.localWB4)
    {
        this.localWB6.a((byte)-59,this);
      return true;
    }
    if (this.localWB3 != localwb)
      break label540;
      this.localWB2.a((byte)-38,this);
    return true;
  }
  if (this.localWB6 == localwb)
  {
    if (this.localWB4 != null) {
        this.localWB4.a((byte)-122,this);
      if (!bool);
    }
    else {
        this.localWB5.a((byte)-63,this);
    }
    return true;
  }
  if (this.localWB4 == localwb)
  {
    this.localWB5.a((byte)-22,this);
    return true;
  }
  if ((this.localWB2 == localwb) && (this.localWB3.M))
  {
    this.localWB3.a((byte)-84,this);
    return true;
    label417:  //  ### The first label.  Note how this next if-statement has inaccessible code... if the above if-statement is true,it would have already returned true;  However,the label appears after the return statement,almost as if the label is being used as a goto.
    if (localwb == this.localWB2)
    {
        this.localWB6.a((byte)-86,this);
      return true;
    }
    if (this.localWB3 == localwb)
    {
      this.localWB5.a((byte)-31,this);
      return true;
      label461:  //  ###  The second label
      if ((this.localWB6 == localwb) || (this.localWB4 == localwb))
      {
          this.localWB2.a((byte)-60,this);
        return true;
      }
      if (localwb == this.localWB5)
      {
        if (this.localWB3.M)
        {
          this.localWB3.a((byte)-44,this);
          if (!bool);
        }
        else {
            this.localWB2.a((byte)-9,this);
        }
        return true;
      }
    }
  }
  label540:  //  ###  The final label.

解决方法

goto bytecode instruction(是的,它实际上被称为“goto”)用于实现break和其他结构.

goto本身的规范仅将目标限制在与goto指令相同的方法中.

4.10. Verification of class Files中定义了许多其他约束,特别是Checking Code,其中描述了如何验证方法的实际字节码.

我怀疑你不能用goto对局部变量和操作数堆栈产生不一致的解释,例如要求目标指令与源指令兼容,但是我的实际规范是用Prolog写的,我会感激的如果有人得到了确保这一点的相关点.

Java break / label语句可以在字节码混淆中作为“goto”吗?的更多相关文章

  1. ios – Xamarin Ahead-of-Time(AOT)编译器与普通编译器

    我的理解是Xamarin的Ahead-of-Time编译器直接将Xamarin.iOS应用程序编译为本机ARM汇编代码.然而,我没有得到的是为什么它需要被称为“Ahead-of-Time”而不仅仅是一个普通的编译器.Xamarin的AOT编译器和传统编译器之间有什么区别,还是仅仅是一个营销术语?没有.Xamarin在该段中传达的信息是,他们的代码比简单的基于字节码的语言执行得更快.对于iOS和Android,他们都能够在热代码路径上执行本机代码以提高性能.AOT和JIT这两个术语是关于他们如何做到这一点的

  2. swift – 不能调用非函数类型’CIImage?’的值?

    用Xcode游乐场测试7.1.1.和Swift2.1这是因为,一旦进入UIImage,CIImage一词被视为UIImage的CIImage财产,由于隐含的自我作为消息收件人–换句话说,Swift将你的CIImage变成self.CIImage,从那里下降.您可以通过Swift使用模块命名空间来消除歧义:编辑在Swift3中,这个问题会消失,因为所有的属性将以小写字母开始.该属性将被命名为ciImage,并且不会与CIImage类混淆.

  3. 使用swift编译器裸机?

    我真的很想使用swift进行嵌入式编程,因为我觉得它更适合用于c,我正在使用的处理器是ARMCortex-M4F(http://www.ti.com/tool/ek-tm4c123gxl).看一下swift编译器page,它说你可以从swift源生成LLVMIR然后我希望与LLVM交叉编译.这可能吗?绝对可以使用Swift生成机器代码.实际上,默认情况下,当您在Xcode或swiftc命令行编译器

  4. 什么是我可以使用Kotlin的最早的Android API级别?

    我认为这个问题很清楚但是我能在Kotlin上定位的最早API级别是什么?解决方法实际上,任何API级别.这是因为Kotlin被编译为JVM6平台的字节码,所有AndroidAPI级别都支持该字节码.因此,除非您在Kotlin代码中使用任何较新的AndroidAPI,否则它不需要任何特定的API级别.

  5. android – 如何告诉Proguard混淆类名

    更新:我已经删除了上面的规则,并且没有从Android扩展任何东西的Utility类没有被混淆.我现在想知道是否有一些隐含的规则来保持类的类名被保存为类派生类的类?

  6. Kotlin与Android上的ART 100%兼容吗?

    ART是Android上的“新”Dalvik运行时版,自Android5.0起就取代了它.我非常热衷于Kotlin&在JVMv8上运行的JavaFX.我不确定Kotlin编译器生成或将在其达到v1.0发布状态时生成的字节码版本.所以问题是:ART现在能够运行“Kotlin代码”并且能够在未来运行Kotlin代码,例如什么时候Kotlin编译器要发出Java8字节码?解决方法与Android的兼容性是我们的首要任务,因此请确保Kotlin在发布时支持ART.目前Kotlin生成字节码版本1.6,因此它是兼容

  7. 详解Java中的字节码增强技术

    字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。本文将通过示例详细说说Java的字节码增强技术,需要的可以参考一下

  8. 使用Android studio查看Kotlin的字节码教程

    这篇文章主要介绍了使用Android studio查看Kotlin的字节码教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  9. Android使用插件实现代码混淆

    这篇文章主要介绍了Android如何使用插件实现代码混淆,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  10. 详解JVM基础之字节码的增强技术

    字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。接下来,我们将从最直接操纵字节码的实现方式开始深入进行剖析,感兴趣的可以了解一下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部