fork(17) download
  1. #include <stdio.h>
  2. #include <memory.h>
  3.  
  4. int myrand(int *seed){
  5. int tmp;
  6. tmp = ((*seed * 257 >> 8) + *seed * 97) + 23 ^ -1496474763;
  7. *seed = tmp >> 16 & 65535 | tmp << 16;
  8. return *seed & 32767;
  9. }
  10.  
  11. // 0 : success!
  12. // -2147483647 : wrong header
  13. // -2147483646 : wrong checksum
  14. int decrypt(char *a) {
  15. int r, counter, ret;
  16. char *a_header, *a_body;
  17. int flags[64], seed, i, s;
  18. char *target;
  19. int check_sum,check_xor;
  20. ret = -2147483647;
  21. a_header = a;
  22. a_body = a + 16;
  23. if (strcmp(a_header + 0, "BSE 1.0")) return ret;
  24. if (*(short *)(a_header + 8) != 256) return ret;
  25. memset(flags, 0, 64 * 4);
  26. seed = *(long *)(a_header + 12);
  27. counter = 0;
  28. do {
  29. r = myrand(&seed);
  30. i = r & 64 - 1;
  31. while (flags[i]){
  32. i = i + 1 & 64 - 1;
  33. }
  34. r = myrand(&seed);
  35. s = r & 7;
  36. target = (a_body + 0) + i;
  37. r = myrand(&seed);
  38. switch(r & 1){
  39. case 0:
  40. r = myrand(&seed);
  41. r = (*target & 255) - r & 255;
  42. *target = r >> s | r << 8 - s; // rotate shift right
  43. break;
  44. case 1:
  45. r = myrand(&seed);
  46. r = (*target & 255) - r & 255;
  47. *target = r << s | r >> 8 - s; // rotate shift left
  48. break;
  49. }
  50. flags[i] = 1; // done
  51. counter = counter + 1;
  52. } while (counter < 64);
  53. check_sum = 0;
  54. check_xor = 0;
  55. target = a_body + 0;
  56. counter = 0;
  57. do {
  58. check_sum = check_sum + (target[counter] & 255);
  59. check_xor = check_xor ^ (target[counter] & 255);
  60. counter = counter + 1;
  61. } while (counter < 64);
  62. ret =
  63. (a_header[10] & 255) == (check_sum & 255) &&
  64. (a_header[11] & 255) == (check_xor & 255) ?
  65. 0 : -2147483646;
  66. return ret;
  67. }
  68.  
  69. int main(void) {
  70. int ret, i;
  71. unsigned char a[] = {
  72. 0x42, 0x53, 0x45, 0x20, 0x31, 0x2e, 0x30, 0x00, 0x00, 0x01, 0xe0, 0xda,
  73. 0xc9, 0xa5, 0x6d, 0x70, 0x20, 0xed, 0x53, 0x38, 0x7d, 0x95, 0xe3, 0x03,
  74. 0x2c, 0xbe, 0x10, 0xd9, 0x42, 0x70, 0x09, 0x16, 0xa6, 0x77, 0xcd, 0x8f,
  75. 0x80, 0x18, 0xdc, 0x3b, 0xd8, 0xf4, 0x22, 0x9e, 0xa5, 0x87, 0x03, 0x18,
  76. 0xac, 0x3c, 0x71, 0x1f, 0xa0, 0xd5, 0x1f, 0x68, 0x1e, 0x06, 0x95, 0x46,
  77. 0x4e, 0xc0, 0x18, 0x17, 0x53, 0x78, 0xd7, 0x3a, 0x53, 0x70, 0x9b, 0x52,
  78. 0x82, 0x81, 0xe5, 0x01, 0xe9, 0xa8, 0xe0, 0x79, 0xce, 0x43, 0x74, 0xa4,
  79. 0x01, 0xce, 0x15, 0x91, 0x4e, 0x20, 0xd5, 0xa3, 0x7c, 0x83, 0x09, 0x1a,
  80. };
  81. ret = decrypt((char *)a);
  82. if (ret == 0) {
  83. for (i = 0x10; i < 0x80; ++i) printf("%02x ", a[i]);
  84. printf("\n", ret);
  85. } else {
  86. printf("%08x\n", ret);
  87. }
  88. return 0;
  89. }
  90.  
Success #stdin #stdout 0s 2052KB
stdin
Standard input is empty
stdout
43 6f 6d 70 72 65 73 73 65 64 42 47 5f 5f 5f 00 00 05 d0 02 18 00 00 00 00 00 00 00 00 00 00 00 52 46 24 00 ed 2b 9f 02 5b 01 00 00 1d dd 01 00 4c f0 27 e2 3f 77 22 3d 7f a3 41 fd dd ac c1 66 ce 43 74 a4 01 ce 15 91 4e 20 d5 a3 7c 83 09 1a 01 00 00 00 a4 2c c1 bf 10 2c c1 bf 00 a0 71 b7 00 00 00 00 00 00 00 00 00 00 00 00 23 57 5c b7