2009-11-17 89 views
3

在阅读Java安全性时,我遇到了下面的句子,但无法在Internet上得到任何令人满意的解释。任何人都可以请解释什么是ILLegal字节码?

  • 类可以防止在加载字节码
  • 的防止装载非法包

回答

3

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

+0

该链接非常有用。 – Geek 2009-11-17 07:08:50

0

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

2

byte code verifier使下列检查:

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