什么是ILLegal字节代码?

时间:2009-11-17 06:35:08

标签: java bytecode

在阅读Java Security时,我遇到了以下句子,但在互联网上无法获得任何令人满意的解释。任何人都可以解释

  • 禁止加载带字节码的类
  • 防止加载非法包裹

3 个答案:

答案 0 :(得分:3)

但是,我们不能确定课程本身是安全的。 SecurityManager的安全网仍然会阻止类访问网络和本地硬盘等受保护资源,但这本身是不够的。该类可能包含非法字节码,伪造指向受保护内存的指针,溢出或下溢程序堆栈,或者以某种其他方式破坏JVM的完整性。检查[1]中的主题类文件验证程序http://medialab.di.unipi.it/doc/JNetSec/jns_ch5.htm

答案 1 :(得分:2)

byte code verifier进行以下检查:

  • 分支必须在方法的代码数组的范围内。
  • 所有控制流指令的目标都是指令的开始。在宽指令的情况下,宽操作码被认为是指令的开始,并且给予由该宽指令修改的操作的操作码不被认为是开始指令。不允许分支到指令的中间。
  • 没有指令可以在索引大于或等于其方法指示的分配的局部变量数的情况下访问或修改局部变量。
  • 对常量池的所有引用必须是相应类型的条目。例如:指令ldc只能用于int或float类型的数据或类String的实例;指令getfield必须引用一个字段。
  • 代码不会在指令中间结束。
  • 执行不能脱离代码的末尾。
  • 对于每个异常处理程序,由处理程序保护的代码的起点和终点必须位于指令的开头,或者在结束点的情况下,紧接在代码的结尾。起点必须在结束点之前。 - 异常处理程序代码必须从有效指令开始,并且它可能不会从宽指令修改的操作码开始。

答案 2 :(得分:0)

源代码被编译为字节码,并分发给用户。如果字节码已经损坏,或者不是由java编译器制作的,那么它可能是非法的,这意味着字节没有意义。