Home | History | Annotate | Download | only in data
      1 /* Generic xor handler.
      2 
      3    With no args, xors stdin against 0xFF to stdout.  A single argument is a
      4    file to read xor-bytes out of.  Any zero in the xor-bytes array is treated
      5    as the end; if you need to xor against a string that *includes* zeros,
      6    you're on your own.
      7 
      8    The indirect file can be generated easily with data.c.
      9 
     10    Written because there are so many lame schemes for "masking" plaintext
     11    passwords and the like floating around, and it's handy to just run an
     12    obscure binary-format configuration file through this and look for strings.
     13 
     14    *Hobbit*, 960208 */
     15 
     16 #include <stdio.h>
     17 #include <fcntl.h>
     18 
     19 char buf[8192];
     20 char bytes[256];
     21 char * py;
     22 
     23 /* do the xor, in place.  Uses global ptr "py" to maintain "bytes" state */
     24 xorb (buf, len)
     25   char * buf;
     26   int len;
     27 {
     28   register int x;
     29   register char * pb;
     30 
     31   pb = buf;
     32   x = len;
     33   while (x > 0) {
     34     *pb = (*pb ^ *py);
     35     pb++;
     36     py++;
     37     if (! *py)
     38       py = bytes;
     39     x--;
     40   }
     41 } /* xorb */
     42 
     43 /* blah */
     44 main (argc, argv)
     45   int argc;
     46   char ** argv;
     47 {
     48   register int x = 0;
     49   register int y;
     50 
     51 /* manually preload; xor-with-0xFF is all too common */
     52   memset (bytes, 0, sizeof (bytes));
     53   bytes[0] = 0xff;
     54 
     55 /* if file named in any arg, reload from that */
     56 #ifdef O_BINARY				/* DOS shit... */
     57   x = setmode (0, O_BINARY);		/* make stdin raw */
     58   if (x < 0) {
     59     fprintf (stderr, "stdin binary setmode oops: %d\n", x);
     60     exit (1);
     61   }
     62   x = setmode (1, O_BINARY);		/* make stdout raw */
     63   if (x < 0) {
     64     fprintf (stderr, "stdout binary setmode oops: %d\n", x);
     65     exit (1);
     66   }
     67 #endif /* O_BINARY */
     68 
     69   if (argv[1])
     70 #ifdef O_BINARY
     71     x = open (argv[1], O_RDONLY | O_BINARY);
     72 #else
     73     x = open (argv[1], O_RDONLY);
     74 #endif
     75   if (x > 0) {
     76     read (x, bytes, 250);		/* nothin' fancy here */
     77     close (x);
     78   }
     79   py = bytes;
     80   x = 1;
     81   while (x > 0) {
     82     x = read (0, buf, sizeof (buf));
     83     if (x <= 0)
     84       break;
     85     xorb (buf, x);
     86     y = write (1, buf, x);
     87     if (y <= 0)
     88       exit (1);
     89   }
     90   exit (0);
     91 }
     92 
     93