鉴定文件是否为java class文件,是否是可执行文件
2005-09-03 16:41
357 查看
1、是否是Java程序?
是。十六进制文本编辑器打开,前四个字节为0xCAFEBABE[/b],这是Java文件的标志2、是否可执行?
不可执行。[/b]测试环境:
[/b] Sun j2sdk1.4.2_08
执行[/b]:java CheckFileB
执行结果如下:出现异常ClassFormatError
[/b]分析原因:
[/b]1、 类加载时class文件格式不正确等原因导致类不可加载2、 程序执行过程中自身抛出此异常,故意抛出异常,或调用别的类时出现异常。
如果为原因1,此程序尚未执行,没有进一步危害。如果为原因2,程序可能已经执行,可能会有其它危害。
进一步分析
[/b] 修改j2sdk1.4.2_08中的ClassLoader部分源码,对类装载过程进行跟踪,修改如下: [align=center]
protected final Class defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain) throws ClassFormatError { System.out.println(""); System.out.println("================== Define Class " + name + " ===================="); Class c = null; check(); if ( (name != null) && name.startsWith("java.")) { System.out.println("### Exception : Class name is start with java"); throw new SecurityException("Prohibited package name: " + name.substring(0, name.lastIndexOf('.'))); } if (protectionDomain == null) { protectionDomain = getDefaultDomain(); } if (name != null) { checkCerts(name, protectionDomain.getCodeSource()); } try { if (!checkName(name, false)) { System.out.println("### Error : No Class Def Found, Illegal name " + name); throw new NoClassDefFoundError("Illegal name: " + name); } c = defineClass0(name, b, off, len, protectionDomain); System.out.println("### Get class define!! "); } catch (ClassFormatError cfe) { // Class format error - try to transform the bytecode and // define the class again // System.out.println("### Catch ClassFormatError, Try other transformers"); Object[] transformers = ClassFileTransformer.getTransformers(); if (transformers == null || transformers.length == 0) System.out.println("### No other transformers!"); for (int i = 0; transformers != null && i < transformers.length; i++) { try { // Transform byte code using transformer byte[] tb = ( (ClassFileTransformer) transformers[i]).transform(b, off, len); c = defineClass0(name, tb, 0, tb.length, protectionDomain); break; } catch (ClassFormatError cfe2) { // If ClassFormatError occurs, try next transformer System.out.println("### Total " + transformers.length + " Transformers, the " + i + " failed to transform."); if (i == transformers.length) System.out.println( "### After all transformer , still cannot get this Class"); } } // Rethrow original ClassFormatError if unable to transform // bytecode to well-formed // if (c == null) { System.out.println("### Error : Class Format Error! ###"); throw cfe; } else System.out.println("### Get Class :" + c.getName() + " " + c.toString()); } if (protectionDomain.getCodeSource() != null) { java.security.cert.Certificate certs[] = protectionDomain.getCodeSource().getCertificates(); if (certs != null) setSigners(c, certs); } System.out.println("### return from defineClass() value: " + c.toString()); return c; } |
protected final Class findSystemClass(String name) throws ClassNotFoundException { System.out.println(""); System.out.println("================== Find System Class " + name + " ===================="); check(); ClassLoader system = getSystemClassLoader(); if (system == null) { if (!checkName(name, true)){ System.out.println("### Exception : Class Not Found!"); throw new ClassNotFoundException(name); } System.out.println("### find bootstrap class ..."); return findBootstrapClass(name); } System.out.println("### load class ..."); return system.loadClass(name); } |
protected final void resolveClass(Class c) { System.out.println("==> ==> resolveClass() begin"); check(); resolveClass0(c); System.out.println("==> ==> resolveClass() end"); } |
protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { // First, check if the class has already been loaded System.out.println(""); System.out.println("================== Load Class " + name + " ===================="); Class c = findLoadedClass(name); if (c == null) { try { if (parent != null) { c = parent.loadClass(name, false); } else { c = findBootstrapClass0(name); } } catch (ClassNotFoundException e) { System.out.println("### Catch Exception : Class Not Found Exception"); // If still not found, then invoke findClass in order // to find the class. c = findClass(name); } } if (resolve) { System.out.println("### Resolve Class"); resolveClass(c); } if(c == null) System.out.println("### Load null class, Return NULL!!!"); else System.out.println("### Loaded class, Return from LoadClass()"); return c; } |
测试
1、查看机器jdk中%JAVA_HOME%/lib/rt.jar是否被修改过。相关文章推荐
- Java 实例 - 如何执行指定class文件目录(classpath)
- 执行 java class 文件引入jar包
- 使用cmd编译java文件成功生成class,但是不能执行
- 使用JSP/JAVA 调用java.exe执行某个路径下面的class文件,并显示出结果
- Class文件,java程序执行过程,classloader原理
- 使用命令行执行java文件、项目(class、jar)
- 用jar命令将java class文件打包以及编写方便执行jar文件的批处理文件
- "java文件-class文件-JVM显示" 编码执行过程
- cmd编译执行java文件出现java.lang.ClassNotFound Exception:com.microsoft.sqlserver.jdbc.SQLServerDriver
- Eclipse下好使,但是cmd下执行java运行class文件提示Exception in thread "main" java.lang.NoClassDefFoundError问题
- 若想在当前路径下去运行非当前路径下的.class文件(即java可执行文件),该如何操作?
- java能够进行编译但无法执行.class文件,会提醒无法加载主类
- Eclipse下好使,但是cmd下执行java运行class文件提示Exception in thread "main" java.lang.NoClassDefFoundError问题
- java命令执行class文件的原理
- cmd 执行java Class 文件
- 安装JDK后要配置环境变量,主要有三个: 1 JAVA_HOME ->为JDK的安装目录,如:F:\JAVA\jdk1.6.0_04 2 CLASSPATH ->到哪里找需要执行的.class文件,如
- Eclipse下好使,但是cmd下执行java运行class文件提示Exception in thread "main" java.lang.NoClassDefFoundError问题
- DOS命令 SHELL命令 BAT命令 执行 java 的 class文件和Jar文件
- jar包里查找指定的class文件,排查是否存在或重复,工具软件:Java Class Finder