[1] | 1 |
|
---|
| 2 | /* #include "config.h" */
|
---|
| 3 |
|
---|
| 4 |
|
---|
| 5 | #include <stdio.h>
|
---|
| 6 | #include <stdlib.h>
|
---|
| 7 |
|
---|
| 8 | int main(int argv, char * argc[])
|
---|
| 9 | {
|
---|
| 10 | int xor_base = -1;
|
---|
| 11 |
|
---|
| 12 | FILE * inf;
|
---|
| 13 | FILE * ouf;
|
---|
| 14 | char a, b;
|
---|
| 15 | int i, j;
|
---|
| 16 | char outfile[1024];
|
---|
| 17 | int inbracket = 0, quoted = 0;
|
---|
| 18 | unsigned long count;
|
---|
| 19 |
|
---|
| 20 |
|
---|
| 21 | /* char command[1024]; */
|
---|
| 22 |
|
---|
| 23 | if ( argv < 3)
|
---|
| 24 | {
|
---|
| 25 | fprintf(stderr,"\nUsage: encode <XOR_VAL> "\
|
---|
| 26 | "<file>\n\n");
|
---|
| 27 | fprintf(stderr," This program will:\n");
|
---|
| 28 | fprintf(stderr," - take as input a source code file <file>,\n");
|
---|
| 29 | fprintf(stderr," - search for literal strings inclosed by _(), "\
|
---|
| 30 | "like '_(string)',\n");
|
---|
| 31 | fprintf(stderr," - replace _(string) by "\
|
---|
| 32 | "_(string XOR <XOR_VAL>),\n");
|
---|
| 33 | fprintf(stderr,
|
---|
| 34 | " - and output the result to './x_<file>'.\n\n");
|
---|
| 35 | fprintf(stderr," _() is supposed to be defined as a macro in "\
|
---|
| 36 | "the code, that\n");
|
---|
| 37 | fprintf(stderr," will allow the program to decode the xor'ed string "\
|
---|
| 38 | "at runtime.\n");
|
---|
| 39 | fprintf(stderr," The effect is that the compiled executable does "\
|
---|
| 40 | "not contain literal\n");
|
---|
| 41 | fprintf(stderr," strings that may trivially be found with the Unix "\
|
---|
| 42 | "'strings' command,\n");
|
---|
| 43 | fprintf(stderr," and thus reveal the nature of "\
|
---|
| 44 | "the program.\n");
|
---|
| 45 |
|
---|
| 46 | return -1;
|
---|
| 47 | }
|
---|
| 48 |
|
---|
| 49 | --argv; ++argc;
|
---|
| 50 |
|
---|
| 51 | xor_base = atoi(argc[0]);
|
---|
| 52 |
|
---|
| 53 | if (xor_base < 0 || (xor_base > 0 && xor_base < 128) || xor_base > 255)
|
---|
| 54 | {
|
---|
| 55 | fprintf(stderr, "\nERROR: encode: XOR_VAL=%d is out of "\
|
---|
| 56 | "range (0, 128..255)\n",
|
---|
| 57 | xor_base);
|
---|
| 58 | fprintf(stderr, "** please follow these steps to fix the problem:\n\n");
|
---|
| 59 | fprintf(stderr, " make clean\n");
|
---|
| 60 | fprintf(stderr, " ./configure [more options] "\
|
---|
| 61 | "--with-stealth=XOR_VAL (range 0, 128..255)\n");
|
---|
| 62 | fprintf(stderr, " make\n\n");
|
---|
| 63 | return -1;
|
---|
| 64 | }
|
---|
| 65 |
|
---|
| 66 | /* fprintf(stderr, "<XOR_CODE> %d\n", xor_base); */
|
---|
| 67 |
|
---|
| 68 | --argv; ++argc;
|
---|
| 69 |
|
---|
| 70 | /* fprintf(stderr, "File: %d\n", argv); */
|
---|
| 71 |
|
---|
| 72 | while (argv > 0)
|
---|
| 73 | {
|
---|
| 74 | inf = fopen(argc[0], "r");
|
---|
| 75 | if (inf == NULL)
|
---|
| 76 | {
|
---|
| 77 | fprintf(stderr, "Error opening %s\n", argc[0]);
|
---|
| 78 | return -1;
|
---|
| 79 | }
|
---|
| 80 | /* outfile name
|
---|
| 81 | */
|
---|
| 82 | i = 0; j = 0;
|
---|
| 83 | while (argc[0][i] != '\0')
|
---|
| 84 | {
|
---|
| 85 | if (argc[0][i] == '/') j = i+1;
|
---|
| 86 | ++i;
|
---|
| 87 | }
|
---|
| 88 | i = 0;
|
---|
| 89 | outfile[0] = 'x';
|
---|
| 90 | outfile[1] = '_';
|
---|
| 91 | outfile[2] = '\0';
|
---|
| 92 | while (argc[0][j+i] != '\0')
|
---|
| 93 | {
|
---|
| 94 | outfile[i+2] = argc[0][j+i];
|
---|
| 95 | ++i;
|
---|
| 96 | }
|
---|
| 97 | outfile[i+2] = '\0';
|
---|
| 98 | ouf = fopen(outfile, "w");
|
---|
| 99 | if (ouf == NULL)
|
---|
| 100 | {
|
---|
| 101 | fprintf(stderr, "Error opening %s\n", outfile);
|
---|
| 102 | return -1;
|
---|
| 103 | }
|
---|
| 104 |
|
---|
| 105 | /* fprintf(stderr, "File: %s\n", argc[0]); */
|
---|
| 106 | count = 0;
|
---|
| 107 |
|
---|
| 108 | while (fread(&a, 1, 1, inf) != 0)
|
---|
| 109 | {
|
---|
| 110 | count++;
|
---|
| 111 |
|
---|
| 112 | if (a == '"' && quoted == 0)
|
---|
| 113 | {
|
---|
| 114 | quoted = 1;
|
---|
| 115 | fwrite(&a, 1, 1, ouf);
|
---|
| 116 | continue;
|
---|
| 117 | }
|
---|
| 118 |
|
---|
| 119 | if (a == '"' && quoted == 1)
|
---|
| 120 | {
|
---|
| 121 | quoted = 0;
|
---|
| 122 | fwrite(&a, 1, 1, ouf);
|
---|
| 123 | continue;
|
---|
| 124 | }
|
---|
| 125 |
|
---|
| 126 | if (a == '\n' && quoted == 1)
|
---|
| 127 | {
|
---|
| 128 | quoted = 0;
|
---|
| 129 | fwrite(&a, 1, 1, ouf);
|
---|
| 130 | continue;
|
---|
| 131 | }
|
---|
| 132 |
|
---|
| 133 | /* macro start ?
|
---|
| 134 | */
|
---|
| 135 | if (a == '_' && inbracket == 0 && quoted == 0)
|
---|
| 136 | {
|
---|
| 137 | fwrite(&a, 1, 1, ouf);
|
---|
| 138 | b = '\0';
|
---|
| 139 | fread(&b, 1, 1, inf);
|
---|
| 140 | count++;
|
---|
| 141 | fwrite(&b, 1, 1, ouf);
|
---|
| 142 | if (b == '(') inbracket = 1;
|
---|
| 143 | continue;
|
---|
| 144 | }
|
---|
| 145 |
|
---|
| 146 | /* macro end
|
---|
| 147 | */
|
---|
| 148 | if (a == ')' && quoted == 0 && inbracket == 1)
|
---|
| 149 | {
|
---|
| 150 | inbracket = 0;
|
---|
| 151 | /* fprintf(stdout, "\n"); */
|
---|
| 152 | fwrite(&a, 1, 1, ouf);
|
---|
| 153 | continue;
|
---|
| 154 | }
|
---|
| 155 |
|
---|
| 156 | /* in a bracket
|
---|
| 157 | */
|
---|
| 158 | if (inbracket == 1 && quoted == 1)
|
---|
| 159 | {
|
---|
| 160 | /* fprintf(stdout, "%c", a); */
|
---|
| 161 | if (a == '\\')
|
---|
| 162 | {
|
---|
| 163 | fread(&b, 1, 1, inf);
|
---|
| 164 |
|
---|
| 165 | /* escape sequences
|
---|
| 166 | */
|
---|
| 167 | if (b == 't' || b == 'n' || b == 'r' || b == '"')
|
---|
| 168 | {
|
---|
| 169 | fwrite(&a, 1, 1, ouf);
|
---|
| 170 | fwrite(&b, 1, 1, ouf);
|
---|
| 171 | }
|
---|
| 172 |
|
---|
| 173 | else
|
---|
| 174 | {
|
---|
| 175 | a ^= (char) xor_base;
|
---|
| 176 | b ^= (char) xor_base;
|
---|
| 177 | }
|
---|
| 178 | }
|
---|
| 179 | else
|
---|
| 180 | {
|
---|
| 181 | a ^= (char) xor_base;
|
---|
| 182 | fwrite(&a, 1, 1, ouf);
|
---|
| 183 | }
|
---|
| 184 | continue;
|
---|
| 185 | }
|
---|
| 186 |
|
---|
| 187 | fwrite(&a, 1, 1, ouf);
|
---|
| 188 | }
|
---|
| 189 |
|
---|
| 190 | /* fprintf(stderr, "Bytes read: %ld\n", count); */
|
---|
| 191 | /* sprintf(command, "mv tempfile %s", argc[0]); */
|
---|
| 192 | /* system(command); */
|
---|
| 193 |
|
---|
| 194 | fclose(ouf);
|
---|
| 195 | fclose(inf);
|
---|
| 196 | --argv; ++argc;
|
---|
| 197 | }
|
---|
| 198 | return 0;
|
---|
| 199 | }
|
---|
| 200 |
|
---|