Guest User

Untitled

a guest
May 20th, 2018
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.83 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "nsou.h"
  3.  
  4. #define addpacket(id, size, desc, ...) netencAddPacket(id, size, desc)
  5.  
  6. struct packet_data
  7. {
  8.     int size;
  9.     char *desc;
  10. };
  11.  
  12. #define RFIFOP(pos) (rdata + rdata_pos + (pos))
  13. #define WFIFOP(pos) (wdata + wdata_size + (pos))
  14.  
  15. #define RFIFOB(pos) (*(unsigned char*)RFIFOP(pos))
  16. #define WFIFOB(pos) (*(unsigned char*)WFIFOP(pos))
  17. #define RFIFOW(pos) (*(unsigned short*)RFIFOP(pos))
  18. #define WFIFOW(pos) (*(unsigned short*)WFIFOP(pos))
  19. #define RFIFOL(pos) (*(unsigned long*)RFIFOP(pos))
  20. #define WFIFOL(pos) (*(unsigned long*)WFIFOP(pos))
  21. #define RFIFOQ(pos) (*(unsigned long long*)RFIFOP(pos))
  22. #define WFIFOQ(pos) (*(unsigned long long*)WFIFOP(pos))
  23.  
  24. #define RFIFOSPACE() (max_rdata - rdata_size)
  25. #define RFIFOREST()  (rdata_size - rdata_pos)
  26. #define RFIFOSKIP(size) rdata_pos += size
  27.  
  28. typedef int (PASCAL *ConnectDelegate)(SOCKET s, const struct sockaddr FAR * name, int namelen);
  29. typedef int (PASCAL *SendDelegate)(SOCKET s, char FAR * buf, int len, int flags);
  30. typedef int (PASCAL *RecvDelegate)(SOCKET s, char FAR * buf, int len, int flags);
  31.  
  32. static ConnectDelegate origConnect;
  33. static SendDelegate origSend;
  34. static RecvDelegate origRecv;
  35.  
  36. static unsigned char rdata[16 * 1024];
  37. static unsigned char wdata[16 * 1024];
  38. static size_t max_rdata, max_wdata;
  39. static size_t rdata_size, wdata_size;
  40. static size_t rdata_pos;
  41. static unsigned short last_pack;
  42. static unsigned int my_acc_id;
  43. static unsigned int sendonnext;
  44.  
  45. static struct packet_data packet_len[0x1000];
  46.  
  47. static bool netencProcessPack(unsigned short cmd, int size)
  48. {
  49.     switch(cmd)
  50.     {
  51.     case 0x69:
  52.             my_acc_id = RFIFOL(8);
  53.             break;
  54.     }
  55.  
  56.     return true;
  57. }
  58.  
  59. static int PASCAL newSend(SOCKET s, char FAR * buf, int len, int flags)
  60. {
  61.     return origSend(s, buf, len, flags);
  62. }
  63.  
  64. static int PASCAL newRecv(SOCKET s, char FAR * buf, int readsize, int flags)
  65. {
  66.     if (sendonnext > 0)
  67.     {
  68.         int len = sendonnext;
  69.         memcpy(buf, rdata, sendonnext);
  70.         RFIFOSKIP(sendonnext);
  71.         sendonnext = 0;
  72.         return len;
  73.     }
  74.  
  75.     int len = origRecv(s, (char *)rdata + rdata_size, (int)RFIFOSPACE(), 0);
  76.     int tosend = 0;
  77.  
  78.     if (len <= 0)
  79.         return len;
  80.    
  81.     rdata_size += len;
  82.  
  83.     while (RFIFOREST() >= 2)
  84.     {
  85.         unsigned short cmd = RFIFOW(0);
  86.        
  87.         if (RFIFOL(0) == my_acc_id)
  88.         {
  89.             RFIFOSKIP(4);
  90.             tosend += 4;
  91.             continue;
  92.         }
  93.  
  94.         if (cmd >= 0x1000)
  95.             return 0;
  96.  
  97.         int size = packet_len[cmd].size;
  98.  
  99.         if (size == -1)
  100.         {
  101.             if (RFIFOREST() < 4)
  102.                 break;
  103.             else
  104.                 size = RFIFOW(2);
  105.         }
  106.  
  107.         if (RFIFOREST() < size)
  108.             break;
  109.  
  110.         if (netencProcessPack(cmd, size))
  111.         {
  112.             RFIFOSKIP(size);
  113.             tosend += size;
  114.         }
  115.         else
  116.         {
  117.             int toMove = RFIFOREST() - size;
  118.  
  119.             memmove(RFIFOP(0), RFIFOP(size), size);
  120.  
  121.             rdata_size -= size;
  122.         }
  123.  
  124.         last_pack = cmd;
  125.     }
  126.  
  127.     if (tosend > readsize)
  128.     {
  129.         sendonnext = tosend - readsize;
  130.         tosend = readsize;
  131.         rdata_pos -= sendonnext;
  132.     }
  133.  
  134.     memcpy(buf, rdata, tosend);
  135.  
  136.     if(rdata_size == rdata_pos)
  137.     {
  138.         rdata_size = rdata_pos = 0;
  139.     }
  140.     else
  141.     {
  142.         rdata_size -= rdata_pos;
  143.         memmove(rdata, rdata + rdata_pos, rdata_size);
  144.         rdata_pos = 0;
  145.     }
  146.  
  147.     return tosend;
  148. }
  149.  
  150. static void netencAddPacket(unsigned short id, int size, char *desc)
  151. {
  152.     if (id >= 0x1000)
  153.         return;
  154.  
  155.     packet_len[id].size = size;
  156.     packet_len[id].desc = desc;
  157. }
  158.  
  159. static int PASCAL newConnect(SOCKET s, const struct sockaddr FAR * name, int namelen)
  160. {
  161.     return origConnect(s, name, namelen);
  162. }
  163.  
  164. void netencInit()
  165. {
  166. #include "packetdb.ipp"
  167.  
  168.     max_rdata = 16 * 1024;
  169.     max_wdata = 16 * 1024;
  170.  
  171.     rdata_size = wdata_size = 0;
  172.     rdata_pos = 0;
  173.  
  174.     origConnect = Hooks.createHook<ConnectDelegate>((ConnectDelegate)connect, (ConnectDelegate)newConnect);
  175.     origSend = Hooks.createHook<SendDelegate>((SendDelegate)send, (SendDelegate)newSend);
  176.     origRecv = Hooks.createHook<RecvDelegate>((RecvDelegate)recv, (RecvDelegate)newRecv);
  177. }
Add Comment
Please, Sign In to add comment