spring - 为什么直接修改java的.class文件会导致程序崩溃
迷茫
迷茫 2017-04-17 17:40:30
0
9
874

是这样的。
有一次,hardcode了ip地址在代码里,由于懒得重新编译。
强行用记事本打开.class文件,发现里面已经面目全非了,但是数字还是原来的样子。
于是直接改了.class文件里的数字,换了个ip地址,结果运行时是直接崩溃的。
为什么呢?是有什么检查机制吗?

-------补充--------------

不好意思 描述不太准确啊
补充个例子
1)我先新建了一个.java

public class Test {
    public Test() {
    }

    public static void main(String[] args) {
        String ip = "172.18.81.111";
        System.out.println(ip);
    }
}

然后
javac Test.java

运行java Test

结果正常
输出 172.18.81.111

2)然后我用vim修改.class文件

Êþº¾^@^@^@4^@^]
^@^F^@^O^H^@^P  ^@^Q^@^R
^@^S^@^T^G^@^U^G^@^V^A^@^F<init>^A^@^C()V^A^@^DCode^A^@^OLineNumberTable^A^@^Dmain^A^@^V([Ljava/lang/String;)V^A^@
SourceFile^A^@  Test.java^L^@^G^@^H^A^@^M172.18.81.111^G^@^W^L^@^X^@^Y^G^@^Z^L^@^[^@^\^A^@^DTest^A^@^Pjava/lang/Object^A^@^Pjava/lang/System^A^@^Cout^A^@^ULjava/io/PrintStream;^A^@^Sjava/io/PrintStream^A^@^Gprintln^A^@^U(Ljava/lang/String;)V^@!^@^E^@^F^@^@^@^@^@^B^@^A^@^G^@^H^@^A^@      ^@^@^@^]^@^A^@^A^@^@^@^E*·^@^A±^@^@^@^A^@
^@^@^@^F^@^A^@^@^@^D^@  ^@^K^@^L^@^A^@  ^@^@^@+^@^B^@^B^@^@^@^K^R^BL²^@^C+¶^@^D±^@^@^@^A^@
^@^@^@^N^@^C^@^@^@^H^@^C^@
^@
^@^K^@^A^@^M^@^@^@^B^@^N
~
~

上面的.class文件中明显有一串数字,直接修改之。
然后再运行java Test

Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.ClassFormatError: Unknown constant tag 49 in class file Test
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)

为什么修改个数字就会崩溃呢?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回覆(9)
Ty80

事實上是可以的。 。 javassist這類的軟體可以做到。
或其他16進位編輯器也是可以的。
windows自帶的記事本文件是不行了.
引用一樓記住不要用windows自帶的記事本打開文本文件! 记住不要用windows自带的记事本打开文本文件!

ultraedit打开编辑之后正常运行。

注意

编辑的时候文字长度一定要和原来一样,否则会出现错误。

ultraedit開啟編輯之後正常運作。

注意


編輯的時候文字長度一定要跟原來一樣,否則會出錯。 附圖
#🎜##🎜🎜##🎜🎜##🎜#
Peter_Zhu

記得不要用windows自備的記事本開啟文字檔!
記得不要用windows自備的記事本開啟文字檔!
記得不要用windows自備的記事本開啟文字檔!
不要隨意改數字,有可能你改的是魔術數字。
此文件​​已廢。

巴扎黑

查看ClassFormatError文件 https://docs.oracle.com/javase/7/docs/api/java/lang/ClassFormatError.html

Thrown when the Java Virtual Machine attempts to read a class file and
determines that the file is malformed or otherwise cannot be
interpreted as a class file.

翻譯過來的意思是

當Java虛擬機器嘗試讀取class檔案時,發現檔案是畸形的或是無法作為class檔案解釋的,就會拋出ClassFormatError錯誤。

錯誤名稱‘ClassFormatError’,顧名思義是class檔案格式化錯誤,並根據上述內容猜測應該是虛擬機器讀取class檔案時需要interpreted(解釋)和格式化時產生的錯誤。具體流程不得而知。

PHPzhong

class檔案是javac在對java原始檔經過詞法分析、語法分析、語意分析產生的字節碼檔。直接修改會破壞檔案的結構,一般不要隨便修改產生的class檔案。

刘奇

雖然已經回答過了 我還是想說一下 windows 自帶 的 會有bom頭,討厭啊

Peter_Zhu

用notepad++ 修改 這個有hex編輯模式 exe/dll中的常數都是集中存儲的,原來的很多遊戲作弊器就是直接修改遊戲的金錢數, 立馬進入無敵模式

刘奇

題主 可以去了解下class檔案結構,合適的編輯器是可以修改的,前提是要了解所改位置具體值的範圍和意義

PHPzhong

vim修改後儲存的格式與之前的.class檔案格式不一樣吧,畢竟是字節碼檔案。

大家讲道理

你儲存的時候檔案屬性已經改變了

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板