Source Code - Disassembler


source.cpp

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<alloc.h>
#include<stdlib.h>
#include<stdarg.h>
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;//Currently only 1 "Source file attr"
  void *attr_i;
  };

struct sfile
{
  int name;
  int len;
  int s;
  };

struct meth
{
  int a_flag;
  int name;
  int sign;
  int attr_c;
  void *attr_i;  //code_info
  };

struct cinfo
{
  int name;
  int len;
  int stack;
  int local;
  int c_len;
  unsigned char *code;
  int ex_len;
  void *ex; // Right now it is not stored, Skipped
  int attr_c;
  void *attr_i; //Right now only LNT
 };

struct lnt
{
  int name;
  int len;        //Right now Line no. table is skipped
  };

int small( char *ss )
{
        return (((int)ss[0])<<8)+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("z1.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;
  }
}

void cview(meth);
void method (unsigned char *,int, int *, char **, int&);
void arrange( char * );
int catstr( char *msg, ...)
{
 va_list ap;
 char *arg; int len=0;
 arg=new char[50];
 va_start(ap, msg);
 strcpy(arg, va_arg(ap, char *));
 while(strcmp(arg,"\0"))
 {
  len+=strlen(arg);
  strcat(msg, arg);
  strcpy(arg, va_arg(ap, char *));
  }
  va_end(ap);
  return len;
}

int main(int argc, char *argv[])
{
FILE *fp;
file fi;
fp = fopen(argv[1],"r+b");
if(fp==NULL)
 {
	printf("Unable to open input file\n");
	exit(0);
	}
char aa[40], bb[100];

fread(aa,8,1,fp);  //Skip CAFEBABE, Ver nos

fread(aa,2,1,fp); //Constant pool size
fi.cp_c=small(aa);
sprintf(bb, "Count=%d\n", fi.cp_c);
abc(bb);
p = new pool_info[fi.cp_c];
int i;
//Store sections in class pool
for ( int j=1; j<fi.cp_c; j++)
{
	 i = fgetc(fp);
 switch(i)
 {
	 case 1:
	 bbb *s = new bbb;
	 fread(aa,2,1,fp);
         s->x=small(aa);
         fread(aa, s->x, 1, fp);
         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);
         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);
         tem2->x1 = aa[2]*256+aa[3];
	 fread(aa,4,1,fp);
         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);
         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);
         temp1->x1=small(aa);
	 fread(aa,2,1,fp);
         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;

  }
}

fread(aa, 2, 1, fp);   //Flags
fi.a_flags = small(aa);

fread(aa, 2, 1, fp);   //this_class
fi.this_cl=small(aa);

fread(aa, 2, 1, fp);   //super_class
fi.super_cl=small(aa);

//Assumed to be zero
fread(aa, 2, 1, fp);   //interface
fi.inter_c=small(aa);

//zero fields
fread(aa, 2, 1, fp);   //fields
fi.field_c=small(aa);

fread(aa, 2, 1, fp);   //methods
fi.meth_c=small(aa);

meth *mth=new meth[fi.meth_c];

int jj;
for( j=0; j<fi.meth_c; j++ )
{
 fread ( aa, 2, 1, fp);
 mth[j].a_flag=small(aa);

 fread(aa, 2, 1, fp);
 mth[j].name=small(aa);

 fread(aa, 2, 1, fp);
 mth[j].sign=small(aa);

 //Only attribute is Code Attribute
 fread(aa, 2, 1, fp);
 mth[j].attr_c=small(aa);

 cinfo *temp2;
 temp2 = new cinfo;
 //attr name will be always be Code
 fread(aa, 2, 1, fp);
 temp2->name=small(aa);

 fread(aa, 4, 1, fp);
 temp2->len=aa[2]*256+aa[3];

 fread(aa, 2, 1, fp);
 temp2->stack=small(aa);

 fread(aa, 2, 1, fp);
 temp2->local=small(aa);

 fread(aa, 4, 1, fp);
 temp2->c_len=aa[2]*256+aa[3];
 temp2->code=new unsigned char[temp2->c_len];

 for( i=0; i<temp2->c_len; i++ )
          temp2->code[i]=fgetc(fp);

 //zero exception
 fread(aa, 2, 1, fp);
 temp2->ex_len=small(aa);

 fread(aa, 2, 1, fp);
 temp2->attr_c=small(aa);
 if(temp2->attr_c>0)
 {
 lnt *temp3;
 temp3=new lnt;

 fread(aa, 2, 1, fp);
 temp3->name=small(aa);

 fread(aa, 4, 1, fp);
 temp3->len=aa[2]*256+aa[3];

 //Skip Line No. Table
 for( i=0; i<temp3->len; i++ )
	 fgetc(fp);
 temp2->attr_i=(void *)temp3;
 }
 mth[j].attr_i=(void *)temp2;
}

//attr_count=1 for Source File
fread(aa, 2, 1, fp);
fi.attr_c=small(aa);

sfile *sf;
sf = new sfile;

fread(aa, 2, 1, fp);
sf->name=small(aa);

fread(aa, 4, 1, fp);
sf->len=aa[2]*256+aa[3];

fread(aa, 2, 1, fp);
sf->s = small(aa);

fi.attr_i = (void *) sf;
fclose(fp);
//***Output data
// output.cpp
//*****
for(i=0; i<fi.meth_c; i++)
	  cview(mth[i]);

return 0;
}


int methsign(int,int, char* );

char *v(char c, int ii)
{
	char aa[20]; char temp[20];
	if( c == 'i')
		strcpy(aa, "ii");
	else if( c == 'o' )
		strcpy(aa, "oo");
	itoa(ii, temp, 10);
	strcat(aa, temp);
	return aa;
}

void cview(meth mi)
{
	char proto[100];
        int len=((cinfo *)mi.attr_i)->c_len;
	unsigned char *c=new unsigned char[len];
        for(int i=0; i<len; i++)
                 c[i]=((cinfo *)mi.attr_i)->code[i];
	printf("\n");
	//function with sign
	methsign( mi.name, mi.sign, proto );
	printf("\n");
	printf("%s\n", proto);
	printf("{\n");
	char **code;   //Send as argument
	*code=new (char *)[250];
        for(i=0; i<50; i++)
		code[i]=new char[50];
	int *var=new int[50]; //As arg
        for(i=0; i<50; i++)
		 var[i]=0;
//	var[0]=1;
	int ii=0;
	method(c, len, var, code, ii);

	i=1;   char aa[50];
  while(var[i]!=0)
	 {
		 printf("int ");
		 strcpy(aa, v('i',i));
		 printf("%s;\n", aa);
		 i++;
		 }
  for(i=0; i<ii; i++)
		printf("%s\n", code[i]);
}

void method(unsigned char *c, int len, int *var, char **code, int &ii)
{
	char stack[80];
	int offset;
	unsigned char *lc;
	int i=0;//pointer in stack
	int cc=0;//Count Bytes
	int r; char p[20];  int k;
        while(cc<len)
	{
	 switch( c[cc] )
	  {
                case 3 :  //Push integer const 0-5 (iconst_<n>
		case 4 :
		case 5 :
		case 6 :
		case 7 :
		case 8 :
				  r=c[cc]-3+48;
				  stack[i++]=r;
				  stack[i++]=' ';
				  break;
		case 16 : //Push one byte signed integer (bipush,byte1)
				  r=c[++cc];
				  itoa(r, p, 10);
				  stack[i]='\0';
				  i+=catstr(stack,p," ","\0");
				  break;
                case 59 ://Integer Variable (istore_<n>)  LHS
		case 60 :
		case 61 :
		case 62 :
                case 75 ://Objects Variable (astore_<n>)  LHS
		case 76 :
		case 77 :
		case 78 :
                                        if(c[cc] <=62)
						{r=c[cc]-59;
						 if(var[r]==0 || var[r]==2)
							 var[r]=1;
						 strcpy(code[ii], v('i',r));
						 }
					else
						{r=c[cc]-75; strcpy(code[ii], v('o',r));}
					stack[i]='\0';
					arrange(stack);
					catstr(code[ii], "=", stack, ";", "\0");
					i=0;ii++;
					break;
		case 54 ://Integer variable (istore, vindex)  LHS
		case 58 ://Object variable (astore, vindex)   LHS
					cc++;
					r=c[cc];  //vindex
					stack[i]='\0';
					arrange(stack);
					if(c[cc-1]==54)
					  {
						 if(var[r]==0 || var[r]==2)
							 var[r]=1;
						 strcpy(code[ii], v('i',r));
						 }
					else
						 strcpy(code[ii], v('o',r));
						 catstr(code[ii], "=", stack, ";", "\0");
					i=0; ii++;
					break;
                case 26 ://Load integer variable on stack (iload_<n>) RHS
		case 27 :
		case 28 :
		case 29 :
                case 42 ://Load object variable on stack (aload_<n>) RHS
		case 43 :
		case 44 :
		case 45 :
                                        if(c[cc]<=29)
						 {r=c[cc]-26; strcpy(p, v('i',r));}
					else
						 {r=c[cc]-42; strcpy(p, v('o',r));}
					stack[i]='\0';
					i+=catstr(stack, p, " ", "\0");
					break;
		case 21 : //iload,vindex  RHS
		case 25 : //aload,vindex  RHS
					cc++;
					r=c[cc]; //Vindex
					if(c[cc-1]==21)
						strcpy(p, v('i',r));
					else
						strcpy(p, v('o',r));
					stack[i]='\0';
					i+=catstr(stack, p, " ", "\0");
					break;
		case 96 :  // +
		case 104 : // *
		case 100 : // -
		case 108 : // /
					if(c[cc] == 96)
						stack[i]='+';
					else if(c[cc] == 104)
						stack[i]='*';
					else if(c[cc] == 100)
						stack[i]='-';
					else
						stack[i]='/';
					i++;
					stack[i]=' ';i++;
					break;
		case 18 ://Push item from constant pool (ldc1, indexbyte1)
					cc++;
					r=c[cc];
					stack[i]='\0';
					i+=catstr(stack, get(r), " ", "\0");
					break;
		case 176 :   //Return Object (areturn)
					 *(stack+i)='\0';
					 strcpy(code[ii],"\0");
					 catstr(code[ii], "return", stack, ";", "\0");
					 i=0; ii++;
					 break;
		case 167 :
					  strcpy(p, code[--ii]);
					  strcpy(code[ii], "\0");
					  catstr(code[ii], "for(",p,"\0");
					  k=ii; //Store line no. where for loop starts(to write cond. etc
					  cc++; ii++;
					  offset=c[++cc]; //256*c[cc]+c[++cc]
					  lc=new unsigned char[offset-3];
                                          for (i=0; i<offset-3; i++)
							lc[i]=c[++cc];
					  method(lc, offset-3, var, code, ii);
					  i=0;
					  break;
		case 161 :
		case 163 :
					  if(c[cc] == 161)
                                                  stack[i++] = '<';
					  else
                                                  stack[i++] = '>';
					  stack[i]='\0';
					  arrange(stack);
					  catstr(code[k], stack, ";","\0");
					  ii--;ii--;
					  strcpy(p, code[ii]);
					  strcpy(code[ii], "}"); ii++;
					  catstr(code[k], p,"){","\0");
					  cc++; cc++;  i=0;
					  break;
                case 162 : // >= i.e. <
                case 164 : // <= i.e. >
					  strcpy(code[ii], "if(");
					  stack[i]='\0';
					  if(c[cc] == 162)
                                                        strcat(stack, "< ");
					  else
                                                        strcat(stack, "> ");
					  arrange(stack);
					  catstr(code[ii], stack, "){", "\0");
					  ii++;  cc++;
					  offset=c[++cc]; //256*c[cc]+c[cc+1]
					  lc=new unsigned char[offset-3];
                                          for (i=0; i<offset-3; i++)
							lc[i]=c[++cc];
					  method(lc, offset-3, var, code, ii);
					  i=0;
					  break;
		case 132 :
					  cc++;
					  r=c[cc];
					  strcpy(p, v('i',r));
					  stack[i]='\0';
					  i+=catstr(stack, p,"\0");
					  cc++;
					  r=c[cc];
					  *(stack+i)='+';i++;
					  *(stack+i)='+';i++;
					  *(stack+i)='\0';
					  strcpy(code[ii], stack);
					  i=0; ii++;
					  break;
	  }
	  cc++;
	}
  strcpy(code[ii], "}");
  ii++;
/*  i=1; printf("int ");
  char aa[50];
  while(var[i]!=0)
	 {
		 strcpy(aa, v('i',i));
		 printf("%s,", aa);
		 i++;
		 }
  printf("\n");
  for(i=0; i<ii+1; i++)
	  printf("%s\n", code[i]);*/
}

//convert from Djikstra's Algorithm
void arrange( char *ss )
{
  int i=0;//increment ss by i
  char var1[20], var2[20];
  char temp[30]; //local
  char ii; //store byte of ss
  int next=0; //check if ->varible or operator
  int check=0; //check :a*b+b*c ->ab*bc*+
  int k=0;
  while ((ii=*(ss+i)) != '\0')
  {
		if(ii == 32)
		  { next++; k=0; i++;
			 if((ii=*(ss+i)) == '\0')
			  {
				 strcpy(temp, var1);
				 break;
				 }
		  }
		if(!next)
		  { var1[k] = ii; k++; var1[k] = '\0';}
		else
		  if(next==1)
		  { var2[k] = ii; k++; var2[k] = '\0'; }
	  else  //var1+operator+var2
		 {
			if(!check)
				strcpy(temp, var1);
			else
                          {      //var1+operator+var2 -> var2
				 char aa[20];
				 k=0;
				 while( *(var1+k) != '\0')
				 { k++; }
				 var1[k]=ii; var1[k+1]='\0';
				 strcat(var1, var2);
				 strcpy(var2, var1);
				 i++; i++;
				 ii=*(ss+i);
				 }
			k=0;
			while( *(temp+k) != '\0')
			{ k++; }
                        if( ii!='+' && ii!='-' && ii!='/' && ii!='*' && ii!='<' && ii!='>')
			{
			  strcpy(var1, var2);
			  next=1;k=0;
			  check=1;
			  continue;
			}
			*(temp+k) = ii; *(temp+k+1)='\0';
			strcat(temp, var2);
//			var1[0] = '('; var1[1]='\0';
			strcpy(var1, temp);
/*			k=0;
			while( *(var1+k) != '\0')
			{ k++; }
			var1[k]=')'; var1[k+1]='\0';*/
			next=0; check=0;
		 }
	  i++;
  }
  strcpy( ss, temp);
}

char* rtype( char *, int );

int methsign(int x, int y, char *ss )
{
  char name[50], *sign;
  sign = new char[100];
  strcpy(name, get(x));
  strcat(name, "(");
  sign= get(y);
  sign++; int check=0; int r=1;
  while(*sign != ')')
  {
	  strcat(name, rtype( sign, r ));
	  sign++; r++;
	  if( *sign != ')')
		 strcat(name, ",");
  }
  strcat(name, ")");
  sign++;
  char temp[100];
  strcpy(temp, name);
  strcpy(name, rtype(sign, -1));
  strcat(name, temp);
  strcpy(ss,name);
}

char* rtype( char *ss, int r )    //Return type & arg
{
	char aa[20];  int i;
	switch(*ss)
	  {
		 case 'I' :
					  strcpy(aa, "int ");
					  if(r!=-1)
						 strcat(aa, v('i',r));
					  break;
		 case 'V' :
					  strcpy(aa, "void ");
					  break;
		 case 'D' :
					  strcpy(aa, "double ");
					  if(r=-1)
						  strcat(aa, v('i',r));
					  break;
		 case 'L' :
					  ss++; i=0;
					  while(*ss != ';')
					  { if(*ss == '/')
							i=0;
						 else
						  { aa[i]=*ss; i++; }
						 ss++;
					  }
					 aa[i]=' ';
					 aa[i+1]='\0';
					 break;

	  }
	  return aa;
}

Download the Project Files


Back to the main page


Vijay Mukhi's Computer Institute
VMCI, B-13, Everest Building, Tardeo, Mumbai 400 034, India
Tel : 91-22-496 4335 /6/7/8/9     Fax : 91-22-307 28 59
e-mail : vmukhi@giasbm01.vsnl.net.in
http://www.vijaymukhi.com