Advertisement
Guest User

Untitled

a guest
Dec 31st, 2013
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.39 KB | None | 0 0
  1. package modify;
  2.  
  3. import java.io.DataInputStream;
  4. import java.io.FileInputStream;
  5. import java.io.IOException;
  6. import java.util.Vector;
  7.  
  8. /**
  9.  *
  10.  * @author kiriman
  11.  */
  12. public class Main {
  13.  
  14.     private static DataInputStream dis;
  15.     private static final int MAGIC = 0xCAFEBABE; // О_о
  16.     public static final int CLASS = 7;
  17.     public static final int FIELDREF = 9;
  18.     public static final int METHODREF = 10;
  19.     public static final int INTERFACEMETHODREF = 11;
  20.     public static final int STRING = 8;
  21.     public static final int INTEGER = 3;
  22.     public static final int FLOAT = 4;
  23.     public static final int LONG = 5;
  24.     public static final int DOUBLE = 6;
  25.     public static final int NAMEANDTYPE = 12;
  26.     public static final int UTF8 = 1;
  27.     private static int class_version, // версия класса
  28.             count_constants_cp; // количество констант
  29.     private static byte[] tag_cp, // тэги записей в пуле
  30.             code; // основной код
  31.     private static Vector cpool, mref; // сами записи
  32.  
  33.     public static void main(String[] args) {
  34.         if (!isModifyClass()) {
  35.             System.out.println("no");
  36.         } else {
  37.             System.out.println("yes");
  38.         }
  39.     }
  40.  
  41.     private static int divInt(int p, int l) {
  42.         int a1, a2;
  43.         a1 = (p >> l) & 0xff;
  44.         a2 = (p >> (l - 8)) & 0xff;
  45.         return ((a1 << 8) | (a2)) - 1;
  46.     }
  47.  
  48.     private static boolean isModifyClass() {
  49.         try {
  50.  
  51.             dis = new DataInputStream(new FileInputStream("Main.class"));
  52.  
  53.             dis.readInt(); // MAGIC
  54.             class_version = dis.readInt();
  55.             count_constants_cp = dis.readShort();
  56.             tag_cp = new byte[count_constants_cp];
  57.             cpool = new Vector();
  58.             mref = new Vector(); // для METHODREF записей
  59.             int skip = 10; // кол-во прочтенных байт(int + int + short)
  60.             boolean z = false;
  61.  
  62.             for (int i = 0; i < count_constants_cp; i++) {
  63.                 tag_cp[i] = dis.readByte();
  64.                 skip++;
  65.                 switch (tag_cp[i]) {
  66.                     case METHODREF:
  67.                         int lol = dis.readInt();
  68.                         cpool.addElement(new Integer(lol));
  69.                         mref.addElement(new Integer(lol));
  70.                         skip += 4;
  71.                         break;
  72.                     case UTF8:
  73.                         String s = dis.readUTF();
  74.                         skip += s.length() + 2;
  75.                         cpool.addElement(s);
  76.                         if (s.contains("getResourceAsStream")) {
  77.                             z = true; // шоу продолжается!
  78.                         }
  79.                         break;
  80.                     case NAMEANDTYPE:
  81.                     case INTERFACEMETHODREF:
  82.                     case FIELDREF:
  83.                     case INTEGER:
  84.                     case FLOAT:
  85.                         cpool.addElement(new Integer(dis.readInt()));
  86.                         skip += 4;
  87.                         break;
  88.                     case DOUBLE:
  89.                     case LONG:
  90.                         cpool.addElement(new Long(dis.readLong()));
  91.                         skip += 8;
  92.                         break;
  93.                     case CLASS:
  94.                     case STRING:
  95.                         cpool.addElement(new Short(dis.readShort()));
  96.                         skip += 2;
  97.                         break;
  98.                 }
  99.             }
  100.  
  101.             if (!z) { // класс годится для эмуляции
  102.                 return false;
  103.             }
  104.  
  105.             /*
  106.              * разбор METHODREF записей на составляющие(индекс класса и имя метода с типом возвращаемых значений)
  107.              * проверяем, есть ли нужный нам метод - InputStream getResourceAsStream(String)
  108.              * и изменяем класс, ведь его индекс у нас найдется
  109.              */
  110.             int len = mref.size();
  111.             for (int i = 0; i < len; i++) {
  112.                 int m = ((Integer) mref.elementAt(i)).intValue();
  113.                 int class_index = divInt(m, 24);
  114.                 class_index = getClassIndex(class_index);
  115.                 int nat_index = divInt(m, 8);
  116.                 if (getNameAndType(nat_index).equals("name=getResourceAsStream, type=(Ljava/lang/String;)Ljava/io/InputStream;")) {
  117.                     cpool.setElementAt("SomeClass", class_index); // аллилуйя!!!
  118.                 }
  119.             }
  120.  
  121.         } catch (IOException ex) {
  122.         }
  123.         return true;
  124.     }
  125.  
  126.     private static int getClassIndex(int index) {
  127.         Object element = cpool.elementAt(index);
  128.         int k = ((Short) element).shortValue() - 1;
  129.         if (tag_cp[index] == CLASS) {
  130.             return k;
  131.         } else {
  132.             return index;
  133.         }
  134.     }
  135.  
  136.     private static String getNameAndType(int index) {
  137.         int nat = ((Integer) (cpool.elementAt(index))).intValue();
  138.         int index_name = divInt(nat, 24);
  139.         String name = (String) cpool.elementAt(index_name);
  140.         int index_type = divInt(nat, 8);
  141.         String type = (String) cpool.elementAt(index_type);
  142.         return "name=" + name + ", type=" + type;
  143.     }
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement