makepack.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5. #include "standalone.h"
  6. #include "md5/global.h"
  7. #include "md5/md5.h"
  8. #include "rijndael.h"
  9. char packname[512]="";
  10. char packpass[512]="";
  11. char bdpass[512]="";
  12. char netkey[512]="";
  13. char owners[8192]="";
  14. unsigned char key[20];
  15. void fix_md5(char * s) {
  16. int i;
  17. for (i=0;i<16;i++)
  18. if (!s[i])
  19. s[i]=1;
  20. s[16]=0;
  21. }
  22. int fixfile (char * fname, int writeall) {
  23. FILE * f;
  24. size_t size;
  25. char * buf, *p, *p2, *np;
  26. unsigned char bp[20], ln[2048];
  27. MD5_CTX ctx;
  28. f=fopen(fname, "r+");
  29. if (!f) {
  30. printf("Can't open %s for editing\n", fname);
  31. return 0;
  32. }
  33. fseek(f, 0, SEEK_END);
  34. size=ftell(f);
  35. buf = malloc(size);
  36. fseek(f, 0, SEEK_SET);
  37. if (fread(buf, 1, size, f) != size) {
  38. fclose(f);
  39. printf("Can't read %s\n", fname);
  40. return 0;
  41. }
  42. p2 = buf;
  43. while (p2 < (buf + size - 4)) {
  44. if (!strncmp(p2, "AAAAAAAA", 8))
  45. break;
  46. p2 += 4;
  47. }
  48. if (p2 >= (buf + size - 4)) {
  49. fclose(f);
  50. printf("Can't figure out where to modify %s\n", fname);
  51. return 0;
  52. }
  53. memset(p2, 0, 16);
  54. p2 += 16;
  55. strcpy(p2, packname);
  56. p2 += 128;
  57. if (writeall) {
  58. p=encrypt_string(key, "pack.def");
  59. sprintf(p2, "%s\n", p);
  60. p2 += strlen(p2);
  61. sprintf(ln, "pn=%s", packname);
  62. p=encrypt_string(key, ln);
  63. sprintf(p2, "%s\n", p);
  64. p2 += strlen(p2);
  65. MD5Init(&ctx);
  66. MD5Update(&ctx, bdpass, strlen(bdpass));
  67. MD5Final(bp, &ctx);
  68. fix_md5(bp);
  69. sprintf(ln, "bp=%s", bp);
  70. p=encrypt_string(key, ln);
  71. sprintf(p2, "%s\n", p);
  72. p2 += strlen(p2);
  73. sprintf(ln, "nk=%s", netkey);
  74. p=encrypt_string(key, ln);
  75. sprintf(p2, "%s\n", p);
  76. p2 += strlen(p2);
  77. p=owners;
  78. while (p) {
  79. np=strchr(p, '\n');
  80. if (np)
  81. *np++=0;
  82. sprintf(ln, "o=%s", p);
  83. p=encrypt_string(key, ln);
  84. sprintf(p2, "%s\n", p);
  85. p2 += strlen(p2);
  86. p=np;
  87. }
  88. } else {
  89. memset(ln, 0, sizeof(ln));
  90. strcpy(ln, netkey);
  91. p = encrypt_string(key, ln);
  92. sprintf(p2, "%s", p);
  93. }
  94. fseek(f, 0, SEEK_SET);
  95. if (!fwrite(buf, 1, size, f)==size) {
  96. printf("Error writing new %s\n", fname);
  97. return 0;
  98. }
  99. printf("Written %s\n", fname);
  100. free(buf);
  101. fclose(f);
  102. return 1;
  103. };
  104. int main (int argc, char * argv[]) {
  105. FILE * f;
  106. unsigned char *p, ln[2048];
  107. MD5_CTX ctx;
  108. if (argc!=2) {
  109. printf("Usage: %s configfile\n", argv[0]);
  110. exit(0);
  111. }
  112. f=fopen(argv[1], "r");
  113. while (!feof(f)) {
  114. fgets(ln, sizeof(ln), f);
  115. if (strchr(ln, '\n'))
  116. * (char *) strchr(ln, '\n') = 0;
  117. if (ln[0]) {
  118. p=strchr(ln, ' ');
  119. while (p && (*p==' '))
  120. *p++ = 0;
  121. if (p) {
  122. if (!strcmp(ln, "pass"))
  123. strcpy(packpass, p);
  124. else if (!strcmp(ln, "bdpass"))
  125. strcpy(bdpass, p);
  126. else if (!strcmp(ln, "packname"))
  127. strcpy(packname, p);
  128. else if (!strcmp(ln, "netkey"))
  129. strcpy(netkey, p);
  130. else if (!strcmp(ln, "owner")) {
  131. strcat(owners, p);
  132. strcat(owners, "\n");
  133. } else
  134. printf("Invalid line: %s %s\n", ln, p);
  135. } else {
  136. printf("Invalid line: %s\n", ln);
  137. }
  138. }
  139. }
  140. fclose(f);
  141. if (!packname[0]) {
  142. printf("No packname\n");
  143. return 0;
  144. }
  145. if (!packpass[0]) {
  146. printf("No packpass\n");
  147. return 0;
  148. }
  149. if (!bdpass[0]) {
  150. printf("No bdpass\n");
  151. return 0;
  152. }
  153. if (!netkey[0]) {
  154. printf("No netkey\n");
  155. return 0;
  156. }
  157. if (!owners[0]) {
  158. printf("No owners\n");
  159. return 0;
  160. }
  161. MD5Init(&ctx);
  162. MD5Update(&ctx, packpass, strlen(packpass));
  163. MD5Final(key, &ctx);
  164. fix_md5(key);
  165. fixfile("makebot", 1);
  166. fixfile("readlog", 0);
  167. return 0;
  168. return 0;
  169. }