[comp.sources.amiga] xboot

ain@j.cc.purdue.edu (Patrick White) (08/02/88)

Submitted by:	inria.inria.fr!rouaix(Francois Rouaix)
Summary:	Converts teh sector dump of a boot block into an executable file.
Poster Boy:	Patrick White	(ain@j.cc.purdue.edu)
Archive Name:	sources/amiga/volume5/xboot.s.sh.Z
Tested.
 
NOTES:
   Docs are so small that I just packeged them in with the source and
binary shars.
   It was an arc, but is not a shar.
   I think I tried compiling it under Manx and it worked, but I forgot my
notes on that.
.
 
 
-- Pat White   (co-moderator comp.sources/binaries.amiga)
ARPA/UUCP: j.cc.purdue.edu!ain  BITNET: PATWHITE@PURCCVM  PHONE: (317) 743-8421
U.S.  Mail:  320 Brown St. apt. 406,    West Lafayette, IN 47906
[archives at: j.cc.purdue.edu.ARPA]
 
========================================
 
#	This is a shell archive.
#	Remove everything above and including the cut line.
#	Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:	Shell Archiver
#	Run the following text with /bin/sh to create:
#	xboot.doc
#	xboot.lnk
#	xboot.c
# This archive created: Mon Aug  1 12:24:11 1988
# By:	Patrick White (PUCC Land, USA)
cat << \SHAR_EOF > xboot.doc

   This is a VERY simple utility I felt I needed to study those nasty Viruses
hanging around...
   It converts a boot-block into an executable file, so you may use
   your favorite debugger (Wack, Dis, ...) to study it.

   SYNTAX: xboot infile outfile

   CAVEATS:
   <infile> should be exactly 1024 bytes long. It is normally the dump
   of blocks 0 and 1 of a floppy disk.

   DETAILS:
   The first three longwords of the boot-block are put in the second hunk
   (data hunk).
   All other data is thrown into the first hunk (code hunk).
   This has the disadvantage of breaking the PC-relative adressing for
   the data (like in ByteBandits virus).

   COMPILATION NOTES:
   I used standard AmigaDOS file functions, so that you may compile with
   amiga.lib before lc.lib, and have a smaller executable.

   DISTRIBUTION:
      Free ! This a Public Domain. Do whatever you want with this program.

   AUTHOR:
      Francois ROUAIX
      rouaix@inria.inria.fr


SHAR_EOF
cat << \SHAR_EOF > xboot.lnk
VERBOSE NODEBUG
FROM LIB:astartup.obj+xboot.o
TO xboot
LIB LIB:amiga.lib+LIB:lc.lib

SHAR_EOF
cat << \SHAR_EOF > xboot.c
/* Conversion of a boot-block in an executable */
/* Placed in Public Domain by Francois Rouaix in 1988 */

#include <libraries/dos.h>

char buffer[1024] ;
long header[12] = { 0x000003f3,   /* Hunk_Header */
                    0x00000000,   /* no hunk_name */
                    0x00000002,   /* size of hunk_table */
                    0x00000000,   /* first hunk */
                    0x00000001,   /* last hunk */
                    0x000000fd,   /* size of hunk 0 */
                    0x00000003,   /* size of hunk 1 */
                    0x000003e9,   /* hunk_code */
                    0x000000fd,   /* size of hunk_code = 253 */
                    /* end of header */
                    0x000003ea,   /* hunk_data */
                    0x00000003,   /* size */
                    /* end of header */
                    0x000003f2
                  } ;
/* xboot infile outfile */

main(argc,argv)
int argc;
char *argv[];
{
   struct FileHandle  *infile=0,*outfile=0 ;
   int b=0;

   if (argc != 3) {
      printf("Usage: %s infile outfile \n",argv[0]);
      Exit(0);
      }
   if (!(infile = (struct FileHandle *)Open(argv[1],MODE_OLDFILE))) {
      printf("Can't open %s\n",argv[1]);
      Exit(0);
      }
   if (!(outfile = (struct FileHandle *)Open(argv[2],MODE_NEWFILE))) {
      Close(infile);
      printf("Can't open %s\n",argv[2]);
      Exit(0);
      }
   b = Read(infile,&buffer[0],1024);
   if (b != 1024)  printf("Warning ! Bad File.\n");
   Close(infile);


   Write(outfile,(char *)&header[0],4*9);        /* header */
   Write(outfile,(char *)&buffer[12],4*253);     /* code */
   Write(outfile,(char *)&header[11],4);       /* hunk_end */
   Write(outfile,(char *)&header[9],4*2);        /* header for data */
   Write(outfile,(char *)&buffer[0],4*3);        /* data */
   Write(outfile,(char *)&header[11],4);       /* hunk_end */


  Close(outfile);
}


SHAR_EOF
#	End of shell archive
exit 0