LIST 80 ============================================================================ #include #include #include FILE *fp; int ni[1000], m[15000], p[300][10]; char n[300][60]; static void access_flag_printf(int para); static void byte_code_printf(long address); static void display_information(int mode, int id); int main(int argc,char **argv){ int d, i, j, k, ct; unsigned int p0, p00, p1, p2, p3; int pp=0, count=0, p4, p5; unsigned char ss, st[20], d0, d1, d2, d3; st[16]=0; if( argc != 2 ){ printf("... target file name missing (;_;) ...\n\n"); exit(1); } else if( (fp=fopen( argv[1], "rb" ))==NULL ){ printf("... target file [ %s ] is not found (;_;) ...\n\n", argv[1]); exit(1); } printf("Target Java File Name = %s\n", argv[1]); while( (d = fgetc(fp)) >= 0 ){ m[count++] = d & 0xff; } fclose(fp); printf("\nTotal File Length = %d bytes.", count); p0 = m[pp+3]+256*m[pp+2]; p00 = m[pp+1]+256*m[pp]; printf("\n\n\t%06X Magic Code [CAFEBABE] = %04X%04X",pp,p00,p0); pp += 4; if(( p00 != 0xcafe )||( p0 != 0xbabe )){ printf("\n\n... target file is not Java (;_;) ...\n\n"); exit(1); } else printf(" --- OK (^_^)"); printf("\n\n\t%06X 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%06X 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); p[i][2] = 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); p[i][3] = 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); p[i][0] = 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); p[i][4] = 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); p[i][1] = p2; 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