engine.cpp.svn-base
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:3k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. /*
  2.  * OpenKore - Padded Packet Emulator.
  3.  * Copyright (c) 2007 kLabMouse, Japplegame, and many other contributors
  4.  *
  5.  * This program is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU General Public License
  7.  * as published by the Free Software Foundation; either version 2
  8.  * of the License, or (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13.  * See http://www.gnu.org/licenses/gpl.html for the full license.
  14.  */
  15. #include <memory.h>
  16. #include <stdlib.h>
  17. #include "engine.h"
  18. #include "block.h"
  19. #include "Algorithms/algorithms.h"
  20. namespace OpenKore {
  21. namespace PaddedPackets {
  22. Engine::Engine()
  23. {
  24. serverMapSync = 0;
  25. clientSync = 0;
  26. memset( pktBuffer, 0, PPENGINE_BUFSIZE * sizeof(byte) );
  27. }
  28. Engine::~Engine()
  29. {
  30. }
  31. void
  32. Engine::addKey(dword data)
  33. {
  34. inputKeys.add( data );
  35. }
  36. void
  37. Engine::setSync(dword sync)
  38. {
  39. clientSync = sync;
  40. }
  41. void
  42. Engine::setMapSync(dword mapSync)
  43. {
  44. serverMapSync = mapSync;
  45. }
  46. void
  47. Engine::setAccId(dword accId)
  48. {
  49. clientAccId = accId;
  50. }
  51. void
  52. Engine::setPacket(byte *packet, dword len)
  53. {
  54. memcpy( pktBuffer, packet, len);
  55. }
  56. unsigned int
  57. Engine::encode(byte *dest, word type)
  58. {
  59. dword offsets[] = { 15, 14, 12, 9, 5, 0 };
  60. dword hashData = createHash(serverMapSync, clientSync, clientAccId, type);
  61. unsigned int packetLength = 0;
  62. int iterations = 5;
  63. // pad_2
  64. for (int iter = 0; iter <= iterations; iter++) {
  65. packetLength = (1 + inputKeys.getSize()) * 4;
  66. dword intCtr = 5;
  67. byte *writePtr = pktBuffer + 4;
  68. for( unsigned int pass = 0; pass < inputKeys.getSize(); pass++ ) {
  69. dword magic = ((intCtr * (dword)pass) + (hashData - offsets[iter])) % 0x27;
  70. packetLength += magic;
  71. intCtr += 3;
  72. writePtr += (4 + magic);
  73. *((dword*)writePtr - 1) = inputKeys[pass] + iter - 5;
  74. }
  75. }
  76. pktBuffer[2] = (byte)packetLength;
  77. *(word*)pktBuffer = (word)type;
  78. // Reset input keys for next generation
  79. inputKeys.reset();
  80. memcpy(dest, pktBuffer, packetLength);
  81. return packetLength;
  82. }
  83. void
  84. Engine::decode(byte *src, unsigned int keys)
  85. {
  86. // Reset output keys
  87. outputKeys.reset();
  88. dword hashData = createHash(serverMapSync, clientSync, clientAccId, *(word*)src);
  89. dword intCtr = 5;
  90. byte *readPtr = src + 4;
  91. for( unsigned int pass = 0; pass < keys; pass++ ) {
  92. dword magic = ((intCtr * (dword)pass) + hashData) % 0x27;
  93. intCtr += 3;
  94. readPtr += (4 + magic);
  95. outputKeys.add( *((dword*)readPtr - 1) );
  96. }
  97. }
  98. dword Engine::getKey(unsigned int index) const
  99. {
  100. return outputKeys[index];
  101. }
  102. } // PaddedPackets
  103. } // OpenKore