diff --git a/jdisa/main.c b/jdisa/main.c new file mode 100644 --- /dev/null +++ b/jdisa/main.c @@ -0,0 +1,705 @@ +/** + * jdisa + * + * ByteCode Disassembler + * See http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html + */ + +#include +#include +#include + +#define BUF_SIZE 1023 + +typedef unsigned char uchar_t; + +typedef uchar_t u1[1]; +typedef uchar_t u2[2]; +typedef uchar_t u4[4]; +typedef uchar_t u8[8]; + +struct Header { + u4 magic; + u2 minor_version; + u2 major_version; + u2 constant_pool_count; +}; + +typedef struct Header Header; + +int main (int argc, char **argv) +{ + FILE *f; + uchar_t buffer[BUF_SIZE]; + int i; + size_t num; + int OPCODE; + Header *cf; + + if (argc != 2) { + fprintf (stderr, "Usage: %s \n", argv[0]); + return EXIT_FAILURE; + } + + if ((f = fopen (argv[1], "r")) == NULL) { + perror ("FOPEN"); + return EXIT_FAILURE; + } + + if ((cf = malloc (sizeof (Header))) == NULL) + return EXIT_FAILURE; + if ((num = fread (cf, 1, sizeof (Header), f)) < 1) + return EXIT_FAILURE; + + printf (" MAGIC: %2X%2X%2X%2X\n", cf->magic[0], cf->magic[1], cf->magic[2], cf->magic[3]); + printf ("VERSION: %02d.%02d\n", cf->major_version[1], cf->major_version[0]); + printf ("POOLCTN: %2d:%2d\n", cf->constant_pool_count[1], cf->constant_pool_count[0]); + + if (cf != NULL) + free (cf); + + OPCODE = 1; + while (!feof (f)) { + num = fread (buffer, 1, sizeof (buffer), f); + for (i = 0; i < num; i++) { + if (OPCODE) { + switch (buffer[i]) { + case 50: + printf ("aaload "); + break; + case 83: + printf ("aastore "); + break; + case 1: + printf ("aconst_null "); + break; + case 25: + printf ("aload "); + break; + case 42: + printf ("aload_0 "); + break; + case 43: + printf ("aload_1 "); + break; + case 44: + printf ("aload_2 "); + break; + case 45: + printf ("aload_3 "); + break; + case 189: + printf ("anewarray "); + break; + case 176: + printf ("areturn "); + break; + case 190: + printf ("arraylength "); + break; + case 58: + printf ("astore "); + break; + case 75: + printf ("astore_0 "); + break; + case 76: + printf ("astore_1 "); + break; + case 77: + printf ("astore_2 "); + break; + case 78: + printf ("astore_3 "); + break; + case 191: + printf ("athrow "); + break; + case 51: + printf ("baload "); + break; + case 84: + printf ("bastore "); + break; + case 16: + printf ("bipush "); + break; + case 52: + printf ("caload "); + break; + case 85: + printf ("castore "); + break; + case 192: + printf ("checkcast "); + break; + case 144: + printf ("d2f "); + break; + case 142: + printf ("d2i "); + break; + case 143: + printf ("d2l "); + break; + case 99: + printf ("dadd "); + break; + case 49: + printf ("daload "); + break; + case 82: + printf ("dastore "); + break; + case 152: + printf ("dcmp "); + break; + case 14: + printf ("dconst_0 "); + break; + case 15: + printf ("dconst_1 "); + break; + case 111: + printf ("ddiv "); + break; + case 24: + printf ("dload "); + break; + case 38: + printf ("dload_0 "); + break; + case 39: + printf ("dload_1 "); + break; + case 40: + printf ("dload_2 "); + break; + case 41: + printf ("dload_3 "); + break; + case 107: + printf ("dmul "); + break; + case 119: + printf ("dneg "); + break; + case 115: + printf ("drem "); + break; + case 175: + printf ("dreturn "); + break; + case 57: + printf ("dstore "); + break; + case 71: + printf ("dstore_0 "); + break; + case 72: + printf ("dstore_1 "); + break; + case 73: + printf ("dstore_2 "); + break; + case 74: + printf ("dstore_3 "); + break; + case 103: + printf ("dsub "); + break; + case 89: + printf ("dup "); + break; + case 90: + printf ("dup_x1 "); + break; + case 91: + printf ("dup_x2 "); + break; + case 92: + printf ("dup2 "); + break; + case 93: + printf ("dup2_x1 "); + break; + case 94: + printf ("dup2_x2 "); + break; + case 141: + printf ("f2d "); + break; + case 139: + printf ("f2i "); + break; + case 140: + printf ("f2l "); + break; + case 98: + printf ("fadd "); + break; + case 48: + printf ("faload "); + break; + case 81: + printf ("fastore "); + break; + case 150: + printf ("fcmpg "); + break; + case 149: + printf ("fcmpl "); + break; + case 11: + printf ("fconst_0 "); + break; + case 12: + printf ("fconst_1 "); + break; + case 13: + printf ("fconst_2 "); + break; + case 110: + printf ("fdiv "); + break; + case 23: + printf ("fload "); + break; + case 34: + printf ("fload_0 "); + break; + case 35: + printf ("fload_1 "); + break; + case 36: + printf ("fload_2 "); + break; + case 37: + printf ("fload_3 "); + break; + case 106: + printf ("fmul "); + break; + case 118: + printf ("fneg "); + break; + case 114: + printf ("frem "); + break; + case 174: + printf ("freturn "); + break; + case 56: + printf ("fstore "); + break; + case 67: + printf ("fstore_0 "); + break; + case 68: + printf ("fstore_1 "); + break; + case 69: + printf ("fstore_2 "); + break; + case 70: + printf ("fstore_3 "); + break; + case 102: + printf ("fsub "); + break; + case 180: + printf ("getfield "); + break; + case 178: + printf ("getstatic "); + break; + case 167: + printf ("goto "); + break; + case 200: + printf ("goto_w "); + break; + case 145: + printf ("i2b "); + break; + case 146: + printf ("i2c "); + break; + case 135: + printf ("i2d "); + break; + case 134: + printf ("i2f "); + break; + case 133: + printf ("i2l "); + break; + case 147: + printf ("i2s "); + break; + case 96: + printf ("iadd "); + break; + case 46: + printf ("iaload "); + break; + case 126: + printf ("iand "); + break; + case 79: + printf ("iastore "); + break; + case 2: + printf ("iconst_m1 "); + break; + case 3: + printf ("iconst_0 "); + break; + case 4: + printf ("iconst_1 "); + break; + case 5: + printf ("iconst_2 "); + break; + case 6: + printf ("iconst_3 "); + break; + case 7: + printf ("iconst_4 "); + break; + case 8: + printf ("iconst_5 "); + break; + case 108: + printf ("idiv "); + break; + case 165: + printf ("if_acmpeq "); + break; + case 166: + printf ("if_acmpne "); + break; + case 159: + printf ("if_icmpeq "); + break; + case 160: + printf ("if_icmpne "); + break; + case 161: + printf ("if_icmplt "); + break; + case 162: + printf ("if_icmpge "); + break; + case 163: + printf ("if_icmpgt "); + break; + case 164: + printf ("if_icmple "); + break; + case 153: + printf ("ifeq "); + break; + case 154: + printf ("ifne "); + break; + case 155: + printf ("iflt "); + break; + case 156: + printf ("ifge "); + break; + case 157: + printf ("ifgt "); + break; + case 158: + printf ("ifle "); + break; + case 199: + printf ("ifnonnull "); + break; + case 198: + printf ("ifnull "); + break; + case 132: + printf ("iinc %d %d\n", buffer[i + 1], buffer[i + 2]); + i += 2; + continue; + break; + case 21: + printf ("iload "); + break; + case 26: + printf ("iload_0 "); + break; + case 27: + printf ("iload_1 "); + break; + case 28: + printf ("iload_2 "); + break; + case 29: + printf ("iload_3 "); + break; + case 104: + printf ("imul "); + break; + case 116: + printf ("ineg "); + break; + case 193: + printf ("instanceof "); + break; + case 185: + printf ("invokeinterface "); + break; + case 183: + printf ("invokespecial "); + break; + case 184: + printf ("invokestatic "); + break; + case 182: + printf ("invokevirtual "); + break; + case 128: + printf ("ior "); + break; + case 112: + printf ("irem "); + break; + case 172: + printf ("ireturn "); + break; + case 120: + printf ("ishl "); + break; + case 122: + printf ("ishr "); + break; + case 54: + printf ("istore "); + break; + case 59: + printf ("istore_0 "); + break; + case 60: + printf ("istore_1 "); + break; + case 61: + printf ("istore_2 "); + break; + case 62: + printf ("istore_3 "); + break; + case 100: + printf ("isub "); + break; + case 124: + printf ("iushr "); + break; + case 130: + printf ("ixor "); + break; + case 168: + printf ("jsr "); + break; + case 201: + printf ("jsr_w "); + break; + case 138: + printf ("l2d "); + break; + case 137: + printf ("l2f "); + break; + case 136: + printf ("l2i "); + break; + case 97: + printf ("ladd "); + break; + case 47: + printf ("laload "); + break; + case 127: + printf ("land "); + break; + case 80: + printf ("lastore "); + break; + case 148: + printf ("lcmd "); + break; + case 9: + printf ("lconst_0 "); + break; + case 10: + printf ("lconst_1 "); + break; + case 18: + printf ("ldc "); + break; + case 19: + printf ("ldc_w "); + break; + case 20: + printf ("ldc2_w "); + break; + case 109: + printf ("ldiv "); + break; + case 22: + printf ("lload "); + break; + case 30: + printf ("lload_0 "); + break; + case 31: + printf ("lload_1 "); + break; + case 32: + printf ("lload_2 "); + break; + case 33: + printf ("lload_3 "); + break; + case 105: + printf ("lmul "); + break; + case 117: + printf ("lneg "); + break; + case 171: + printf ("lookupswitch "); + break; + case 129: + printf ("lor "); + break; + case 113: + printf ("lrem "); + break; + case 173: + printf ("lreturn "); + break; + case 121: + printf ("lshl "); + break; + case 123: + printf ("lshr "); + break; + case 55: + printf ("lstore "); + break; + case 63: + printf ("lstore_0 "); + break; + case 64: + printf ("lstore_1 "); + break; + case 65: + printf ("lstore_2 "); + break; + case 66: + printf ("lstore_3 "); + break; + case 101: + printf ("lsub "); + break; + case 125: + printf ("lushr "); + break; + case 131: + printf ("lxor "); + break; + case 194: + printf ("monitorenter "); + break; + case 195: + printf ("monitorexit "); + break; + case 197: + printf ("multianewarray "); + break; + case 187: + printf ("new "); + break; + case 188: + printf ("newarray "); + break; + case 0: + printf ("nop "); + break; + case 87: + printf ("pop "); + break; + case 88: + printf ("pop2 "); + break; + case 181: + printf ("putfield "); + break; + case 179: + printf ("putstatic "); + break; + case 169: + printf ("ret "); + break; + case 177: + printf ("return "); + break; + case 53: + printf ("saload "); + break; + case 86: + printf ("sastore "); + break; + case 17: + printf ("sipush "); + break; + case 95: + printf ("swap "); + break; + case 170: + printf ("tableswitch "); + break; + case 196: + printf ("wide "); + break; + case 202: /* reserved item */ + printf ("breakpoint "); + break; + case 254: /* reserved item */ + printf ("impdep1 "); + break; + case 255: /* reserved item */ + printf ("impdep2 "); + break; + default: + printf ("OPCODE %02X(%d) ", buffer[i], buffer[i]); + } + OPCODE = 0; + } else + switch (buffer[i]) { + case '\0': + case '>': + case '<': + printf ("\n"); + OPCODE = 1; + break; + default: + if (isprint (buffer[i])) + printf ("%c", buffer[i]); + else + printf ("%02X ", buffer[i]); + } + } + } + + printf ("\n"); + + if (f != NULL) + fclose (f); + + return EXIT_SUCCESS; +}