| 发表于:2007-02-26 13:38:065楼 得分:20 |
重写classloader的部分方法,对加载进来的.class进行字节加减来实现基本的加密和解秘 import java.util.*; import java.io.*; import java.lang.reflect.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; /** this program demonstrates a custom class loader that decrypts class files. */ public class classloadertest { public static void main(string[] args) { jframe frame = new classloaderframe(); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setvisible(true); } } /** this frame contains two text fields for the name of the class to load and the decryption key. */ class classloaderframe extends jframe { public classloaderframe() { settitle( "classloadertest "); setsize(default_width, default_height); setlayout(new gridbaglayout()); add(new jlabel( "class "), new gbc(0, 0).setanchor(gbc.east)); add(namefield, new gbc(1, 0).setweight(100, 0).setanchor(gbc.west)); add(new jlabel( "key "), new gbc(0, 1).setanchor(gbc.east)); add(keyfield, new gbc(1, 1).setweight(100, 0).setanchor(gbc.west)); jbutton loadbutton = new jbutton( "load "); add(loadbutton, new gbc(0, 2, 2, 1)); loadbutton.addactionlistener(new actionlistener() { public void actionperformed(actionevent event) { runclass(namefield.gettext(), keyfield.gettext()); } }); pack(); } /** runs the main method of a given class. @param name the class name @param key the decryption key for the class files */ public void runclass(string name, string key) { try { classloader loader = new cryptoclassloader(integer.parseint(key)); class c = loader.loadclass(name); string[] args = new string[] {}; method m = c.getmethod( "main ", args.getclass()); m.invoke(null, (object) args); } catch (throwable e) { joptionpane.showmessagedialog(this, e); } } private jtextfield keyfield = new jtextfield( "3 ", 4); private jtextfield namefield = new jtextfield(30); private static final int default_width = 300; private static final int default_height = 200; } /** this class loader loads encrypted class files. */ class cryptoclassloader extends classloader { /** constructs a crypto class loader. @param k the decryption key */ public cryptoclassloader(int k) { key = k; } protected class findclass(string name) throws classnotfoundexception { byte[] classbytes = null; try { classbytes = loadclassbytes(name); } catch (ioexception e) { throw new classnotfoundexception(name); } class cl = defineclass(name, classbytes, 0, classbytes.length); if (cl == null) throw new classnotfoundexception(name); return cl; } /** loads and decrypt the class file bytes. @param name the class name @return an array with the class file bytes */ private byte[] loadclassbytes(string name) throws ioexception { string cname = name.replace( '. ', '/ ') + ".caesar "; fileinputstream in = null; in = new fileinputstream(cname); try { bytearrayoutputstream buffer = new bytearrayoutputstream(); int ch; while ((ch = in.read()) != -1) { byte b = (byte) (ch - key); buffer.write(b); } in.close(); return buffer.tobytearray(); } finally { in.close(); } } private int key; } | | |
|