是这样的。
有一次,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)
为什么修改个数字就会崩溃呢?
Sebenarnya boleh. . Perisian seperti javassist boleh melakukannya.
Atau editor heksadesimal lain juga tersedia.
Fail Notepad yang disertakan dengan Windows tidak berfungsi.
Petikan dari tingkat satu
记住不要用windows自带的记事本打开文本文件!
Ia berjalan seperti biasa selepas membuka editor dengan
ultraedit
.Perhatian
编辑的时候文字长度一定要和原来一样,否则会出现错误。
Dengan gambar
Ingat untuk tidak membuka fail teks dengan Notepad yang disertakan dengan Windows!
Ingat untuk tidak membuka fail teks dengan Notepad yang disertakan dengan Windows!
Ingat untuk tidak membuka fail teks dengan Notepad yang disertakan dengan Windows!
Jangan tukar nombor sesuka hati, ada kemungkinan anda menukar nombor ajaib.
Fail ini sudah lapuk.
Lihat dokumentasi ClassFormatError https://docs.oracle.com/javase/7/docs/api/java/lang/ClassFormatError.html
diterjemahkan bermaksud
Nama ralat "ClassFormatError", seperti namanya, adalah ralat pemformatan fail kelas Berdasarkan kandungan di atas, dianggarkan bahawa ia adalah ralat yang berlaku apabila mesin maya membaca fail kelas dan perlu. ditafsir dan diformatkan. Proses khusus tidak diketahui.
Fail kelas ialah fail bytecode yang dijana oleh javac selepas analisis leksikal, analisis sintaks dan analisis semantik fail sumber java. Pengubahsuaian langsung akan memusnahkan struktur fail Secara amnya, jangan ubah suai fail kelas yang dijana secara santai.
Walaupun saya telah menjawabnya, saya masih ingin mengatakan bahawa yang datang dengan tingkap mempunyai beberapa gimik, yang menjengkelkan
Gunakan notepad untuk mengubah suai ini dengan mod pengeditan hex Semua pemalar dalam exe/dll semuanya disimpan secara berpusat Banyak penipuan permainan digunakan untuk mengubah suai secara langsung jumlah wang permainan dan segera memasuki mod kebal.
Penyoal boleh belajar tentang struktur fail kelas Ia boleh diubah suai dengan editor yang sesuai
Format yang disimpan selepas pengubahsuaian vim adalah berbeza daripada format fail .class sebelumnya. Lagipun, ia adalah fail bytecode.
Atribut fail telah berubah apabila anda menyimpannya