⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 badclassfileconstants.java

📁 kaffe Java 解释器语言,源码,Java的子集系统,开放源代码
💻 JAVA
字号:
import java.io.IOException;import org.apache.bcel.classfile.Constant;import org.apache.bcel.classfile.JavaClass;import org.apache.bcel.classfile.ConstantCP;import org.apache.bcel.classfile.ClassParser;import org.apache.bcel.classfile.ConstantPool;import org.apache.bcel.classfile.ConstantUtf8;import org.apache.bcel.classfile.ConstantClass;import org.apache.bcel.classfile.ConstantString;import org.apache.bcel.classfile.ConstantNameAndType;class BadClassFileConstants{    private static final String CLASS_FILE = "BadClassFileConstants.class";        private static final String DAMAGED_CLASS = "DamagedClass";    private static final String DAMAGED_CLASS_FILE = DAMAGED_CLASS + ".class";    private static final boolean VERBOSE = true;    private static final int ACCEPT_COUNTS[] = {	668, /* Jikes */	684, /* KJC */    };        private static int damage = 0;    private static int errors = 0;        private static void tryClass(JavaClass jc)	throws IOException, ClassNotFoundException    {	final ClassLoader cl = ClassLoader.getSystemClassLoader();		jc.dump(DAMAGED_CLASS_FILE);	try	{	    cl.loadClass(DAMAGED_CLASS);	    throw new Error("Able to load damaged class?");	}	catch(ClassFormatError e)	{	    errors += 1;	    if( VERBOSE )	    {		System.out.println(e);	    }	}    }    private static int findOppositeType(Constant constants[], byte type)    {	int lpc;	for( lpc = 0; lpc < constants.length; lpc++ )	{	    if( (constants[lpc] != null) && (constants[lpc].getTag() != type) )		return lpc;	}	return -1;    }        public static void main(String args[])	throws Throwable    {	boolean success = false;	ClassParser classParser;	Constant constants[];	int lpc, old_index;	ConstantPool cp;	JavaClass jc;		classParser = new ClassParser(CLASS_FILE);	jc = classParser.parse();	{		ConstantClass cc;				jc.setClassName(DAMAGED_CLASS);		cc = ((ConstantClass)jc.getConstantPool().		      getConstant(jc.getClassNameIndex()));		((ConstantUtf8)jc.getConstantPool().		 getConstant(cc.getNameIndex())).setBytes(DAMAGED_CLASS);	}	cp = jc.getConstantPool();	constants = cp.getConstantPool();		for( lpc = 0; lpc < constants.length; lpc++ )	{	    if( constants[lpc] instanceof ConstantClass )	    {		ConstantClass cc;		cc = (ConstantClass)constants[lpc];		old_index = cc.getNameIndex();		/* Out of range. */		{		    cc.setNameIndex(cp.getLength());		    tryClass(jc);		    cc.setNameIndex(cp.getLength() + 1);		    tryClass(jc);		    cc.setNameIndex(cp.getLength() + 100);		    tryClass(jc);		    		    damage += 3;		}				/* Wrong type. */		{		    cc.setNameIndex(findOppositeType(constants,						     constants[old_index].						     getTag()));		    tryClass(jc);		    		    damage += 1;		}		cc.setNameIndex(old_index);	    }	    else if( constants[lpc] instanceof ConstantString )	    {		ConstantString cs;		cs = (ConstantString)constants[lpc];		old_index = cs.getStringIndex();		/* Out of range. */		{		    cs.setStringIndex(cp.getLength());		    tryClass(jc);		    cs.setStringIndex(cp.getLength() + 1);		    tryClass(jc);		    cs.setStringIndex(cp.getLength() + 100);		    tryClass(jc);		    		    damage += 3;		}				/* Wrong type. */		{		    cs.setStringIndex(findOppositeType(constants,						       constants[old_index].						       getTag()));		    tryClass(jc);		    		    damage += 1;		}		cs.setStringIndex(old_index);	    }	    else if( constants[lpc] instanceof ConstantNameAndType )	    {		ConstantNameAndType cnat;		cnat = (ConstantNameAndType)constants[lpc];		old_index = cnat.getNameIndex();		/* Out of range. */		{		    cnat.setNameIndex(cp.getLength());		    tryClass(jc);		    cnat.setNameIndex(cp.getLength() + 1);		    tryClass(jc);		    cnat.setNameIndex(cp.getLength() + 100);		    tryClass(jc);		    		    damage += 3;		}				/* Wrong type. */		{		    cnat.setNameIndex(findOppositeType(constants,						       constants[old_index].						       getTag()));		    tryClass(jc);		    		    damage += 1;		}		cnat.setNameIndex(old_index);				old_index = cnat.getSignatureIndex();		/* Out of range. */		{		    cnat.setSignatureIndex(cp.getLength());		    tryClass(jc);		    cnat.setSignatureIndex(cp.getLength() + 1);		    tryClass(jc);		    cnat.setSignatureIndex(cp.getLength() + 100);		    tryClass(jc);		    		    damage += 3;		}				/* Wrong type. */		{		    cnat.setSignatureIndex(			findOppositeType(constants,					 constants[old_index].					 getTag()));		    tryClass(jc);		    		    damage += 1;		}		cnat.setSignatureIndex(old_index);	    }	    else if( constants[lpc] instanceof ConstantCP )	    {		ConstantCP ccp;		/* FieldRef, MethodRef, InterfaceMethodRef */				ccp = (ConstantCP)constants[lpc];		old_index = ccp.getClassIndex();		/* Out of range. */		{		    ccp.setClassIndex(cp.getLength());		    tryClass(jc);		    ccp.setClassIndex(cp.getLength() + 1);		    tryClass(jc);		    ccp.setClassIndex(cp.getLength() + 100);		    tryClass(jc);		    		    damage += 3;		}				/* Wrong type. */		{		    ccp.setClassIndex(findOppositeType(constants,						       constants[old_index].						       getTag()));		    tryClass(jc);		    		    damage += 1;		}		ccp.setClassIndex(old_index);		old_index = ccp.getNameAndTypeIndex();		/* Out of range. */		{		    ccp.setNameAndTypeIndex(cp.getLength());		    tryClass(jc);		    ccp.setNameAndTypeIndex(cp.getLength() + 1);		    tryClass(jc);		    ccp.setNameAndTypeIndex(cp.getLength() + 100);		    tryClass(jc);		    damage += 3;		}				/* Wrong type. */		{		    ccp.setNameAndTypeIndex(			findOppositeType(constants,					 constants[old_index].					 getTag()));		    tryClass(jc);		    		    damage += 1;		}		ccp.setNameAndTypeIndex(old_index);	    }	}	if( damage == errors )	{	    for( lpc = 0; lpc < ACCEPT_COUNTS.length; lpc++ )	    {		if( damage == ACCEPT_COUNTS[lpc] )		{		    success = true;		}	    }	}	if( success )	{	    System.out.println("Success");	}	else	{	    System.out.println("Damage = " + damage);	    System.out.println("Errors = " + errors);	}    }}/* Expected Output:Success*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -