93 lines
2.0 KiB
C
93 lines
2.0 KiB
C
|
/* Generic xor handler.
|
||
|
|
||
|
With no args, xors stdin against 0xFF to stdout. A single argument is a
|
||
|
file to read xor-bytes out of. Any zero in the xor-bytes array is treated
|
||
|
as the end; if you need to xor against a string that *includes* zeros,
|
||
|
you're on your own.
|
||
|
|
||
|
The indirect file can be generated easily with data.c.
|
||
|
|
||
|
Written because there are so many lame schemes for "masking" plaintext
|
||
|
passwords and the like floating around, and it's handy to just run an
|
||
|
obscure binary-format configuration file through this and look for strings.
|
||
|
|
||
|
*Hobbit*, 960208 */
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <fcntl.h>
|
||
|
|
||
|
char buf[8192];
|
||
|
char bytes[256];
|
||
|
char * py;
|
||
|
|
||
|
/* do the xor, in place. Uses global ptr "py" to maintain "bytes" state */
|
||
|
xorb (buf, len)
|
||
|
char * buf;
|
||
|
int len;
|
||
|
{
|
||
|
register int x;
|
||
|
register char * pb;
|
||
|
|
||
|
pb = buf;
|
||
|
x = len;
|
||
|
while (x > 0) {
|
||
|
*pb = (*pb ^ *py);
|
||
|
pb++;
|
||
|
py++;
|
||
|
if (! *py)
|
||
|
py = bytes;
|
||
|
x--;
|
||
|
}
|
||
|
} /* xorb */
|
||
|
|
||
|
/* blah */
|
||
|
main (argc, argv)
|
||
|
int argc;
|
||
|
char ** argv;
|
||
|
{
|
||
|
register int x = 0;
|
||
|
register int y;
|
||
|
|
||
|
/* manually preload; xor-with-0xFF is all too common */
|
||
|
memset (bytes, 0, sizeof (bytes));
|
||
|
bytes[0] = 0xff;
|
||
|
|
||
|
/* if file named in any arg, reload from that */
|
||
|
#ifdef O_BINARY /* DOS shit... */
|
||
|
x = setmode (0, O_BINARY); /* make stdin raw */
|
||
|
if (x < 0) {
|
||
|
fprintf (stderr, "stdin binary setmode oops: %d\n", x);
|
||
|
exit (1);
|
||
|
}
|
||
|
x = setmode (1, O_BINARY); /* make stdout raw */
|
||
|
if (x < 0) {
|
||
|
fprintf (stderr, "stdout binary setmode oops: %d\n", x);
|
||
|
exit (1);
|
||
|
}
|
||
|
#endif /* O_BINARY */
|
||
|
|
||
|
if (argv[1])
|
||
|
#ifdef O_BINARY
|
||
|
x = open (argv[1], O_RDONLY | O_BINARY);
|
||
|
#else
|
||
|
x = open (argv[1], O_RDONLY);
|
||
|
#endif
|
||
|
if (x > 0) {
|
||
|
read (x, bytes, 250); /* nothin' fancy here */
|
||
|
close (x);
|
||
|
}
|
||
|
py = bytes;
|
||
|
x = 1;
|
||
|
while (x > 0) {
|
||
|
x = read (0, buf, sizeof (buf));
|
||
|
if (x <= 0)
|
||
|
break;
|
||
|
xorb (buf, x);
|
||
|
y = write (1, buf, x);
|
||
|
if (y <= 0)
|
||
|
exit (1);
|
||
|
}
|
||
|
exit (0);
|
||
|
}
|
||
|
|