/* * * Object information utility Version 1.0 16-apr-1990 * Arguments are: * Oinfo ... . * Description: * This utility will read an object (from the Lattice Compiler) and * decode the Hunks and informations comtained in the Hunks. * * Options: * -m : Decode a block of memory * -v : Decode boot block dump (check virus code) * -s : symbols supressed * -d : data words supressed * -c : code words supressed * */ #include #include "hunk.h" #include int Flgs[26]; /* user options */ void main(int, char **); void main(argc, argv) int argc; /*number of arguments */ char *argv[]; /*array of ptrs to arg strings */ { BPTR file1; /* input File pointer */ char *name1; int i; long addrs; short More_Stuff; int Header[3]; /* Hunk type and size in words */ /* get the file names and open the files */ /* initialize input buffers and variables*/ addrs = 0; Do_Arguments(argc, argv,&addrs); fprintf(stderr," \tObject/Executable/Library Disassembler\n"); fprintf(stderr," \tVersion 2.0 © 1991 Custom Services\n"); fprintf(stderr," \t\t***All Rights Reserved***\n"); fprintf(stderr," \t\tShareware donation:$5.00\n"); fprintf(stderr," \t\tCustom Services\n"); fprintf(stderr," \t\tP. O. Box 254\n"); fprintf(stderr," \t\tMoorestown, NJ 08057\n"); file1 = NULL; if ( argc < 2 ) { printf(" Format is:\n%s [-c -d -s -v -m
] ... \n",argv[0]); exit(10); }; /* collect the data */ while (--argc > 0 ) /* while files to process */ { if( file1 != NULL) { Close( file1); file1 = NULL; }; name1 = *++argv; /* get a file name? */ if ( *name1 == '-' )continue; /* skip options */ printf("\n Processing: %s\n",name1); file1 = Open(name1,MODE_OLDFILE); /* open file for reading */ if ( file1 == NULL ) { printf(" Cannot Open Object file: %s\n",name1); break; }; /* read the entries and decode data */ More_Stuff = TRUE; if( ! Flgs[21] ) /* regular if no -V or -M
*/ { while ( More_Stuff ) { Header[0] = ( GrabLong(file1) & 0x0000FFFF ); switch ( Header[0] ) { case 0 : /* end of file */ More_Stuff = FALSE; break; case Hunk_End : /* end of a Hunk */ printf("Hunk_End(3F2)\n"); break; case Hunk_Code : /* 3e9 */ Header[0] = GrabLong(file1); /* get length of code */ printf("Hunk_Code(3E9) :%d words\n",Header[0]); Dump_Code(file1, Header[0]); break; case Hunk_Data : case Hunk_Bss : Header[1] = GrabLong(file1); switch ( Header[0] ) { case Hunk_Data : printf("Hunk_Data(3EA) :"); break; case Hunk_Bss : printf("Hunk_Bss (3EB) :"); break; }; printf("%d words\n",Header[1]); if( Header[0] != Hunk_Bss )Dump_Raw(file1,Header[0],Header[1]); break; case Hunk_Debug: /* debug hunks */ Header[1] = GrabLong(file1); printf(" Hunk_Debug(3F1):(%d words)",Header[1]); Header[0] = GrabLong(file1); Header[1] = Header[1] - Header[0] - 1; Do_Name(file1,Header[0]); More_Stuff = Dump_Raw(file1,Header[0],Header[1]); break; case Hunk_Name : case Hunk_Unit : Header[1] = GrabLong(file1); switch ( Header[0] ) { case Hunk_Unit :printf("Hunk_Unit(3E7"); break; case Hunk_Name :printf("Hunk_Name(3E8"); break; }; Do_Name(file1,Header[1]); break; case Hunk_Dreloc32: case Hunk_Dreloc16: case Hunk_Dreloc8 : case Hunk_Reloc32 : case Hunk_Reloc16 : case Hunk_Reloc8 : Header[1] = GrabLong(file1); while( Header[1] != 0 && More_Stuff) { (void) Read(file1,(char *)&i,4); switch ( Header[0] ) { case Hunk_Dreloc32 : printf("Hunk_Dreloc32");break; case Hunk_Dreloc16 : printf("Hunk_Dreloc16");break; case Hunk_Dreloc8 : printf("Hunk_Dreloc8 ");break; case Hunk_Reloc32 : printf("Hunk_Reloc32 ");break; case Hunk_Reloc16 : printf("Hunk_Reloc16 ");break; case Hunk_Reloc8 : printf("Hunk_Reloc8 ");break; }; printf(" Hunk %d, %d words\n",i,Header[1]); More_Stuff = Dump_Raw(file1,Hunk_Code,Header[1]); Header[1] = GrabLong(file1); }; break; case Hunk_Ext: printf("Hunk_Ext(3EF):\n"); DoSymbolData(file1); break; case Hunk_Symbol: printf("Hunk_Symbol(3F0):\n"); DoSymbolData(file1); break; case Hunk_Library: printf("Hunk_Library(3FA)\n"); printf(" Value = %x\n",GrabLong(file1)); break; case Hunk_Break: printf("Hunk_Break(3F6)\n"); break; case Hunk_Overlay: printf("Hunk_Overlay(3F5)\n"); Header[1] = GrabLong(file1); printf("%d words\n",Header[1]); Dump_Raw(file1,Header[0],Header[1]); break; case Hunk_Index: printf("Hunk_Index(3FB)\n"); Header[1] = GrabLong(file1); printf("%d words\n",Header[1]); Dump_Raw(file1,Header[0],Header[1]); break; case Hunk_Header: printf("Hunk_Header(3F3)\n"); Header[1] = GrabLong(file1); if( Header[1] == 0) { printf(" No Resident Libraries to open\n"); } else while( Header[1] != 0 && More_Stuff) { Do_Name(file1,Header[1]); Header[1] = GrabLong(file1); }; for( i=0; i<3; i++) Header[i] = GrabLong(file1); printf(" %d Hunks, Number %d thru %d\n", Header[0], Header[1], Header[2]); Dump_Raw(file1,Hunk_Code,Header[0]); break; default: printf( "Hunk type = %x\n",Header[0]); }; }; } else if( Flgs[21] ) { Dump_Virus(file1); /* if not regular then virus */ }; }; if( file1 != NULL) Close( file1); if( Flgs[12] ) { printf("Memory Dump as Code Hunk:60 bytess\n"); (void)dumpcode(addrs,(char *)addrs,60); /* dump the code */ }; } void Dump_Text(tptr,count) char *tptr; int count; { short t; for( t=0; t < count; t++) { tptr[t] = 0x7f & tptr[t]; if( tptr[t] > 20 ) { printf("%c",tptr[t]); } else printf("."); }; printf("\n"); } Dump_Raw(file,Type,Words) BPTR file; int Type,Words; { char *Data; char *tptr; int *k; short More_Stuff,i,j; if( Words == 0)return(0); Data = malloc(Words*4); /*get a large enough buffer */ if( Data == 0 ) { printf(" Memory not allocated for buffer:%d\n"); exit(0); }; More_Stuff = Read(file,Data,Words*4) == Words*4 ; i = j = 0; if( ( Flgs[2] && Type == Hunk_Code ) || ( Flgs[3] && (Type == Hunk_Data || Type == Hunk_Debug) ) ) { free(Data); return((int)More_Stuff); }; while ( i < Words ) { k = (int *)&Data[i*4]; if ( i++ < Words)printf("%08.08X ",*k); if( ++j % 5 == 0) { tptr = &Data[(i-5)*4]; Dump_Text(tptr,20); }; }; if( j % 5 != 0) { tptr = &Data[(i-5)*4]; Dump_Text(tptr,20); }; free(Data); return ((int)More_Stuff); } Do_Name(file,Words) int Words; BPTR file; { char *Data; printf("[%d words])",Words); if( Words > 100 || Words < 1) { printf("\n"); return ( 0 ); }; Data = malloc(Words*4); if( Data == 0) { printf(" Memory not allocated for name:%d\n",Words); exit(10); }; (void)Read(file,Data,Words*4); printf("%s\n",Data); free(Data); return(0); } Dump_Code(file,Words) BPTR file; int Words; { char *Data; /* pointer to data */ short More_Stuff; if( Words == 0)return(0); Data = malloc(Words*4); /*get a large enough buffer */ if( Data == 0 ) { printf(" Memory not allocated for buffer:%d\n"); exit(10); }; More_Stuff = Read(file,Data,Words*4) == Words*4 ; if( ! Flgs[2] ) { (void)dumpcode((int)Data,Data,Words*4); }; free(Data); return ((int)More_Stuff); } Dump_Virus(file) /* dump virus block code */ BPTR file; { char *Data; /* pointer to data */ short More_Stuff; int Words = 253; /* preset the size */ Data = malloc(Words*4); /*get a large enough buffer to hold the virus */ if( Data == 0 ) { printf(" Memory not allocated for buffer:%d\n"); exit(10); }; printf(" Boot Block Header:\n"); Dump_Raw(file,Hunk_Data,3); More_Stuff = Read(file,Data,Words*4) == Words*4 ; if( ! Flgs[2] ) { (void)dumpcode((int)Data,Data,Words*4); /* dump the code */ }; free(Data); return ((int)More_Stuff); }