#include #include #include #include #include #include struct file_attr { int name; int len; }; struct file { char magic[10]; int verno1; int verno2; int cp_c; int a_flags; int this_cl; int super_cl; int inter_c; int field_c; int meth_c; int attr_c; file_attr *fiattr; int f_name; }; struct field //field_info { int a_flag; int name; int dindex; //descriptor index int attr_c; void *attr_i; //only attr -> ConstantValue_attr(struct cvattr) }; struct cvattr //ConstantValue_attribute { int name; //attribute name int len; //attr length int cvindex; //valid index into the constant_pool table }; struct meth_attr { int name; int len; }; struct meth { int a_flag; int name; int sign; int attr_c; meth_attr *mthattr; //code_info }; struct guid { unsigned char x1[4]; unsigned char x2[2]; unsigned char x3[2]; unsigned char x4[8]; }; int small( char *ss ) { return ss[0]*256+ss[1]; } struct aaa { int x1, x2; }; struct bbb { int x; char *ss; }; struct ccc { long x1,x2; }; struct pool_info { int tag; void *info; }; void abc( char *ss ) { static int k=0; FILE *fpo= fopen("z.txt", "a"); fprintf(fpo, "%d=%s\n", k, ss); k++; fclose(fpo); } pool_info *p; char *get( int x, int y=1 ) { int jj; switch(p[x].tag) { case 7: case 8: jj = ((aaa *)p[x].info)->x1; return get ( jj ); case 9: case 10: case 12: if( y==1 ) { jj = ((aaa *)p[x].info)->x1; return get ( jj ); } else { jj = ((aaa *)p[x].info)->x2; return get ( jj ); } default : return ((bbb *)p[x].info)->ss; } } char* signat(char **); char* rtype( char **); int main(int argc, char *argv[]) { int debuginfo=0; int ActiveXflag=0; FILE *fp; int offset[9]; int counter=0; file fi; int *iface; fp = fopen(argv[1],"r+b"); if(fp==NULL) { printf("File not found\n"); exit(0); } char *aa=new char[100]; char *bb=new char[100]; offset[0]=0; fread(aa,4,1,fp); //Skip CAFEBABE counter=4; aa[4]='\0'; strcpy( fi.magic, aa); fread(aa,2,1,fp); //Version Nos. counter+=2; fi.verno1=small(aa); fread(aa,2,1,fp); //Version Nos. counter+=2; fi.verno2=small(aa); fread(aa,2,1,fp); //Constant pool size counter+=2; fi.cp_c=small(aa); sprintf(bb, "Constant Pool Size=%d\n", fi.cp_c); abc(bb); p = new pool_info[fi.cp_c]; offset[1]=counter; int k;int i; for ( int j=1; jx=small(aa); fread(aa, s->x, 1, fp); counter+=s->x; aa[s->x]='\0'; s->ss = new char[s->x+1]; strcpy(s->ss, aa); p[j].tag=1; p[j].info = (void *)s; sprintf(bb, "%s(%d)", ((bbb *)p[j].info)->ss, p[j].tag); abc(bb); break; case 3: case 4: ccc *tem=new ccc; fread(aa,4,1,fp); counter+=4; tem->x1 = aa[2]*256+aa[3]; if(i==3) p[j].tag=3; else p[j].tag=4; p[j].info=(void *)tem; sprintf(bb, "%ld(%d)", ((ccc *)p[j].info)->x1,p[j].tag); abc(bb); break; case 5 : case 6 : ccc *tem2=new ccc; fread(aa,4,1,fp); counter+=4; tem2->x1 = aa[2]*256+aa[3]; fread(aa,4,1,fp); counter+=4; tem2->x2 = aa[2]*256+aa[3]; if(i==5) p[j].tag=5; else p[j].tag=6; p[j].info=(void *)tem2; sprintf(bb, "%ld..%ld(%d)", ((ccc *)p[j].info)->x1,((ccc *)p[j].info)->x2,p[j].tag); abc(bb); break; case 7: case 8: aaa *temp; temp=new aaa; fread(aa,2,1,fp); counter+=2; temp->x1 = small(aa); if(i==7) p[j].tag=7; else p[j].tag=8; p[j].info=(void *)temp; sprintf(bb, "%d(%d)", ((aaa *)p[j].info)->x1,p[j].tag); abc(bb); break; case 9 : case 11: case 10: case 12: aaa *temp1; temp1 = new aaa; fread(aa,2,1,fp); counter+=2; temp1->x1=small(aa); fread(aa,2,1,fp); counter+=2; temp1->x2=small(aa); if(i==9) p[j].tag=9; else if (i==10) p[j].tag=10; else if (i==11) p[j].tag=11; else p[j].tag=12; p[j].info = (void *)temp1; sprintf(bb,"%d..%d(%d)", ((aaa *)p[j].info)->x1, ((aaa *)p[j].info)->x2, p[j].tag); abc(bb); break; } } offset[2]=counter; fread(aa, 2, 1, fp); //Flags counter+=2; fi.a_flags = small(aa); fread(aa, 2, 1, fp); //this_class counter+=2; fi.this_cl=small(aa); fread(aa, 2, 1, fp); //super_class counter+=2; fi.super_cl=small(aa); offset[3]=counter; fread(aa, 2, 1, fp); //interface counter+=2; fi.inter_c=small(aa); if(fi.inter_c != 0) { iface = new int[fi.inter_c]; for(i=0; iname=small(aa); fread(aa, 4, 1, fp); counter+=4; cva->len=aa[2]*256+aa[3]; fread(aa, 2, 1, fp); counter+=2; cva->cvindex = small(aa); fld[i].attr_i=(void *)cva; } } offset[5]=counter; fread(aa, 2, 1, fp); //methods counter+=2; fi.meth_c=small(aa); meth *mth=new meth[fi.meth_c]; int jj; for( j=0; jx2, 2); strcpy(bb,signat(&sign)); sign++; strcpy(aa, rtype(&sign)); printf("%s ",aa); printf("%s.%s%s\n",get(((aaa *)p[i].info)->x1), get(((aaa *)p[i].info)->x2),bb); } } printf("\nMethods (Interfaced)\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); printf("* NA *\n\n"); printf("Fields (Accessed and/or Modified)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); for(i=0; i=0; k--) printf("%X", gguid[j].x1[k]); printf("-"); for(k=1; k>=0; k--) printf("%X", gguid[j].x2[k]); printf("-"); for(k=1; k>=0; k--) printf("%X", gguid[j].x3[k]); printf("-"); for(k=0; k<8; k++) printf("%X", gguid[j].x4[k]); printf("\n"); } printf("\n"); char *d3[] = { "ClassFile.magic ", "ClassFile.minor_version ", "ClassFile.major_version ", "ClassFile.constant_pool_count", "ClassFile.Constant_pool ", "ClassFile.access_flags ", "ClassFile.this_class ", "ClassFile.super_class ", "ClassFile.interfaces_count ", "ClassFile.interfaces", "ClassFile.fields_count ", "ClassFile.fields", "ClassFile.methods_count ", "ClassFile.methods ", "ClassFile.attributes_count ", "ClassFile.attributes " }; printf("*** jvm7 D3 Class/Interface Root Data Structures ***\n"); printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); printf("offset Bytes Field Name Meaning\n"); printf("~~~~~~~ ~~~~~~~~ ~~~~~~~~~~~~~~ ~~~~~~~~~~~\n"); int zz=offset[0]; printf("%06X CAFEBABE %s\n", zz, d3[0]); printf("%06X %04X \t%s\tDecimal (%d)\n",zz+=4, fi.verno1, d3[1], fi.verno1); printf("%06X %04X \t%s\tDecimal (%d)\n",zz+=2, fi.verno2, d3[2], fi.verno2); printf("%06X %04X \t%s\tDecimal (%d)\n",zz+=2, fi.cp_c, d3[3], fi.cp_c); printf("%06X \t\t%s\tcp\n", zz+=2, d3[4]); printf("%06X %04X \t%s\n", zz=offset[2], fi.a_flags, d3[5]); printf("%06X %04X \t%s\t%s\n", zz+=2, fi.this_cl, d3[6], get(fi.this_cl)); printf("%06X %04X \t%s\t%s\n", zz+=2, fi.super_cl, d3[7], get( fi.super_cl)); printf("%06X %04X \t%s\tDecimal (%d)\n", zz=offset[3], fi.inter_c, d3[8], fi.inter_c); printf("%06X \t\t%s\t\t\t interfaces\n", zz+=2, d3[9]); printf("%06X %04X \t%s\tDecimal (%d)\n", zz=offset[4], fi.field_c, d3[10], fi.field_c); printf("%06X \t\t%s\t\t\t fields\n", zz+=2, d3[11]); printf("%06X %04X \t%s\tDecimal (%d)\n", zz=offset[5], fi.meth_c, d3[11], fi.meth_c); printf("%06X \t\t%s\t\t\t Methods\n", zz+=2, d3[11]); printf("%06X %04X \t%s\tDecimal (%d)\n", zz=offset[6], fi.attr_c, d3[12], fi.attr_c); printf("%06X \t\t%s\tattributes\n\n", zz+=2, d3[13]); printf("*** jvm7 D3 Class/Interface Root Data Structures ***\n"); printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); printf("offset Bytes Field Name Meaning\n"); printf("~~~~~~~ ~~~~~~~~ ~~~~~~~~~~~~~~ ~~~~~~~~~~~\n"); zz=offset[1]; char cc[20]; for(i=1; ix; printf("%06X\t%04X\t\tcp[%04X].length\n", zz, j, i); zz+=2; printf("%06X\t\t\tcp[%04X].bytes\t\t%s\n\n", zz, i, ((bbb *)p[i].info)->ss); zz+=j; break; case 3 : case 4 : if(p[i].tag==3) printf("%06X\t%02X\t\tcp[%04X].tag\t\tCONSTANT_integer\n", zz, 3, i); else printf("%06X\t%02X\t\tcp[%04X].tag\t\tCONSTANT_float\n", zz, 4, i); zz++; j=((ccc *)p[i].info)->x1; printf("%06X\t%04X\t\tcp[%04X].bytes\n\n", zz, j, i); zz+=4; break; case 5 : case 6 : if(p[i].tag==5) printf("%06X\t%02X\t\tcp[%04X].tag\t\tCONSTANT_long\n", zz, 5, i); else printf("%06X\t%02X\t\tcp[%04X].tag\t\tCONSTANT_long\n", zz, 6, i); zz++; j=((ccc *)p[i].info)->x1; printf("%06X\t%04X\t\tcp[%04X].high_bytes\n\n", zz, j, i); zz+=4; j=((ccc *)p[i].info)->x1; printf("%06X\t%04X\t\tcp[%04X].low_bytes\n\n", zz, j, i); zz+=4; break; case 7 : printf("%06X\t%02X\t\tcp[%04X].tag\t\tCONSTANT_Class\n", zz, 7, i); zz++; j=((aaa *)p[i].info)->x1; printf("%06X\t%04X\t\tcp[%04X].name_index\t%s\n\n", zz, j, i, get(j)); zz+=2; break; case 8 : printf("%06X\t%02X\t\tcp[%04X].tag\t\tCONSTANT_Class\n", zz, 8, i); zz++; j=((aaa *)p[i].info)->x1; printf("%06X\t%04X\t\tcp[%04X].string_index\t%s\n\n", zz, j, i, get(j)); zz+=2; break; case 9 : case 10: case 11: if(p[i].tag==9) printf("%06X\t%02X\t\tcp[%04X].tag\t\tCONSTANT_Fieldref\n", zz, 9, i); else if(p[i].tag==10) printf("%06X\t%02X\t\tcp[%04X].tag\t\tCONSTANT_Methodref\n", zz, 10, i); else printf("%06X\t%02X\t\tcp[%04X].tag\t\tCONSTANT_InterfaceMethodref\n", zz, 11, i); zz++; j=((aaa *)p[i].info)->x1; printf("%06X\t%04X\t\tcp[%04X].class_index\t%s\n", zz, j, i, get(j)); zz+=2; j=((aaa *)p[i].info)->x2; printf("%06X\t%04X\t\tcp[%04X].name_&_type_index\t%s,%s\n\n", zz, j, i, get( j), get( j, 2)); zz+=2; break; case 12: printf("%06X\t%02X\tcp[%04X].tag\t\tCONSTANT_NameAndType\n", zz, 12, i); zz++; j=((aaa *)p[i].info)->x1; printf("%06X\t%04X\tcp[%04X].name_index\t%s\n", zz, j, i, get(j)); zz+=2; j=((aaa *)p[i].info)->x2; printf("%06X\t%04X\tcp[%04X].descriptor_index\t%s\n\n", zz, j, i, get(j)); zz+=2; break; } } printf("*** jvm7 D5 Class/Interface Fields Pool ***\n"); printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); zz=offset[4]+2; for(i=0; ilen+8; } printf("*** jvm7 D6 Class/Interface Methods Pool ***\n"); printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); zz=offset[5]+2; for(i=0; i