最近我研究了JVM。我知道ClassLoader
何时加载Class
java.lang.Object
,
ClassLoader
将委托给引导程序ClassLoader
。如果我更改rt.jar中的java.lang.Object
文件怎么办? JVM是否有办法确保Java核心库是安全的?
答案 0 :(得分:2)
JVM是否有办法确保Java核心库是安全的?
如果你打算“安全”来表示“没有受到干扰”,那么认为答案是否定的。
此外,它将是徒劳的 * 。如果某人有足够的权限干扰(即更改)“rt.jar”文件,他们可能也干扰java
可执行文件,以便击败它可能执行的任何检查检测到“rt.jar”文件已被更改。如果用户(或黑客)有效控制机器,则所有投注均已关闭。
* - 更糟糕的是。通过使用公共/私人对的私钥进行签名来实现防篡改。如果Oracle为“rt.jar”做了这个,那么除了Oracle之外没有人能够构建一个正确签名的“rt.jar”文件。那会破坏Java开源的目的,而且确实让很多人烦恼!!
(相比之下,当JAR文件下载并在Web浏览器中运行或使用web-start时,JVM /类加载器会在让它们运行之前检查它们是否已正确签名。但是,您正在检查第三方的干扰 - party ... etcetera ...不受具有本地管理员权限的人的干扰。)
还有另一种“安全”的含义;即库不包含将导致运行时类型安全性被违反的Java字节码。那个案子的答案是肯定的。
JVM验证加载的字节码,以检查是否会违反运行时类型安全性,并可能导致JVM崩溃。如果代码不正确,则抛出VerifyError
异常,类加载操作失败。
参考:
答案 1 :(得分:1)
当JVM加载类时,它将执行以下步骤: 1.从jar文件或类路径加载类文件(depand在类加载器上),java.lang.Object在rt.jar中,JVM将找到它并将其加载到JVM的方法区域。
在步骤1加载时验证类文件。类文件有自己的格式(在JVM版本上为depand),例如,私有的4个字节是0XCAFEBABE。当格式类文件不正确时,JVM将抛出错误。如果您修改的java.lang.Object的格式不正确。 JVM不会加载它。
JVM将为您分配内存。
希望能帮到你。抱歉我的英语不好。
答案 2 :(得分:0)
如果您更改了j ava.lang.Objec
t并且如果它没有ByteCode verification process
,那么它可能会抛出错误。另外明智的是jvm没有检查它是否安全