Clone of PhatAC @ https://github.com/floaterxk/PhatAC

crcwheel-test.cpp 6.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. #include "StdAfx.h"
  2. extern void *_SubTableEntry3__VTBL[5];
  3. #define SubTableEntry2_seqnum 0
  4. #define SubTableEntry2_encryption_key 4
  5. #define SubTableEntry2_ptr_SubTableEntry3 8
  6. #define SubTableEntry3_ptr_VTBL 0
  7. #define SubTableEntry3_counter 4
  8. #define SubTableEntry3_ptr_xortable 8
  9. #define SubTableEntry3_ptr_unktable 12
  10. #define SubTableEntry3_arg0 16
  11. #define SubTableEntry3_arg1 20
  12. #define SubTableEntry3_arg2 24
  13. #define SubTableEntry4_counter 0
  14. #define SubTableEntry4_ptr_xortable 4
  15. #define SubTableEntry4_ptr_unktable 8
  16. #define SubTableEntry4_arg0 12
  17. #define SubTableEntry4_arg1 16
  18. #define SubTableEntry4_arg2 20
  19. struct __SubTableEntry4
  20. {
  21. __SubTableEntry4();
  22. ~__SubTableEntry4();
  23. DWORD dwCounter;
  24. DWORD *pdwXORTable;
  25. DWORD *pdwUnkTable;
  26. DWORD dwVar1;
  27. DWORD dwVar2;
  28. DWORD dwVar3;
  29. };
  30. __SubTableEntry4::__SubTableEntry4()
  31. {
  32. pdwXORTable = new DWORD[256];
  33. pdwUnkTable = new DWORD[256];
  34. }
  35. __SubTableEntry4::~__SubTableEntry4()
  36. {
  37. delete[] pdwXORTable;
  38. delete[] pdwUnkTable;
  39. }
  40. struct __SubTableEntry3
  41. {
  42. __SubTableEntry3();
  43. ~__SubTableEntry3();
  44. void Fill_Out_Tables_Part2(__SubTableEntry4 *pTable4, BOOL bUseGivenKeys);
  45. void Fill_Out_Tables_Part(DWORD dwArg0, DWORD dwArg4, DWORD Arg8, DWORD *pdwInitValues);
  46. void InitStage(__SubTableEntry4 *pTable4);
  47. void XorLoop(DWORD *pdwValue1, DWORD *pdwValue2, DWORD *pdwValue3, DWORD *pdwValue4,
  48. DWORD *pdwValue5, DWORD *pdwValue6, DWORD *pdwValue7, DWORD *pdwValue8);
  49. __SubTableEntry4 *pMyTable4;
  50. DWORD dwCounter;
  51. DWORD *pdwXORTable;
  52. DWORD *pdwUnkTable;
  53. DWORD dwArg1;
  54. DWORD dwArg2;
  55. DWORD dwArg3;
  56. };
  57. void __SubTableEntry3::Fill_Out_Tables_Part(DWORD dwArg0, DWORD dwArg4, DWORD dwArg8, DWORD *pdwInitValues)
  58. {
  59. for (DWORD i = 0; i < 256; i++)
  60. {
  61. if (pdwInitValues)
  62. pdwXORTable[i] = pdwInitValues[i];
  63. else
  64. pdwXORTable[i] = 0;
  65. }
  66. dwArg1 = dwArg0;
  67. dwArg2 = dwArg4;
  68. dwArg3 = dwArg8;
  69. Fill_Out_Tables_Part2(pMyTable4, TRUE);
  70. }
  71. void __SubTableEntry3::Fill_Out_Tables_Part2(__SubTableEntry4* pTable4, BOOL bUseGivenKeys)
  72. {
  73. DWORD dwValue[8];
  74. dwValue[0] = 0x9E3779B9;
  75. dwValue[1] = 0x9E3779B9;
  76. dwValue[2] = 0x9E3779B9;
  77. dwValue[3] = 0x9E3779B9;
  78. dwValue[4] = 0x9E3779B9;
  79. dwValue[5] = 0x9E3779B9;
  80. dwValue[6] = 0x9E3779B9;
  81. dwValue[7] = 0x9E3779B9;
  82. DWORD *pdwSubXORTable = pTable4->pdwXORTable;
  83. DWORD *pdwSubUnkTable = pTable4->pdwUnkTable;
  84. if (!bUseGivenKeys)
  85. {
  86. pTable4->dwVar1 = 0;
  87. pTable4->dwVar2 = 0;
  88. pTable4->dwVar3 = 0;
  89. }
  90. for (DWORD i = 0; i < 4; i++)
  91. {
  92. XorLoop(&dwValue[7], &dwValue[6], &dwValue[5], &dwValue[4],
  93. &dwValue[3], &dwValue[2], &dwValue[1], &dwValue[0]);
  94. }
  95. if (bUseGivenKeys)
  96. {
  97. for (DWORD i = 0; i < 256; i += 8)
  98. {
  99. dwValue[7] += pdwSubXORTable[i + 0];
  100. dwValue[6] += pdwSubXORTable[i + 1];
  101. dwValue[5] += pdwSubXORTable[i + 2];
  102. dwValue[4] += pdwSubXORTable[i + 3];
  103. dwValue[3] += pdwSubXORTable[i + 4];
  104. dwValue[2] += pdwSubXORTable[i + 5];
  105. dwValue[1] += pdwSubXORTable[i + 6];
  106. dwValue[0] += pdwSubXORTable[i + 7];
  107. XorLoop(&dwValue[7], &dwValue[6], &dwValue[5], &dwValue[4],
  108. &dwValue[3], &dwValue[2], &dwValue[1], &dwValue[0]);
  109. pdwSubUnkTable[i + 0] = dwValue[7];
  110. pdwSubUnkTable[i + 1] = dwValue[6];
  111. pdwSubUnkTable[i + 2] = dwValue[5];
  112. pdwSubUnkTable[i + 3] = dwValue[4];
  113. pdwSubUnkTable[i + 4] = dwValue[3];
  114. pdwSubUnkTable[i + 5] = dwValue[2];
  115. pdwSubUnkTable[i + 6] = dwValue[1];
  116. pdwSubUnkTable[i + 7] = dwValue[0];
  117. }
  118. for (DWORD i = 0; i < 256; i += 8)
  119. {
  120. dwValue[7] += pdwSubUnkTable[i + 0];
  121. dwValue[6] += pdwSubUnkTable[i + 1];
  122. dwValue[5] += pdwSubUnkTable[i + 2];
  123. dwValue[4] += pdwSubUnkTable[i + 3];
  124. dwValue[3] += pdwSubUnkTable[i + 4];
  125. dwValue[2] += pdwSubUnkTable[i + 5];
  126. dwValue[1] += pdwSubUnkTable[i + 6];
  127. dwValue[0] += pdwSubUnkTable[i + 7];
  128. XorLoop(&dwValue[7], &dwValue[6], &dwValue[5], &dwValue[4],
  129. &dwValue[3], &dwValue[2], &dwValue[1], &dwValue[0]);
  130. pdwSubUnkTable[i + 0] = dwValue[7];
  131. pdwSubUnkTable[i + 1] = dwValue[6];
  132. pdwSubUnkTable[i + 2] = dwValue[5];
  133. pdwSubUnkTable[i + 3] = dwValue[4];
  134. pdwSubUnkTable[i + 4] = dwValue[3];
  135. pdwSubUnkTable[i + 5] = dwValue[2];
  136. pdwSubUnkTable[i + 6] = dwValue[1];
  137. pdwSubUnkTable[i + 7] = dwValue[0];
  138. }
  139. }
  140. else
  141. {
  142. XorLoop(&dwValue[7], &dwValue[6], &dwValue[5], &dwValue[4],
  143. &dwValue[3], &dwValue[2], &dwValue[1], &dwValue[0]);
  144. pdwSubUnkTable[4] = dwValue[7];
  145. pdwSubUnkTable[5] = dwValue[6];
  146. pdwSubUnkTable[6] = dwValue[5];
  147. pdwSubUnkTable[7] = dwValue[4];
  148. pdwSubUnkTable[8] = dwValue[3];
  149. pdwSubUnkTable[9] = dwValue[2];
  150. pdwSubUnkTable[10] = dwValue[1];
  151. pdwSubUnkTable[11] = dwValue[0];
  152. }
  153. InitStage(pTable4);
  154. }
  155. void __SubTableEntry3::XorLoop(DWORD *pdwValue0, DWORD *pdwValue4, DWORD *pdwValue8, DWORD *pdwValueC, DWORD *pdwValue10, DWORD *pdwValue14, DWORD *pdwValue18, DWORD *pdwValue1C)
  156. {
  157. (*pdwValue0) ^= (*pdwValue4) << 11;
  158. (*pdwValueC) += (*pdwValue0);
  159. (*pdwValue4) += (*pdwValue8);
  160. (*pdwValue4) ^= (*pdwValue8) >> 2;
  161. (*pdwValue10) += (*pdwValue4);
  162. (*pdwValue8) += (*pdwValueC);
  163. (*pdwValue8) ^= (*pdwValueC) << 8;
  164. (*pdwValue14) += (*pdwValue8);
  165. (*pdwValueC) += (*pdwValue10);
  166. (*pdwValueC) ^= (*pdwValue10) >> 10;
  167. (*pdwValue18) += (*pdwValueC);
  168. (*pdwValue10) += (*pdwValue14);
  169. (*pdwValue10) ^= (*pdwValue14) << 10;
  170. (*pdwValue1C) += (*pdwValue10);
  171. (*pdwValue14) += (*pdwValue18);
  172. (*pdwValue14) ^= (*pdwValue18) >> 4;
  173. (*pdwValue0) += (*pdwValue14);
  174. (*pdwValue18) += (*pdwValue1C);
  175. (*pdwValue18) ^= (*pdwValue1C) << 8;
  176. (*pdwValue4) += (*pdwValue18);
  177. (*pdwValue1C) += (*pdwValue0);
  178. (*pdwValue1C) ^= (*pdwValue0) >> 9;
  179. (*pdwValue8) += (*pdwValue1C);
  180. (*pdwValue0) += (*pdwValue4);
  181. }
  182. void __SubTableEntry3::InitStage(__SubTableEntry4 *pTable4)
  183. {
  184. DWORD *pdwSubUnkTable = pTable4->pdwUnkTable;
  185. DWORD *pdwSubXORTable = pTable4->pdwXORTable;
  186. DWORD dwVar8 = pTable4->dwVar2 + (++pTable4->dwVar3);
  187. DWORD *pdwBottom = pdwSubUnkTable;
  188. DWORD *pdwTop = &pdwSubUnkTable[0x80];
  189. if (pdwTop >= pdwBottom)
  190. {
  191. DWORD dwESI = *pdwBottom;
  192. DWORD dwEDI;
  193. dwEDI = pTable4->dwVar1 << 0x0D;
  194. dwEDI ^= pTable4->dwVar1;
  195. DWORD dwEBP = dwVar8;
  196. DWORD dwVarC = dwESI;
  197. dwESI &= 0x3FC;
  198. dwESI = *((DWORD *)(dwESI + (BYTE *)pdwSubUnkTable));
  199. }
  200. }