是这样的。
有一次,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)
为什么修改个数字就会崩溃呢?
事實上是可以的。 。 javassist這類的軟體可以做到。
或其他16進位編輯器也是可以的。
windows自帶的記事本文件是不行了.
引用一樓
記住不要用windows自帶的記事本打開文本文件!
记住不要用windows自带的记事本打开文本文件!
用
ultraedit
打开编辑之后正常运行。注意
用编辑的时候文字长度一定要和原来一样,否则会出现错误。
ultraedit
開啟編輯之後正常運作。注意
編輯的時候文字長度一定要跟原來一樣,否則會出錯。
附圖#🎜##🎜🎜##🎜🎜##🎜#
記得不要用windows自備的記事本開啟文字檔!
記得不要用windows自備的記事本開啟文字檔!
記得不要用windows自備的記事本開啟文字檔!
不要隨意改數字,有可能你改的是魔術數字。
此文件已廢。
查看ClassFormatError文件 https://docs.oracle.com/javase/7/docs/api/java/lang/ClassFormatError.html
翻譯過來的意思是
錯誤名稱‘ClassFormatError’,顧名思義是class檔案格式化錯誤,並根據上述內容猜測應該是虛擬機器讀取class檔案時需要interpreted(解釋)和格式化時產生的錯誤。具體流程不得而知。
class檔案是javac在對java原始檔經過詞法分析、語法分析、語意分析產生的字節碼檔。直接修改會破壞檔案的結構,一般不要隨便修改產生的class檔案。
雖然已經回答過了 我還是想說一下 windows 自帶 的 會有bom頭,討厭啊
用notepad++ 修改 這個有hex編輯模式 exe/dll中的常數都是集中存儲的,原來的很多遊戲作弊器就是直接修改遊戲的金錢數, 立馬進入無敵模式
題主 可以去了解下class檔案結構,合適的編輯器是可以修改的,前提是要了解所改位置具體值的範圍和意義
vim修改後儲存的格式與之前的.class檔案格式不一樣吧,畢竟是字節碼檔案。
你儲存的時候檔案屬性已經改變了