imthe666st

NtrClient.cs

Mar 24th, 2017
292
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.27 KB | None | 0 0
  1. // With <3 from Phecda
  2.  
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Net.Sockets;
  7. using System.Text;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10.  
  11. namespace NtrSharp
  12. {
  13.     public class NtrClient
  14.     {
  15.         //
  16.         public String ServerHost;
  17.         public int ServerPort;  // Should be 8000
  18.         public Boolean HeartbeatSendable;
  19.  
  20.         public int Progress { get; private set; }
  21.         public Boolean IsConnected { get { return Tcp?.Connected ?? false; } }
  22.  
  23.         private UInt32 CurrentSequence;
  24.         private UInt32 LastReadMemorySequence;
  25.         private Object SyncLock = new object();
  26.  
  27.         private TcpClient Tcp;
  28.         private Thread PacketRecvThread;
  29.         private Thread HeartbeatThread;
  30.         private NetworkStream NetStream;
  31.  
  32.         public byte[] ReadMemory;
  33.  
  34.         public NtrClient(String ServerHost)
  35.         {
  36.             SetServer(ServerHost, 8000);
  37.         }
  38.  
  39.         public void SetServer(String ServerHost, int ServerPort)
  40.         {
  41.             this.ServerHost = ServerHost;
  42.             this.ServerPort = ServerPort;
  43.         }
  44.  
  45.         public void ConnectToServer()
  46.         {
  47.             try
  48.             {
  49.                 if (Tcp != null) Disconnect();
  50.                 Tcp = new TcpClient();
  51.                 Tcp.NoDelay = true;
  52.                 Tcp.Connect(ServerHost, ServerPort);
  53.  
  54.                 CurrentSequence = 0;
  55.                 NetStream = Tcp.GetStream();
  56.                 HeartbeatSendable = true;
  57.  
  58.                 PacketRecvThread = new Thread(new ThreadStart(PacketRecvThreadStart));
  59.                 PacketRecvThread.Start();
  60.  
  61.                 HeartbeatThread = new Thread(new ThreadStart(HeartbeatThreadStart));
  62.                 HeartbeatThread.Start();
  63.  
  64.                 Console.WriteLine("Server Connected");
  65.             }
  66.             catch (Exception)
  67.             {
  68.                 Console.WriteLine("Failed to connect");
  69.                 //throw;
  70.             }
  71.  
  72.         }
  73.  
  74.         public void Disconnect(Boolean WaitPacketThread = true)
  75.         {
  76.             try
  77.             {
  78.                 Tcp?.Close();
  79.                 if (WaitPacketThread)
  80.                 {
  81.                     PacketRecvThread?.Join();
  82.                 }
  83.             }
  84.             finally
  85.             {
  86.                 Tcp = null;
  87.             }
  88.         }
  89.  
  90.         private void PacketRecvThreadStart()
  91.         {
  92.             byte[] Buffer = new byte[84];
  93.             UInt32[] Args = new UInt32[16];
  94.  
  95.             int Ret;
  96.  
  97.             NetworkStream Stream = NetStream;
  98.  
  99.             while (IsConnected)
  100.             {
  101.                 try
  102.                 {
  103.                     Ret = ReadNetworkStream(Stream, Buffer, Buffer.Length);
  104.                     if (Ret == 0) break; // Unable to read network stream
  105.  
  106.                     int t = 0;
  107.                     UInt32 Magic = BitConverter.ToUInt32(Buffer, t);
  108.                     t += 4;
  109.                     UInt32 Sequence = BitConverter.ToUInt32(Buffer, t);
  110.                     t += 4;
  111.                     UInt32 Type = BitConverter.ToUInt32(Buffer, t);
  112.                     t += 4;
  113.                     UInt32 Command = BitConverter.ToUInt32(Buffer, t);
  114.  
  115.                     // Get Args
  116.                     for (int i = 0; i < Args.Length; i++)
  117.                     {
  118.                         t += 4;
  119.                         Args[i] = BitConverter.ToUInt32(Buffer, t);
  120.                     }
  121.                     t += 4;
  122.                     UInt32 DataLength = BitConverter.ToUInt32(Buffer, t);
  123.  
  124.                     if (Command != 0) Console.WriteLine("Packet: CMD = {0}, DataLen = {1}", Command, DataLength);
  125.  
  126.                     if (Magic != 0x12345678)
  127.                     {
  128.                         Console.WriteLine("Broken Protocol: Magic = {0:X}, Seq = {1}", Magic, Sequence);
  129.                         break;
  130.                     }
  131.  
  132.                     if (Command == 0)
  133.                     {
  134.                         if (DataLength != 0)
  135.                         {
  136.                             byte[] DataBuffer = new byte[DataLength];
  137.                             ReadNetworkStream(Stream, DataBuffer, DataBuffer.Length);
  138.                             Console.WriteLine(Encoding.UTF8.GetString(DataBuffer));
  139.                         }
  140.  
  141.                         lock (SyncLock)
  142.                         {
  143.                             HeartbeatSendable = true;
  144.                         }
  145.                     }
  146.                     else if (DataLength != 0)
  147.                     {
  148.                         byte[] DataBuffer = new byte[DataLength];
  149.                         ReadNetworkStream(Stream, DataBuffer, DataBuffer.Length);
  150.                         HandlePacket(Command, Sequence, DataBuffer);
  151.                     }
  152.  
  153.                 }
  154.                 catch (Exception ex)
  155.                 {
  156.                     Console.WriteLine(ex.Message);
  157.                     break;
  158.                 }
  159.             }
  160.  
  161.             Console.WriteLine("Server Disconnected.");
  162.             Disconnect(false);
  163.         }
  164.  
  165.         private void HeartbeatThreadStart()
  166.         {
  167.             while (IsConnected)
  168.             {
  169.                 SendHeartbeatPacket();
  170.                 //Console.WriteLine("Trying to send HeartbeatPacket");
  171.                 Thread.Sleep(1000);
  172.             }
  173.         }
  174.  
  175.         private int ReadNetworkStream(NetworkStream Stream, byte[] Buffer, int Length)
  176.         {
  177.             int Index = 0;
  178.             Boolean UseProgress = (Length > 0x100000);
  179.  
  180.             do
  181.             {
  182.                 if (UseProgress) Progress = (int)(((double)(Index) / Length) * 100);
  183.  
  184.                 int Len = Stream.Read(Buffer, Index, Length - Index);
  185.                 if (Len == 0) return 0;
  186.  
  187.                 Index += Len;
  188.             } while (Index < Length);
  189.  
  190.             return Length;
  191.         }
  192.  
  193.         private void HandlePacket(UInt32 Command, UInt32 Sequence, byte[] DataBuffer)
  194.         {
  195.             if (Command == 9)
  196.             {
  197.                 HandleReadMemory(Sequence, DataBuffer);
  198.             }
  199.         }
  200.  
  201.         /* MODIFIED */
  202.         private void HandleReadMemory(UInt32 Sequence, byte[] DataBuffer)
  203.         {
  204.             if (Sequence != LastReadMemorySequence)
  205.             {
  206.                 Console.WriteLine("{0} != {1} ignored", Sequence, LastReadMemorySequence);
  207.                 return;
  208.             }
  209.  
  210.             LastReadMemorySequence = 0;
  211.             ReadMemory = DataBuffer;
  212.         }
  213.  
  214.         // Send Packets
  215.  
  216.         public void SendPacket(UInt32 Type, UInt32 Command, UInt32[] Args, UInt32 DataLen)
  217.         {
  218.             int t = 0;
  219.             CurrentSequence += 1000;
  220.             byte[] Buffer = new byte[84];
  221.             BitConverter.GetBytes(0x12345678).CopyTo(Buffer, t);
  222.             t += 4;
  223.             BitConverter.GetBytes(CurrentSequence).CopyTo(Buffer, t);
  224.             t += 4;
  225.             BitConverter.GetBytes(Type).CopyTo(Buffer, t);
  226.             t += 4;
  227.             BitConverter.GetBytes(Command).CopyTo(Buffer, t);
  228.             for (int i = 0; i < 16; i++)
  229.             {
  230.                 t += 4;
  231.                 if (Args?.Length > i) BitConverter.GetBytes(Args[i]).CopyTo(Buffer, t);
  232.                 else BitConverter.GetBytes(0).CopyTo(Buffer, t); // remove this? Test it later TODO
  233.             }
  234.             t += 4;
  235.             BitConverter.GetBytes(DataLen).CopyTo(Buffer, t);
  236.             NetStream.Write(Buffer, 0, Buffer.Length);
  237.         }
  238.  
  239.         public void SendEmptyPacket(UInt32 Command, params UInt32[] Args)
  240.         {
  241.             SendPacket(0, Command, Args, 0);
  242.         }
  243.  
  244.         // Sending Packets
  245.  
  246.         public void SendHeartbeatPacket()
  247.         {
  248.             if (Tcp != null)
  249.             {
  250.                 lock (SyncLock)
  251.                 {
  252.                     if (HeartbeatSendable)
  253.                     {
  254.                         HeartbeatSendable = false;
  255.                         SendPacket(0, 0, null, 0);
  256.                     }
  257.                 }
  258.             }
  259.         }
  260.  
  261.         public void SendHelloPacket()
  262.         {
  263.             SendPacket(0, 3, null, 0);
  264.         }
  265.  
  266.         public void SendReloadPacket()
  267.         {
  268.             SendPacket(0, 4, null, 0);
  269.         }
  270.  
  271.         public void SendProcessPacket()
  272.         {
  273.             SendEmptyPacket(5);
  274.         }
  275.  
  276.         public void SendReadMemPacket(UInt32 Address, UInt32 Size, UInt32 Pid)
  277.         {
  278.             SendEmptyPacket(9, Pid, Address, Size);
  279.             LastReadMemorySequence = CurrentSequence;
  280.         }
  281.  
  282.  
  283.     }
  284. }
Advertisement
Add Comment
Please, Sign In to add comment