LIST 76 ============================================================================ #include #include FILE *fp; int ni[3000]; unsigned char m[1000000], n[3000][256]; void byte_code_printf( long address, long length ){ int k, l, p1, p2, p3, mm, m1, m2, m3, m4; long pp, p4, p5; pp = address; p1 = m[pp+1]+256*m[pp]; pp += 2; p2 = m[pp+1]+256*m[pp]; pp += 2; printf(" , max_stack = %d , max_locals = %d , ", p1, p2 ); p4 = m[pp+3]+256*(m[pp+2]+256*(m[pp+1]+256*m[pp])); pp += 4; printf("code_length = %d\n", p4); k = 0; while( k < p4 ){ printf("\n\t\t\t\t%06X\t", k ); mm = m[pp++]; switch(mm){ default : printf("?? %02X ??\t\t(..... not defined .....)", mm); break; case 16: m1 = m[pp++]; printf("bipush\t%02X\t(Push one-byte signed integer)", m1); k += 1; break; case 17: m1 = m[pp++]; m2 = m[pp++]; printf("sipush\t%04X\t(Push two-byte signed integer)", 256*m1+m2); k += 2; break; case 18: m1 = m[pp++]; printf("ldc1\t%02X\t(Push item from constant pool)", m1); k += 1; break; case 19: m1 = m[pp++]; m2 = m[pp++]; printf("ldc2\t%04X\t(Push item from constant pool)", 256*m1+m2); k += 2; break; case 20: m1 = m[pp++]; m2 = m[pp++]; printf("ldc2w\t%04X\t(Push long or double from constant pool)", 256*m1+m2); k += 2; break; case 1: printf("aconst_null\t\t(Push null object reference)"); break; case 2: printf("iconst_m1\t\t(Push integer constant -1)"); break; case 3: case 4: case 5: case 6: case 7: case 8: printf("iconst_%d\t\t(Push integer constant)", mm-3); break; case 9: case 10: printf("lconst_%d\t\t(Push long integer constant)", mm-9); break; case 11: case 12: case 13: printf("fconst_%d\t\t(Push single float)", mm-11); break; case 14: case 15: printf("dconst_%d\t\t(Push double float)", mm-14); break; case 21: m1 = m[pp++]; printf("iload\t%02X\t(Load integer from local variable)", m1); k += 1; break; case 26: case 27: case 28: case 29: printf("iload_%d\t\t(Load integer from local variable)", mm-26); break; case 22: m1 = m[pp++]; printf("lload\t%02X\t(Load long integer from local variable)", m1); k += 1; break; case 30: case 31: case 32: case 33: printf("lload_%d\t\t(Load long integer from local variable)", mm-30); break; case 23: m1 = m[pp++]; printf("fload\t%02X\t(Load single float from local variable)", m1); k += 1; break; case 34: case 35: case 36: case 37: printf("fload_%d\t\t(Load single float from local variable)", mm-34); break; case 24: m1 = m[pp++]; printf("dload\t%02X\t(Load double float from local variable)", m1); k += 1; break; case 38: case 39: case 40: case 41: printf("dload_%d\t\t(Load double float from local variable)", mm-38); break; case 25: m1 = m[pp++]; printf("aload\t%02X\t(Load object reference from local variable)", m1); k += 1; break; case 42: case 43: case 44: case 45: printf("aload_%d\t\t(Load object reference from local variable)", mm-42); break; case 54: m1 = m[pp++]; printf("istore\t%02X\t(Store integer into local variable)", m1); k += 1; break; case 59: case 60: case 61: case 62: printf("istore_%d\t\t(Store integer into local variable)", mm-59); break; case 55: m1 = m[pp++]; printf("lstore\t%02X\t(Store long integer into local variable)", m1); k += 1; break; case 63: case 64: case 65: case 66: printf("lstore_%d\t\t(Store long integer into local variable)", mm-63); break; case 56: m1 = m[pp++]; printf("fstore\t%02X\t(Store float into local variable)", m1); k += 1; break; case 67: case 68: case 69: case 70: printf("fstore_%d\t\t(Store float into local variable)", mm-67); break; case 57: m1 = m[pp++]; printf("dstore\t%02X\t(Store double float into local variable)", m1); k += 1; break; case 71: case 72: case 73: case 74: printf("dstore_%d\t\t(Store double float into local variable)", mm-71); break; case 58: m1 = m[pp++]; printf("astore\t%02X\t(Store object reference into local variable)", m1); k += 1; break; case 75: case 76: case 77: case 78: printf("astore_%d\t\t(Store object reference into local variable)", mm-75); break; case 132: m1 = m[pp++]; m2 = m[pp++]; printf("iinc\t%02X %02X\t(Increment local variable by constant)", m1, m2); k += 2; break; case 196: m1 = m[pp++]; printf("wide\t%02X\t(Wider index for accessing local variables in load, store and increment)", m1); k += 1; break; case 188: m1 = m[pp++]; printf("newarray\t%02X\t(Allocate new array) : ", m1); k += 1; switch(m1){ case 4: printf("array type = T_BOOLEAN"); break; case 5: printf("array type = T_CHAR"); break; case 6: printf("array type = T_FLOAT"); break; case 7: printf("array type = T_DOUBLE"); break; case 8: printf("array type = T_BYTE"); break; case 9: printf("array type = T_SHORT"); break; case 10: printf("array type = T_INT"); break; case 11: printf("array type = T_LONG"); break; } break; case 189: m1 = m[pp++]; m2 = m[pp++]; printf("anewarray\t%04X\t(Allocate new array of references to objects)", 256*m1+m2); k += 2; break; case 197: m1 = m[pp++]; m2 = m[pp++]; m3 = m[pp++]; printf("multianewarray\t%04X %02X\t(Allocate new multi-dimensional array)", 256*m1+m2, m3); k += 3; break; case 190: printf("arraylength\t\t(Get length of array)"); break; case 46: printf("iaload\t\t(Load integer from array)"); break; case 47: printf("laload\t\t(Load long integer from array)"); break; case 48: printf("faload\t\t(Load single float from array)"); break; case 49: printf("daload\t\t(Load double float from array)"); break; case 50: printf("aaload\t\t(Load object reference from array)"); break; case 51: printf("baload\t\t(Load signed byte from array)"); break; case 52: printf("caload\t\t(Load character from array)"); break; case 53: printf("saload\t\t(Load short from array)"); break; case 79: printf("iastore\t\t(Store into integer array)"); break; case 80: printf("lastore\t\t(Store into long integer array)"); break; case 81: printf("fastore\t\t(Store into single float array)"); break; case 82: printf("dastore\t\t(Store into double float array)"); break; case 83: printf("aastore\t\t(Store into object reference array)"); break; case 84: printf("bastore\t\t(Store into signed byte array)"); break; case 85: printf("castore\t\t(Store into character array)"); break; case 86: printf("sastore\t\t(Store into short array)"); break; case 0: printf("nop\t\t(Do nothing)"); break; case 87: printf("pop\t\t(Pop top stack word)"); break; case 88: printf("pop2\t\t(Pop top two stack words)"); break; case 89: printf("dup\t\t(Duplicate top stack word)"); break; case 92: printf("dup2\t\t(Duplicate top two stack words)"); break; case 90: printf("dup_x1\t\t(Duplicate top stack word and put two down)"); break; case 93: printf("dup2_x1\t\t(Duplicate top two stack words and put two down)"); break; case 91: printf("dup_x2\t\t(Duplicate top stack word and put three down)"); break; case 94: printf("dup2_x2\t\t(Duplicate top two stack words and put three down)"); break; case 95: printf("swap\t\t(Swap top two stack words)"); break; case 96: printf("iadd\t\t(Integer add)"); break; case 97: printf("ladd\t\t(Long integer add)"); break; case 98: printf("fadd\t\t(Single floats add)"); break; case 99: printf("dadd\t\t(Double floats add)"); break; case 100: printf("isub\t\t(Integer subtract)"); break; case 101: printf("lsub\t\t(Long integer subtract)"); break; case 102: printf("fsub\t\t(Single float subtract)"); break; case 103: printf("dsub\t\t(Double float subtract)"); break; case 104: printf("imul\t\t(Integer multiply)"); break; case 105: printf("imul\t\t(Long integer multiply)"); break; case 106: printf("fmul\t\t(Single float multiply)"); break; case 107: printf("dmul\t\t(Double float multiply)"); break; case 108: printf("idiv\t\t(Integer divide)"); break; case 109: printf("ldiv\t\t(Long integer divide)"); break; case 110: printf("fdiv\t\t(Single float divide)"); break; case 111: printf("ddiv\t\t(Double float divide)"); break; case 112: printf("irem\t\t(Integer remainder)"); break; case 113: printf("lrem\t\t(Long integer remainder)"); break; case 114: printf("frem\t\t(Single float remainder)"); break; case 115: printf("drem\t\t(Double float remainder)"); break; case 116: printf("ineg\t\t(Integer negate)"); break; case 117: printf("lneg\t\t(Long integer negate)"); break; case 118: printf("fneg\t\t(Single float negate)"); break; case 119: printf("dneg\t\t(Double float negate)"); break; case 120: printf("ishl\t\t(Integer shift left)"); break; case 122: printf("ishr\t\t(Integer arithmetic shift right)"); break; case 124: printf("iushr\t\t(Integer logical shift right)"); break; case 121: printf("lshl\t\t(Long integer shift left)"); break; case 123: printf("lshr\t\t(Long integer arithmetic shift right)"); break; case 125: printf("lushr\t\t(Long integer logical shift right)"); break; case 126: printf("iand\t\t(Integer boolean AND)"); break; case 127: printf("land\t\t(Long integer boolean AND)"); break; case 128: printf("ior\t\t(Integer boolean OR)"); break; case 129: printf("lor\t\t(Long integer boolean OR)"); break; case 130: printf("ixor\t\t(Integer boolean XOR)"); break; case 131: printf("lxor\t\t(Long integer boolean XOR)"); break; case 133: printf("i2l\t\t(Integer to long integer conversion)"); break; case 134: printf("i2f\t\t(Integer to single float)"); break; case 135: printf("i2d\t\t(Integer to double float)"); break; case 136: printf("l2i\t\t(Long integer to integer)"); break; case 137: printf("l2f\t\t(Long integer to single float)"); break; case 138: printf("l2d\t\t(Long integer to double float)"); break; case 139: printf("f2i\t\t(Single float to integer)"); break; case 140: printf("f2l\t\t(Single float to long integer)"); break; case 141: printf("f2d\t\t(Single float to double float)"); break; case 142: printf("d2i\t\t(Double float to integer)"); break; case 143: printf("d2l\t\t(Double float to long integer)"); break; case 144: printf("d2f\t\t(Double float to single float)"); break; case 145: printf("int2byte\t\t(Integer to signed byte)"); break; case 146: printf("int2char\t\t(Integer to char)"); break; case 147: printf("int2short\t\t(Integer to short)"); break; case 153: m1 = m[pp++]; m2 = m[pp++]; printf("ifeq\t%04X\t(Branch if equal to 0)", 256*m1+m2); k += 2; break; case 198: m1 = m[pp++]; m2 = m[pp++]; printf("ifnull\t%04X\t(Branch if null)", 256*m1+m2); k += 2; break; case 155: m1 = m[pp++]; m2 = m[pp++]; printf("iflt\t%04X\t(Branch if less than 0)", 256*m1+m2); k += 2; break; case 158: m1 = m[pp++]; m2 = m[pp++]; printf("ifle\t%04X\t(Branch if less than or equal to 0)", 256*m1+m2); k += 2; break; case 154: m1 = m[pp++]; m2 = m[pp++]; printf("ifne\t%04X\t(Branch if not equal to 0)", 256*m1+m2); k += 2; break; case 199: m1 = m[pp++]; m2 = m[pp++]; printf("ifnonnull\t%04X\t(Branch if not null)", 256*m1+m2); k += 2; break; case 157: m1 = m[pp++]; m2 = m[pp++]; printf("ifgt\t%04X\t(Branch if greater than 0)", 256*m1+m2); k += 2; break; case 156: m1 = m[pp++]; m2 = m[pp++]; printf("ifge\t%04X\t(Branch if greater than or equal to 0)", 256*m1+m2); k += 2; break; case 159: m1 = m[pp++]; m2 = m[pp++]; printf("if_icmpeq\t%04X\t(Branch if integers equal)", 256*m1+m2); k += 2; break; case 160: m1 = m[pp++]; m2 = m[pp++]; printf("if_icmpne\t%04X\t(Branch if integers not equal)", 256*m1+m2); k += 2; break; case 161: m1 = m[pp++]; m2 = m[pp++]; printf("if_icmplt\t%04X\t(Branch if integer less than)", 256*m1+m2); k += 2; break; case 163: m1 = m[pp++]; m2 = m[pp++]; printf("if_icmpgt\t%04X\t(Branch if integer greater than)", 256*m1+m2); k += 2; break; case 164: m1 = m[pp++]; m2 = m[pp++]; printf("if_icmple\t%04X\t(Branch if integer less than or equal to)", 256*m1+m2); k += 2; break; case 162: m1 = m[pp++]; m2 = m[pp++]; printf("if_icmpge\t%04X\t(Branch if integer greater than or equal to)", 256*m1+m2); k += 2; break; case 148: printf("lcmp\t\t(Long integer compare)"); break; case 149: printf("fcmpl\t\t(Single float compare (-1 on NaN))"); break; case 150: printf("fcmpg\t\t(Single float compare (1 on NaN))"); break; case 151: printf("dcmpl\t\t(Double float compare (-1 on NaN))"); break; case 152: printf("dcmpg\t\t(Double float compare (1 on NaN))"); break; case 165: m1 = m[pp++]; m2 = m[pp++]; printf("if_acmpeq\t%04X\t(Branch if object references are equal)", 256*m1+m2); k += 2; break; case 166: m1 = m[pp++]; m2 = m[pp++]; printf("if_acmpne\t%04X\t()Branch if object references not equal", 256*m1+m2); k += 2; case 167: m1 = m[pp++]; m2 = m[pp++]; printf("goto\t%04X\t(Branch)", 256*m1+m2); k += 2; break; case 200: m1 = m[pp++]; m2 = m[pp++]; m3 = m[pp++]; m4 = m[pp++]; printf("goto_w\t%04X %04X\t(Branch always (wide index))", 256*m1+m2, 256*m3+m4); k += 2; break; case 168: m1 = m[pp++]; m2 = m[pp++]; printf("jsr\t%04X\t(Jump subroutine)", 256*m1+m2); k += 2; break; case 201: m1 = m[pp++]; m2 = m[pp++]; m3 = m[pp++]; m4 = m[pp++]; printf("jsr_w\t%04X %04X\t(Jump subroutine (wide index))", 256*m1+m2, 256*m3+m4); k += 2; break; case 169: m1 = m[pp++]; printf("ret\t%02X\t(Return from subroutine)", m1); k += 1; break; case 209: m1 = m[pp++]; m2 = m[pp++]; printf("ret_w\t%04X\t(Return from subroutine (wide index))", 256*m1+m2); k += 2; break; case 172: printf("ireturn\t\t(Return integer from function)"); break; case 173: printf("lreturn\t\t(Return long integer from function)"); break; case 174: printf("freturn\t\t(Return single float from function)"); break; case 175: printf("dreturn\t\t(Return double float from function)"); break; case 176: printf("areturn\t\t(Return object reference from function)"); break; case 177: printf("return\t\t(Return (void) from procedure)"); break; case 202: printf("breakpoint\t\t(Stop and pass control to breakpoint handler)"); break; case 170: printf("tableswitch\t\t(Access jump table by index and jump)"); printf("\n\t\t\t\t\t\t**********************"); break; case 171: printf("lookupswitch\t\t(Access jump table by key match and jump)"); printf("\n\t\t\t\t\t\t**********************"); break; case 181: m1 = m[pp++]; m2 = m[pp++]; printf("putfield\t%04X\t(Set field in object)", 256*m1+m2); k += 2; break; case 180: m1 = m[pp++]; m2 = m[pp++]; printf("getfield\t%04X\t(Fetch field from object)", 256*m1+m2); k += 2; break; case 179: m1 = m[pp++]; m2 = m[pp++]; printf("putstatic\t%04X\t(Set static field in class)", 256*m1+m2); k += 2; break; case 178: m1 = m[pp++]; m2 = m[pp++]; printf("getstatic\t%04X\t(Get static field from class)", 256*m1+m2); k += 2; break; case 182: m1 = m[pp++]; m2 = m[pp++]; printf("invokevirtual\t%04X\t(Invoke instance method)", 256*m1+m2); k += 2; break; case 183: m1 = m[pp++]; m2 = m[pp++]; printf("invokenonvirt\t%04X\t(Invoke instance method, dispatching based on compile-time type)", 256*m1+m2); k += 2; break; case 184: m1 = m[pp++]; m2 = m[pp++]; printf("invokestatic\t%04X\t(Invoke a class (static) method)", 256*m1+m2); k += 2; break; case 185: m1 = m[pp++]; m2 = m[pp++]; m3 = m[pp++]; m4 = m[pp++]; printf("invokeinterf\t%04X %02X %02X\t(Invoke interface method)", 256*m1+m2, m3, m4); k += 2; break; case 191: printf("athrow\t\t(Throw exception or error)"); break; case 187: m1 = m[pp++]; m2 = m[pp++]; printf("new\t%04X\t(Create new object)", 256*m1+m2); k += 2; break; case 192: m1 = m[pp++]; m2 = m[pp++]; printf("checkcast\t%04X\t(Make sure object is of given type)", 256*m1+m2); k += 2; break; case 193: m1 = m[pp++]; m2 = m[pp++]; printf("instanceof\t%04X\t(Determine if an object is of given type)", 256*m1+m2); k += 2; break; case 194: printf("monitorenter\t\t(Enter monitored region of code)"); break; case 195: printf("monitorexit\t\t(Exit monitored region of code)"); break; } k++; } p1 = m[pp+1]+256*m[pp]; pp += 2; printf("\n\n\t\t\texception_table_length = %d", p1 ); if( p1 != 0 ){ printf("\n"); for(k=0;k= 0 ){ if( ( address % 16 ) == 0 ){ printf("\n\t%08X : ", address); ct = 0; } ss = d & 0xff; printf("%02X ",ss); m[count++] = ss; if( ( address % 16 ) == 7 ) printf("- "); if( ( ss > 0x1f ) && ( ss < 0x7f ) ) st[ct++] = ss; else st[ct++] = '.'; if( ( address++ % 16 ) == 15 ) printf(" %s", st); } fclose(fp); printf("\n\nTotal File Length = %d bytes.", count); p0 = m[pp+3]+256*(m[pp+2]+256*(m[pp+1]+256*m[pp])); printf("\n\n\t%08X Magic Code [CAFEBABE] = %08X", pp, p0 ); pp += 4; if( p0 != 0xcafebabe ){ printf("\n\n... target file is not Java (;_;) ...\n\n"); exit(1); } else printf(" --- OK (^_^)"); printf("\n\n\t%08X Version : major version %d , minor version %d", pp, m[pp+3]+256*m[pp+2], m[pp+1]+256*m[pp] ); pp += 4; p1 = m[pp+1]+256*m[pp]; printf("\n\n\t%08X Constant Pool : total number = %d\n", pp, p1 ); pp += 2; for(i=1;i ",d0); switch(d0){ case 7: p2 = m[pp+1]+256*m[pp]; pp += 2; ni[i] = p2; printf("CONSTANT_Class , name_index = %d", p2); break; case 9: p2 = m[pp+1]+256*m[pp]; pp += 2; p3 = m[pp+1]+256*m[pp]; pp += 2; printf("CONSTANT_Fieldref , class_index = %d", p2); printf(" , name_and_type_index = %d", p3); break; case 10: p2 = m[pp+1]+256*m[pp]; pp += 2; p3 = m[pp+1]+256*m[pp]; pp += 2; printf("CONSTANT_Methodref , class_index = %d", p2); printf(" , name_and_type_index = %d", p3); break; case 11: p2 = m[pp+1]+256*m[pp]; pp += 2; p3 = m[pp+1]+256*m[pp]; pp += 2; printf("CONSTANT_InterfaceMethodref , class_index = %d", p2); printf(" , name_and_type_index = %d", p3); break; case 8: p2 = m[pp+1]+256*m[pp]; pp += 2; ni[i] = p2; printf("CONSTANT_String , name_index = %d", p2); break; case 3: p4 = m[pp+3]+256*(m[pp+2]+256*(m[pp+1]+256*m[pp])); pp += 4; printf("CONSTANT_Integer , value = %d", p4); break; case 4: p4 = m[pp+3]+256*(m[pp+2]+256*(m[pp+1]+256*m[pp])); pp += 4; printf("CONSTANT_Float , value = %d", p4); break; case 5: p4 = m[pp+3]+256*(m[pp+2]+256*(m[pp+1]+256*m[pp])); pp += 4; p5 = m[pp+3]+256*(m[pp+2]+256*(m[pp+1]+256*m[pp])); pp += 4; printf("CONSTANT_Float , high = %d , low = %d", p4, p5); i++; break; case 6: p4 = m[pp+3]+256*(m[pp+2]+256*(m[pp+1]+256*m[pp])); pp += 4; p5 = m[pp+3]+256*(m[pp+2]+256*(m[pp+1]+256*m[pp])); pp += 4; printf("CONSTANT_Double , high = %d , low = %d", p4, p5); i++; break; case 12: p2 = m[pp+1]+256*m[pp]; pp += 2; p3 = m[pp+1]+256*m[pp]; pp += 2; printf("CONSTANT_NameAndType , name_index = %d", p2); ni[i] = p2; printf(" , signature_index = %d", p3); break; case 1: case 2: p2 = m[pp+1]+256*m[pp]; pp += 2; if(d0==1) printf("CONSTANT_Utf8 , "); else printf("CONSTANT_Unicode , "); k = 0; for(j=0;j